2021-03-24 Java集合类 List Map Set Queue基本使用

集合类/容器类

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 = new HashSet();

hs.add("a");




(2) LinkedHashSet

有序的,线程不安全的

LinkedHashSet hs = new LinkedHashSet();

hs.add("a");


add,remove, clear,iterator

size()、isEmpty()、contains()、clear()等都完全委托给了HashMap。

需要注意的是:HashSet没有提供set、get等方法

TreeSet : 排序的set


3.Map

(1)HashMap;

HashMap hm = new HashMap();

hm.put(1, "a");

 (2)LinkedHashMap;


4.队列Queue

只允许在头部删除,尾部插入

Queue sq = new LinkedArrayList();

sq.offer(); // 加

sq.pull(); // 返回并删除,弹出

sq.element(); // 返回头部, 空是抛出异常

sq.peek(); // 返回头部,空是返回null


5.双端队列 Deque


你可能感兴趣的:(2021-03-24 Java集合类 List Map Set Queue基本使用)