java泛型是僞泛型因爲編譯成功後的class文件是沒有泛型的
泛型的好處:安全、將錯誤由編譯時期提前到了運行時期
集合框架之List接口:
List接口特點:有序、索引、可以重複元素
實現類ArrayList,LinkedList
List接口特有的方法,即帶有索引的功能
add():在指定的索引添加數據,注意越界異常
remove():移除指定索引上的元素,同時返回被刪除前的元素
set():修改指定索引上的元素
迭代器的併發異常:
在遍歷的過程中,使用了集合方法修改了集合的長度,這是不允許的,因爲在List遍歷的過程中,指針是一直向前移動的,遍歷過程中不可能因爲添加了元素而使指針回退重新遍歷,這是不可能的!!!
如下案例:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
if(s.equals("abc3")){
list.add("ABC3");
}
System.out.println(s);
}
}
注意,最後會引起Exception in thread “main” java.util.ConcurrentModificationException,併發修改異常
該程序是錯誤的操作
數據的存儲結構:
堆棧:先進後出,如子彈壓入彈夾
隊列:先進先出,如安檢
數組:特點查找元素快,增刪元素慢(慢的原因是數組是定長的)
鏈表:多節點之間採用地址進行連接,查找速度慢,增刪速度快
ArrayList特點:查找元素快,增刪元素慢
LinkedList:增刪速度快,查詢慢,LinkedList集合數據存儲的結構是鏈表結構,所以他提供了大量的首尾操作的方法
LinkedList特有的方法:
addFirst()添加到鏈表的開頭
addLast()添加到鏈表的結尾
removeFirst
removeLast
Vector類已經被ArrayList取代了,已經沒用了
Set接口:不允許存儲重複對象,沒索引
實現類:HashSet(哈希表)
特點,無序集合,沒有索引
存儲取出都比較快
線程不安全,運行速度比較快
數組長度達到12的時候就需要對數組擴容
String類繼承Object類,重寫了父類的方法hashCode
LinkedHashSet基於鏈表的哈希表實現
繼承自HashSet
LinkedHashSet具有順序,存儲和取出順序相同的
線程不安全的集合,運行速度比較快
問題:
1、如果兩個對象的哈希值相同p1.hashCode()==p2.hashCode()
兩個對象的equals一定返回true嗎?p1.equals(p1)
答案是不一定
2、如果兩個對象的equals方法返回true,p1.equals(p2)==true
兩個對象的哈希值一定相同嗎?
答案是一定的