1. 程式人生 > >java的數組和鏈表

java的數組和鏈表

ble 。。 ati pack 通過 linked 進行 add 是把

數組和鏈表 java的數組是什麽:數組是用來存放同一種數據類型的集合,

數組中每個元素都是相通的數據類型,數組就是在內存中劃分一串連續的空間數組作為對象允許使用new關鍵字進行內存分配),註意只能存放同一種數據類型(Object類型數組除外),數組是一種數據結構

舉個栗子:string:就是char類型的數組。
為什麽要學數組:因為數組可以存放許多相同的數據類型!!編寫程序時省去了很多代碼量!! 怎麽使用數組: 第一種方式:

數據類型 [] 數組名稱 =

new 數據類型[數組長度];

這裏 [] 可以放在數組名稱的前面,也可以放在數組名稱的後面,我們推薦放在數組名稱的前面,這樣看上去 數據類型 [] 表示的很明顯是一個數組類型,而放在數組名稱後面,則不是那麽直觀。
//聲明數組1,聲明一個長度為5,只能存放int類型的數據
int [] a = new int[5];
System.out.println(a.length);
第二種方式: 數據類型[] 數組名稱={數據1,數據2}。
//聲明數組2,聲明一個數組元素為 1,2,3,4,5的int類型數組
int [] b = {1,2,3,4,5};
System.out.println(b.lengyh);

訪問數組元素以及給數組元素賦值:

數組是存在下標索引的,通過下標可以獲取指定位置的元素,數組小標是從0開始的,也就是說下標0對應的就是數組中第1個元素,可以很方便的對數組中的元素進行存取操作。我們在聲明數組的同時,也進行了初始化賦值。

int[] a={1,2,3};//元素長度為三,超出就會報錯

a[0]=1;//下標為0的值為1

system.out.println(a[0]);//訪問數組的第一個元素

length:是數組的長度。可以通過數組名.length獲取長度

循環數組

//聲明數組,聲明一個數組元素為 1,2,3的int類型數組 int [] c = {1,2,3}; for(int i = 0 ; i < c.length ; i++){

System.out.println(c[i]);

//循環變量i從0開始遞增直到達到數組的最大長度,每次循環加1.。。

一些練習:

double[] myList = {1.9, 2.9, 3.4, 3.5}; // 打印所有數組元素 for (int a = 0; a < myList.length; a++) { System.out.println(myList[a] + " "); } // 計算所有元素的總和 double sum= 0; for (int b = 0; b < myList.length; b++) { sum+= myList[b]; } System.out.println("sumis" +sum); // 查找最大元素 double max = myList[0]; for (int d = 1; d < myList.length; d++) { if (myList[d] > max) max = myList[d]; }

System.out.println("Max is " + max);

數組的排序

語法:Arrays.Sort數組名)

註意:在排序之前加上 Arrays.name(數組名)就可以完成升序排列 了

int[] a={199,27,31}

array.sort(a);

System.out.println("排序後的值");

for (int j = 0; j <a.length; j++) {
System.out.println(a[j]); //可以.tostring方法把數組變成字符串

}

多維數組

多維數組可以看成是數組的數組,比如二維數組就是一個特殊的一維數組,其每一個元素都是一個一維數組

數據類型[][] 數組名;

數組名=new 數據類型[1][2];

int[][] a=new int[3][4];//二維數組 a 可以看成一個兩行三列的數組。

賦值:二維數組的賦值,和一維類似,可以通過下標來逐個賦值,

舉個栗子:

int[][] s= new int[2][];
s[0] = new int[2];
s[1] = new int[3];
s[0][0] = 22;
s[0][1] = 23;
s[1][0] = 24;
s[1][1] = 25;

s[1][2] = 26;

數組實現數據結構:

數據結構的作用:模擬生活中的數據存儲;對數據進行增刪改查

