1. 程式人生 > >Java 陣列和連結串列的區別以及使用場景

Java 陣列和連結串列的區別以及使用場景

陣列:是將元素在記憶體中連續儲存的;它的優點:因為資料是連續儲存的,記憶體地址連續,所以在查詢資料的時候效率比較高;它的缺點:在儲存之前,我們需要申請一塊連續的記憶體空間,並且在編譯的時候就必須確定好它的空間的大小。在執行的時候空間的大小是無法隨著你的需要進行增加和減少而改變的,當資料兩比較大的時候,有可能會出現越界的情況,資料比較小的時候,又有可能會浪費掉記憶體空間。在改變資料個數時,增加、插入、刪除資料效率比較低。

連結串列:是動態申請記憶體空間,不需要像陣列需要提前申請好記憶體的大小,連結串列只需在用的時候申請就可以,根據需要來動態申請或者刪除記憶體空間,對於資料增加和刪除以及插入比陣列靈活。還有就是連結串列中資料在記憶體中可以在任意的位置,通過應用來關聯資料(就是通過存在元素的指標來聯絡)。

陣列和連結串列就拿增加資料來說,陣列中增加一個元素,需要移動大量的元素,在記憶體中空出一個元素的空間,然後將增加的元素放到空出的空間中;而連結串列就是將連結串列中最後的一個元素的指標指向新增的元素,在指出新增元素是尾元素就好了。

陣列應用場景:

1、資料比較少;

2、經常做的運算是按序號訪問資料元素;

3、陣列更容易實現,任何高階語言都支援;

4、構建的線性表較穩定。

/**
 * 自定義長度可變的陣列[存放字串]
 * @author Administrator
 */

public class my {

// 定義一個長度為0的初始陣列
private String src = new String[0];

/**
 * 存放資料
 * @param s 要存放的資料
 */
public void add(String s) {
// 定義一個新陣列長度是源陣列長度+1
String dest = new String[src.length + 1];
// 將原陣列的資料拷貝到新陣列中
System.arraycopy(src, 0, dest, 0, src.length);
// 將新資料放到新陣列的最後一個位置
dest[dest.length - 1] = s;
// 將原陣列指向新陣列
src = dest;

}

/**
 * 取出資料
 * @param index 要取出的資料的下標
 */
public String get(int index) {
String s = src[index];
return s;
}

/**
 * 根據下標刪除資料
 * @param index要刪除的資料的下標
 */
public void delete(int index) {
String dest=new String[src.length-1];
//將下標小於index的拷貝到新陣列對應的下標
    System.arraycopy(src,0,dest,0,index);
    //將下標大於index的拷貝到新陣列下標的位置為原陣列的下標位置-1
    System.arraycopy(src,index+1,dest,index,src.length-index-1);
    //將src指向新陣列
    src=dest;
}

/**
 * 刪除指定的資料
 * @param s要刪除的資料,如果有重複的資料,就刪除下標最小的
 */
public void delete(String s) {
int t=-1;
for(int i=0;i<src.length;i++){
if(s.equals(src[i])){
t=i;
break;
}
}
//如果s在陣列中出現過,t一定是大於等於0的
if(t>=0){
  delete(t);
}

}

/**
 * 將資料插入到指定位置
 * @param index 要插入的位置
 * @param s 要插入的資料
 */
public void insert(int index,String s){
String dest = new String[src.length+1];
//將新資料放到新陣列指定的位置
dest[index]=s;
//將下標小於index的資料拷貝到新陣列對應的下標位置
 System.arraycopy(src,0,dest,0,index);
 //將下標大於等於index的資料拷貝到 新陣列下標+1的位置
 System.arraycopy(src, index, dest,index+1, src.length-index);
 src=dest;
}

/**
 * 修改資料
 * @param index要修改的資料的下標
 * @param s修改後的資料
 */
public void update(int index, String s) {
src[index] = s;
}

/**
 * 獲得資料個數
 */
public int size {
return src.length;
}



}
/**
 * 自定義長度可變陣列的測試類
 * 
 * @author Administrator
 * 
 */
public static void main(String[] args) {
// 建立陣列物件
my arr = new my;
// 增加資料
arr.add("AA");
arr.add("BB");
arr.add("CC");
arr.add("DD");
arr.add("EE");
arr.add("FF");

//根據下標刪除資料
arr.delete(3);
//刪除指定的資料
arr.delete("BB");
//將資料插入到指定位置
arr.insert(0,"on");
//修改資料
arr.update(2, "up");
//獲得資料個數
arr.size;
// 取出資料
for (int i = 0; i < arr.size; i++) {
String s = arr.get(i);
System.out.println(s);
}
}
}
//結果
// on
// AA
// up
// EE
// FF

連結串列應用場景:

1、對線性表的長度或者規模難以估計;

2、可以頻繁做插入刪除操作;

3、構建動態性比較強的線性表。

/**
 * 自定義連結串列類【雙向連結串列】
 * 
 * @author Administrator
 * 
 */
