- 就是个存放引用的容器,不同容器是不同的数据结构罢了!(有自动拆装箱)
- 都在java.util.*里
- 集合类都支持泛型,建议使用泛型,不使用则默认Object(因为底层存储都是Object,所以集合类不能存储基本数据类型,int、long等,只能存储它们的包装类。)
- SUN自己写的类都重写了equals、hashCode、toString方法(他在Object中建议别人重写,他自己不写 那不给自己一个大嘴巴子)
- SUN也在用自己重写的方法: 方法contains、remove底层都使用equals方法(String、Integer等包装类sun重写方法的目的就是为了这样用啊!不用那他重写个🔨啊他!)
集合类继承关系图
Collection直接存储方式
collection下:(有序实质是有下标)
SortedSet接口下会按照大小从小到大自动排序(而List只是顺序存储,并没有排序),但注意还是没有下标:
常把LinkedList作为队列使用: Queue<> queue = new LinkedList<>();
官方文档建议使用Deque< Integer > stack = new ArrayDeque< Integer >();代替栈
Map键值对方式存储
集合类总结
方法:
Collection接口
不用泛型,默认存储类型是Object
注意 add返回boolean类型(如Set接口下的HashSet对象add一个重复值时会返回false)
还有个方法boolean addAll(Collection<? extends E> c)是将c集合中每个元素放入集合中 (而add( c )则会直接把c放入集合中)
注意 size返回元素个数,不同于 数组.length:返回的是容量
方法contains、remove底层都使用equals方法(String、Integer等包装类sun重写方法的目的就是为了这样用啊!不用那他重写个🔨啊他!)
注意 remove只会删除最先检索到的一个对象!
迭代器
c中有个内部类①实现了迭代器Iterator接口
c中重写了iterator()方法 返回一个①的对象
所以图中it为一个迭代器对象
迭代器第三个方法 remove()
注意: 迭代器获取到集合迭代结束 中间不能存在改变集合的代码 不然报错
而可以用 it.remove() :删除迭代器当前指向元素 来改变集合
泛型
不用泛型时,默认类型是Object,所以泛型必须 extends Object
注意:迭代器也必须指明泛型(不然it.next()返回Object类型)
自定义泛型:
知识点:
- ?表示不确定的java类型
- T (type)表示具体的java类型
- K V (key value) 分别代表java中的键 值
- E (element) 代表Element
- <? extends E> 上界通配符:?<= E
- <? super E> 下界通配符:?>= E
增强for循环 foreach
Map接口
记:key是Set集合,value是Collection集合
这些方法类似于LIst,key就相当于index,而value就是值,用key检索出value。
还有个void putAll(Map<? extends K, ? extends V> m)同addAll()
Set<Map.Entry<K, V>> entrySet() 方法
Entry是Map接口的内接口
此方法将Map集合的结点存储进Set集合
将结点类型存储进Set集合:
Map集合的遍历
Map集合不能遍历,所以要借助Set集合!
- 获取key,遍历key来遍历value。
- 利用 Set<Map.Entry<K,V>> entrySet()方法:
Set<Map.Entry<K,V>> entrySet() + foreach效率最高,最常用!
杂识
Collection和Map都有类似于这种构造方法
所以可以利用这种构造方法进行:
Collection与Collection之间转换;
Map与Map之间转换
public ArrayList(Collection<? extends E> c)
public HashMap(Map<? extends K, ? extends V> m)
工具类java.util.Collections方法
-
Collections.synchronizedList()
Collections.synchronizedXXXX()都采用了装饰器模式 (只是包装了一层synchronized,还是调用的原类) -
Collections.sort()
只能排序List
底层还是利用compareTo()排序的,所以还是要…两种方式