集合类/容器类
1.
集合类都位于 java.util包下
多线程支持的集合类 java.util.concurrent包下
2.
非全集,常用集如下图,全集可参考https://www.cnblogs.com/LittleHann/p/3690187.html
3.迭代器Iterator (对比C++迭代器好像是没有这些,不同的源码实现,就分开学吧)
1)为什么迭代器和集合的方法 不能在循环里 混着用?
“最后附上网上的判断——
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。”
所以在迭代器的迭代循环中 删除 修改操作,不能用集合的方法操作,用迭代器删改的方法。
我们使用的增强 for 循环(for-each),其实是 Java 提供的语法糖,其实现原理是借助 Iterator 进行元素的遍历
2)为什么Iterator.next() 到底返回的是列表中下一个元素 还是 返回了列表中当前的那个元素?
看下实现原理。
https://alonec.github.io/2018/04/09/Iteretor%E5%92%8CListIterator%E8%BF%AD%E4%BB%A3%E5%99%A8/
next()的源码中 :
1)有一个索引标记遍历 到的集合下标,int cursor;
2)初始化的时候 cursor = 0;
3)判断了cursor < size,如果非,异常
4)返回 i 所指元素
5) cursor = i+1;
hasnext()
1)判断cursor < size?但不移动cursor光标。
∴ 简单理解
1) iterator创建时,cursor = i = 0, next()返回 i 所指当前值,并把光标cursor向后移一位(先返回再后移); hasnext() 遍历完了吗。写代码的时候结合起来遍历就完了
2) 简单理解为 iterator创建时 返回指针指向列表的上一格,next()一下就往下一格。但这种理解跟源码是不一样的。只是简化记忆。不推荐。
集合常用方法 https://www.runoob.com/java/java-arraylist.html
3.List常用
【
常用list对比:
链接:https://www.jianshu.com/p/7c768bd443b4
1.Java 的 ArrayList无法存储基本类型,比如int、long,需要封装为Integer、Long类,而AutoBoxing和Unboxing则有一定的性能消耗,如果极其关注性能,或者希望使用基本类型,可以选用数组。
2.Vector相比ArrayList 是线程安全的,内部使用了synchronized 进行同步。这导致了 Vector 性能非常不好。相比较的话,推荐用ArrayList,然后自己控制同步。
Vector 每次扩容都是2 倍大小,而不是1.5
3.// 需要注意 这种方式返回的List只继承了父类,没有实现更多的虚函数,只包含了查看和修改, 不能改变原数组的长度,如remove等 不支持。
Liststr1 = Arrays.asList("a","b");
】
创建:
ArrayList(基于动态数组):
(1)ArrayList strs =new ArrayList();
strs.add("a");
strs.add("b");
(2) ArrayList stringList =new ArrayList(Arrays.asList(stringArray));
接口:
add;addAll
set;
remove;
clear;
get;
contain;
size;
indexof;
Collections.sort(stringList);
LinkedList(基于链表):
(1)LinkedList strs =new LinkedList();
strs.add("a");
strs.add("b");
(2) LinkedList stringList =new LinkedList(Arrays.asList(stringArray));
接口:
add;addAll;addFirst;addLast
offer;offerFirst;offerLast
remove,clear;removeFirst;removeLast;
public Iterator descendingIterator() 返回倒序的迭代器
...
2.Set
set是特殊的map,在map中 用key存储数据,value=null ,即set。
hashmap:hashset;LinkedHashMap : LinkedHashSet;
(1) HashSet
引用类型的数据,基本类型用包装类
HashSet
hs.add("a");
(2) LinkedHashSet
有序的,线程不安全的
LinkedHashSet
hs.add("a");
add,remove, clear,iterator
size()、isEmpty()、contains()、clear()等都完全委托给了HashMap。
需要注意的是:HashSet没有提供set、get等方法
TreeSet : 排序的set
3.Map
(1)HashMap;
HashMap
hm.put(1, "a");
(2)LinkedHashMap;
4.队列Queue
只允许在头部删除,尾部插入
Queue
sq.offer(); // 加
sq.pull(); // 返回并删除,弹出
sq.element(); // 返回头部, 空是抛出异常
sq.peek(); // 返回头部,空是返回null
5.双端队列 Deque