public class MyLinkList<E> {

// 初始狀態下,連結串列沒有任何結點,頭結點為null,尾結點為null
private Node<E> head = null;
private Node<E> last = null;
private int num = 0;// 資料個數

// 增加資料
public void add(E e) {
// 根據資料建立結點物件
Node<E> node = new Node<E>(e);

// 如果連結串列中已經有結點,就將node作為last的下一個結點
if (last != null) {
last.next = node;
node.front = last;
last = node;
} else {
// 如果連結串列中還沒有結點,node就是第一個結點
// 既是頭結點,又是尾結點
head = node;
last = node;
}
num++;

}
         //插入資料
public void insert(int index, E e) {
// 建立新結點
Node<E> node = new Node<E>(e);
// 找到index位置的結點
Node<E> n1 = getNode(index);
// 找到n1的前一個結點
Node<E> n2 = n1.front;

n2.next = node;
node.front = n2;

node.next = n1;
n1.front = node;

num++;
}

public void delete(int index) {

}

public void delete(E e) {

}

public void update(int index, E e) {
Node<E> n1 = getNode(index);
n1.data = e;
}

public E get(int index) {
Node<E> node = getNode(index);
return node.data;
}

//根據內容確定下標
private int getIndex(E e){
int index=-1;
Node<E> n = head;
while(n!=null){
index++;
if(n.data.equals(e)){
break;
}
n=n.next;
}
return index;
}

public int getIndex2(E e){
for(int i=0;i<num;i++){
E e2 = get(i);
if(e2.equals(e)){
return i;
}
}
return -1;

}

//根據下標確定結點
private Node<E> getNode(int index) {
int t = -1;
if (index >= 0 && index < num) {
Node<E> n = head;

while (n != null) {
t++;
if (t == index) {
break;
}
n = n.next;

}
return n;

} else {
// 丟擲異常
throw new IndexOutOfBoundsException("下標超出邊界!index:" + index
+ ",size:" + num);
}
}


public int size {
return num;
}

}

// 內部的結點類,主要為MyLinkList類服務
class Node<E> {
// 結點的資料
E data;
// 對下一個結點的引用
Node<E> next;
// 對前一個結點的引用
Node<E> front;

// 建立結點物件的時候必須指定資料
public Node(E e) {
data = e;
}

}
public class Main {
public static void main(String[] args){
myLinkList<String> mm=new myLinkList<String>;
mm.add("AA");
mm.add("BB");
mm.add("CC");
mm.add("DD");
mm.add("EE");

mm.insert(2,"鏈");
mm.update(3, "表");
for(int i=0;i<mm.size;i++){
String s=mm.get(i);
System.out.println(s);

}
}
}
//結果
// AA
// BB
// 鏈
// 表
// DD
// EE

本文為頭條號作者釋出,不代表今日頭條立場。

相關推薦

Java 陣列連結串列區別以及使用場景

陣列:是將元素在記憶體中連續儲存的;它的優點:因為資料是連續儲存的,記憶體地址連續,所以在查詢資料的時候效率比較高;它的缺點:在儲存之前,我們需要申請一塊連續的記憶體空間,並且在編譯的時候就必須確定好它的空間的大小。在執行的時候空間的大小是無法隨著你的需要進行增加和減少而改變的,當資料兩比較大的時候,有可能

資料結構:陣列連結串列區別陣列連結串列的優缺點 & 陣列連結串列的適用場景

陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點 陣列 一、陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間

陣列連結串列區別

談到連結串列與陣列的區別,可以從幾個不同的角度來談, 首先從邏輯結構上說,兩者都是資料結構的一種,但存在區別, 陣列是申請的一塊連續的記憶體空間,並且是在編譯階段就要確定空間大小的,同時在執行階段是不允許改變的,所以它不能夠隨著需要的改變而增加或減少空間大小,所以當資料量大

陣列連結串列集合的區別應用場景以及棧的區別

陣列和集合的區別: 1.陣列的長度固定的,超過長度時,只能建立一個新的陣列,並把舊的陣列的值傳進去方可; 而集合的長度是動態不固定的。 2.陣列的儲存型別是單一的,同一陣列只能儲存同一資料型別的資料。 而集合可以儲存多鍾資料型別的資料。 3.陣列只能通過下標來訪

資料結構:陣列連結串列區別以及各自的優缺點

原文地址 http://blog.csdn.net/qq_25806863/article/details/70607204 陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點。 大致總結一下特點和區別,拿幾個人一起去看電影時坐座位為例。 陣列的特點

陣列連結串列區別及使用場景

學習一門語言我們基本都會用到陣列和連結串列,那麼這兩種結構肯定是有各自的優缺點的,俗話說沒有對比就沒有傷害哈(),不管是一個什麼東西都 是如此,接下來我就來分析分析他們各自的特點(沒有分析到位的話不要見怪哈,請盡情下評論區留言,一起交流交流) 陣列:我們知道不管是一維陣列還是二維陣列培訓它們在記憶體裡面的