和數據庫的區別 對該同學信息進行增刪改查
數據庫是把數據存到磁盤裏面,他支持可調定式
電腦存數據有兩塊區域,第一個是硬盤,第二個是內存。硬盤是永久儲存,內存是臨時的,但是內存數據快。 通過需求分析 模擬數據存儲的案例
舉個栗子:模擬LOL代號的存儲,假設我現在是某只戰隊的教練,我需要安排上場的人員(不要問為什麽是LOL,我只玩LOL)
作為一個教練要安排上場 1.初始化容量為5的線性列表,準備用來存儲場上的五個代號
2.安排人員上場(uzi,looper,mata,xiaohu,mlxg)
3.查詢指定位置的的人員的名字,查詢索引位置為0的人員為uzi 4.根據名字查詢該人員在場上的索引位置,代號mata的人員在場上的索引位置2
5.替換場上索引位置為2的人員,替換之後該人員為ming,ming把mata替換了
6.替換名字為looper的人員員,替換之後為letme。
7.假設,把場上索引位置為2的人員罰下場,沒補位
8.按照人員在場上的位置,打印出球該成員的名字可打印分割 通過上面的代碼發現了數組的局限性

  數組的局限性分析:

 插入快,查找慢,刪除慢,數組一旦創建後,大小就固定了,不能動態擴展數組的元素個數。如果初始化你給一個很大的數組大小,那會白白浪費內存空間,如果給小了,後面數據個數增加了又添加不進去了。

鏈表:

鏈表:是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在每一個節點裏存到下一個節點的指針

1.單項鏈表:只能從頭遍歷到尾巴,或者從尾巴遍歷到頭部,就像火車頭和火車尾。

2.雙向鏈表:可以看做是兩個單項列表,一個可以從頭到尾,一個可以從尾到頭。

通過引用表示上一個節點和下一個節點的關系

舉個栗子:對雙向列表的增刪

package com.alphabet.link;
public class MyLinked { private Node frist; //第一個節點 private Node last; //最後一個節點 private int size=0; //節點的數量 public void remove(Object obj) { // TODO Auto-generated method stub Node n=this.frist; for (int i = 0; i < size; i++) { if (!n.size.equals(obj)) { if (n.next==null) { return; } n=n.next; } } //刪除節點 if (n==frist) { this.frist=n.next; this.frist.prev=null; }else if (n==last) { this.last=n.prev; this.last.next=null; }else { n.prev.next=n.next; n.next.prev=n.next; } System.out.println("該刪除的值"+n.size);//找到被刪除的節點 } public void addlast(Object obj) {//需要保存的節點對象 // TODO Auto-generated method stub Node node=new Node(size); if (size == 0) { this.frist=node; this.last=node; }else { this.last.next=node.frist;//把之前第一個作為新增下一個的節點 node.prev=this.last;//把新增節點作為之前第一個節點的上一個節點 this.last=node;//把新增節點作為最後一個節點 this.frist.prev=node;//把之前新增節點作為之前第一個節點的上一個 this.frist=node;//把新增節點作為第一個節點 } size++; } public void addfrist(Object obj) {//需要保存的節點對象 // TODO Auto-generated method stub Node node=new Node(size); if (size == 0) { this.frist=node; this.last=node; }else { this.last.next=node;//把新增節點作為之前最後一個的下一個的節點 node.prev=this.last;//把之前最後一個節點作為新增節點的上一個節點 this.last=node;//把新增節點作為最後一個節點 } size++; } @Override public String toString() { // TODO Auto-generated method stub if (size==0) { return "[]"; } StringBuilder s=new StringBuilder(size*2+1); Node n=this.frist; s.append("["); for (int i = 0; i < size; i++) { s.append(n.size); if (i!=size-1) { s.append(","); } else { s.append("]"); } n=n.next;//獲取自己的下一個節點 } return super.toString(); } public class Node{ public Node frist; private Node prev;//上一個節點 private Node next;//下一個節點對象 private Object size;//當前節點中存儲的數據 public Node(Object obj) { // TODO Auto-generated constructor stub this.size=obj; } } public static void main(String[] args) { MyLinked link=new MyLinked(); link.addfrist("A"); System.out.println(link); link.addfrist("B"); link.addfrist("D"); } }






java的數組和鏈表