Java学习笔记五
求助編輯百科名片
??
數據結構與java類集框架
ArrayList就是傳說中的動態數組,用MSDN中的說法,就是Array的復雜版本,它提供了動態的增加和減少元素,實現了ICollection和IList接口,靈活的設置數組的大小等好處。
目錄
?
編輯本段定義
List接口的大小可變數組的實現,位于API文檔的java.util.ArrayList<E>。實現了所有可選列表操作,并允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。(此類大致上等同于Vector類,除了此類是不同步的。)
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定時間運行。add 操作以分攤的固定時間 運行,也就是說,添加 n 個元素需要 O(n) 時間。其他所有操作都以線性時間運行(大體上講)。與用于 LinkedList 實現的常數因子相比,此實現的常數因子較低。
每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數組的大小。它總是至少等于列表的大小。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。并未指定增長策略的細節,因為這不只是添加元素會帶來分攤固定時間開銷那樣簡單
在添加大量元素前,應用程序可以使用 ensureCapacity 操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數量。注意,此實現不是同步的。如果多個線程同時訪問一個 ArrayList 實例,而其中至少一個線程從結構上修改了列表,那么它必須 保持外部同步。(結構上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調整底層數組的大小;僅僅設置元素的值不是結構上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用Collections.synchronizedList 方法將該列表“包裝”起來。這最好在創建時完成,以防止意外對列表進行不同步的訪問:
List list =Collections.synchronizedList(new ArrayList(...));
此類的 iterator 和 listIterator 方法返回的迭代器是快速失敗的:在創建迭代器之后,除非通過迭代器自身的 remove 或 add 方法從結構上對列表進行修改,否則在任何時間以任何方式對列表進行修改,迭代器都會拋出ConcurrentModificationException。因此,面對并發的修改,迭代器很快就會完全失敗,而不是冒著在將來某個不確定時間發生任意不確定行為的風險。
注意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步并發修改做出任何硬性保證。快速失敗迭代器會盡最大努力拋出ConcurrentModificationException。因此,為提高這類迭代器的正確性而編寫一個依賴于此異常的程序是錯誤的做法:迭代器的快速失敗行為應該僅用于檢測 bug。
編輯本段常用的方法
boolean add(E e)
將指定的元素添加到此列表的尾部。
void add(int index, Eelement)
將指定的元素插入此列表中的指定位置。
booleanaddAll(Collection<? extends E> c)
按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。
boolean addAll(intindex, Collection<? extends E> c)
從指定的位置開始,將指定 collection 中的所有元素插入到此列表中。
void clear()
移除此列表中的所有元素。
Object clone()
返回此 ArrayList 實例的淺表副本。
boolean contains(Objecto)
如果此列表中包含指定的元素,則返回 true。
void ensureCapacity(intminCapacity)
如有必要,增加此 ArrayList 實例的容量,以確保它至少能夠容納最小容量參數所指定的元素數。
E get(int index)
返回此列表中指定位置上的元素。
int indexOf(Object o)
返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。
boolean isEmpty()
如果此列表中沒有元素,則返回 true
int lastIndexOf(Objecto)
返回此列表中最后一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。
E remove(int index)
移除此列表中指定位置上的元素。
boolean remove(Objecto)
移除此列表中首次出現的指定元素(如果存在)。
protected voidremoveRange(int fromIndex, int toIndex)
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。
E set(int index, Eelement)
用指定的元素替代此列表中指定位置上的元素。
int size()
返回此列表中的元素數。
Object[] toArray()
按適當順序(從第一個到最后一個元素)返回包含此列表中所有元素的數組。
<T> T[]toArray(T[] a)
按適當順序(從第一個到最后一個元素)返回包含此列表中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。
void trimToSize()
將此 ArrayList 實例的容量調整為列表的當前大小
?
70. 牢記動態數組中的一些方法;/*動態數組
?
?*/
?
packagecom.jianjian;
importjava.util.ArrayList;//導入java.util包下的ArrayList方法;
public class ArrayTest
{
?? public static void main (String[] args)
?? {
?????
????? ArrayList a? = new ArrayList ();
????? a.add("helloworld");//調用ArrayList類中的add方法原型是 boolean add (Object e);
????? a.add("world");
????? a.add("welcome");
????? //要求接受一個Object類型的參數,這里算是多態,向上類型轉換,該方發動的作用是添加
????? //一個指定元素添加到此列表的末尾;
????? System.out.println (a.get(0));//調用ArrayList中的 Object get (intindex)方法
????? //index是索引,動態數組和數組一樣索引也是從零開始的;作用是調用索引元素;
????? System.out.println(a.get(1));
????? System.out.println(a.get(2));
????? System.out.println (a.isEmpty());//判斷數組元素是否為空的方法;返回boolean類型的值
?????
?? }
}
? ? 71. java語言并不是完全的意義 “上的面向對象語言”,因為有八種原生數據類型的存在;八種原生數據類型不是對象,java中也只有八種原生數據類型不是對象; 其他的全是對象,Object接受的也是對象,所以如果直接把原聲數據類型穿進去肯定是不對的,比如說ArrayList.add(3),將數字3傳進去,肯定要出錯,那怎么才能將3賦值進去呢?這里就要用到包裝類了,這也是包裝類為什么存在的原因,他們的作用就是把原生數據類型轉換成對象;‘ 可以這樣做:ArrayList.add.(new integer (3));這樣做的作用就是把3包裝成為一個對象;如此就能把3的值賦進去了; 但是這個時候我想打印出3,但是已經成了對象了,可以調用Integer 下的 intValue()方法,輸出對象的值為int型; ?package com.jianjian;
?
import java.util.ArrayList;
?
public class Test
{
??? public static void main (String[] args)
??? {
?????? ArrayList a = new ArrayList();
?????? a.add(new Integer(5));
?????? a.add(new Integer(3));
?????? int value = ((Integer) a.get(0)).intValue();//先強制轉換成integer類型再調用方法返回int類型;
?????? System.out.println(value);
?????? System.out.println (a.size())//調用size()方法返回動態數組元素個數;
??????
??????
??? }
}
還有關于Object的使用陷阱:
對于動態數組ArrayTest來說,很多都是定義成接收Object類型的方法,取出Object類型的方法,好吧,雖然我們什么類型的數據都可以放入Object類里但是當我們取出來的時候就麻煩了,加入接收的是多個類型的數據,比如數組,String,那我們在取用所有數據時,就只能采用Object類型的數據,而無法采取強制類型轉換成我們想要的類型,例如無法將一個字符串轉換成整型,只有通過將Object類牽制轉換的渠道,即先Object,再強制類型轉換自己需要的類型,其實是挑取數據去用了;
?
72.
再議 toString()方法
toString是Object類的方法,所有類都從Object類繼承。如果你定義的類沒有覆蓋toString方法,則對象在調用toString方法時用的是Object類toString方法,返回的是“類名@hashcode". ? System.out.println(obj)在參數是一個對象時,會首先調用該對象的toString方法。 而String類和StringBuffer類都覆蓋了toString方法,都是返回字符串。 ? 所以帶不帶toString效果是一樣的。 看到上面,System.out.println 如果參數是對象會首先調用該對象的toString方法,其實,只要重寫了toString方法,輸出對象都是默認輸出對象的toString方法!!! ?package com.jianjian;
?
import java.util.ArrayList;
?
public class Test
{
??? public static void main(String[]args)
??? {
?????? ArrayList a =new ArrayList ();
?????? a.add(newTest2(2,2));
?????? System.out.println(a.get(0));//打印的依然是對象;
??????
??? }
}
class Test2
{
??? int x ;
??? int y ;
??? Test2(int x ,int y)//構造方法的作用,初始化成員變量;
??? {
?????? this.x = x;
?????? this.x = y;
??? }
??? public String toString()
??? {
?????? return this.x +","+this.y;
??? }
} 73. 看一下這個,ArrayList a =new ArrayList (); a.??? add (“3”); 這代表了什么呢;“3”,的意思其實就是 String =“3”;也就是說已經重寫了toString方法了; 而且在ArrayList里當打印對象 a; 時,由于a是一個動態數組對象,打印的也是對象,也就是打印對象的toString方法,現在a里面包含了好幾個對象,這樣會打印出每個對象的內容用[?? ]內容之間用逗號隔開; 74. 鏈表*
?* 鏈表是由節點構成的,兩個重要而功能,
?* 在滿足自己有元素的同時,還有有指向下一個節點的指針
?*
?*/
package com.jianjian;
?
public class LinkedTest
{
??? public static void main (String[] args)
??? {
?????? Test t1 = new Test ("date1");//利用構造方法將個元素的值賦進去,完成第一步賦值;
?????? Test t2 = new Test ("date2");
?????? Test t3 = new Test ("date3");
?????? t1.point= t2;
?????? t2.point = t3;
?????? System.out.println(t1.point.point.date);//因為大家都是對象可以傳遞引用;
??? }
}
package com.jianjian;
?
public class Test
{
??? String date ;
??? Test point;//利用point作為指針指向下一個結點;
??? public? Test(String date)
??? {
?????? this.date = date;
??? }
}
這個是單向鏈表
如何刪除掉指向,只需將指向改為 null;
?
?
75.
如何運用LinkedList里的方法實現隊列
隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。
在隊列這種數據結構中,最先插入的元素將是最先被刪除的元素;反之最后插入的元素將最后被刪除的元素,因此隊列又稱為“先進先出”(FIFO—firstin first out)的線性表。
隊列空的條件:front=rear
隊列滿的條件: rear = MAXSIZE
?
總結