Java基礎--陣列連結串列區別

1、陣列                  陣列處理一組資料型別相同的資料,但不允許動態定義陣列的大小,即在使用陣列之前必須確定陣列的大小。而在實際應用中,使用者使用陣列之前有時無法準確確定陣列

陣列連結串列區別與優缺點

1.儲存    陣列儲存必須有提前宣告空間,因為陣列的儲存是連續的,沒有足夠的空間是無法儲存陣列的。  連結串列可以將資料儲存在不連續的空間中,從第一個空間開始,連結串列會記錄下下一個空間的位置,這樣就能檢索到整條連結串列了 2.查詢 根據陣列的特有屬性,只要找到第

陣列連結串列區別比較

1.陣列: 陣列是將元素在記憶體中連續存放,由於每個元素佔用記憶體相同,可以通過下標迅速訪問陣列中任何元素。但是如果要在陣列中增加一個元素,需要移動大量元素,在記憶體中空出一個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果想刪除一個元素,同樣需要移動大量元素去填掉被移動的元素。

陣列連結串列區別

大致總結一下特點和區別,拿幾個人一起去看電影時坐座位為例。 陣列的特點 在記憶體中,陣列是一塊連續的區域。 拿上面的看電影來說,這幾個人在電影院必須坐在一起。 陣列需要預留空間,在使用前要先申請佔記憶體的大小,可能會浪費記憶體空間。 比如看電影時,為了

陣列連結串列描述棧以及應用

陣列描述棧#pragma warning(disable:4996) #include <iostream> #include<iterator> #include<algorithm> using namespace std; //邊長

陣列連結串列區別優缺點總結!

陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點。 連結串列中各結點在記憶體中的存放位置是任意的。  連結串列與陣列的主要區別 (1)陣列的元素個數是固定的,而組成連結串列的結點個數可按需要增減; (2)陣列元素的存諸單元在陣列

陣列連結串列與棧佇列之間的關係及堆棧之間的關係

本屌最近在學習資料結構過程中,由於連續看了陣列,棧,佇列,連結串列等,一時混雜,下面摘取參考資料,供自己學習使用。 第一部分:介紹了資料儲存結構和資料結構的區別,以及連結串列和陣列的差異。 第二部分:介紹了堆和棧的區別。 (1)資料儲存結構:計算機的一個概念,描述資料在計算機中儲存方式;常用

演算法總結-陣列連結串列

1 連結串列 Dummy Node的應用 K組翻轉連結串列 http://www.lintcode.com/zh-cn/problem/reverse-nodes-in-k-group/ 連結串列劃分 http://www.lintcode.com/zh-cn/probl

資料結構之——陣列連結串列

1. 陣列 1.1 陣列為什麼從零編號? 陣列名代表陣列的首地址,陣列的下標其實代表陣列中某個元素相對首地址的偏移量,陣列的第一個元素是零偏移,因此從 0 開始。 上面其實也只是一個解釋, C 語言設計者用零開始編號,後來的各種語言也便紛紛效仿,因此就形成了這個習慣。 1

一元多項式求和的兩種實現(陣列連結串列

一元多項式求和一般都是有兩種實現方式,小編下面就附上我對這兩種方式的理解和實現程式碼。 1.陣列實現。這種方式實現一元多項式加法,是把陣列下標當做一元多項式的指數,在陣列中存放係數。這種方式在實現一元多項是加法是通過遍歷陣列下標來獲取指數資訊,通過指數資訊將係數進行相加。利用陣列在實現一元多項式

C++實現陣列連結串列的排序演算法

OK,我們經常會用到排序演算法。那麼,常用的排序演算法,除了使用陣列之外,用連結串列又該如何處理呢?下面我們來做個對比: //使用插入排序對陣列進行排序 int *get_order(int *num, int length) { for(int eiter = 1; eiter <

陣列連結串列

陣列是申請的一塊連續的記憶體空間,並且在編譯階段就要確定空間大小的,同時執行階段是不允許改變的,意味著所有待辦事項在記憶體中都是相連的(緊靠在一起的)。 連結串列是動態申請的記憶體空間,現用現申,比陣列靈活。 當同時讀取所有元素時,連結串列的效率高,讀第一個,讀第二個。

陣列連結串列的例項講解——以Facebook為例

陣列支援隨機訪問,而連結串列只能順序訪問。那在實際使用中什麼樣的場合下該使用陣列,或者連結串列呢? 1、假設你要編寫一個記賬的應用程式。包含買雜貨、看電影和交會費。你每天都將記錄所有的支出,並在月底統計支出,算算當月花了多少錢。因此,你執行的插入操作很多,讀取操作很少,該使用陣列還是連

基於陣列連結串列兩種方式實現棧

棧是一種先進後出的資料結構,在實際程式設計棧有很廣泛的用處,Java棧已經幫我們實現好了stack類。 實現棧的兩種方式,基於陣列實現和基於連結串列實現。 1.stack介面 public interface StackADT { //入棧操作 public voi