集合的由来:
在Java当中存储一类数据的时候可以使用数组,但数组有一个缺点:长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义。而集合类可以存放对象的引用。
相较于数组集合有两个特点 :1、长度可以自动增长 2、存放元素有自动装箱过程
集合的分类
Collection
├List 可重复的无序列表
│├LinkedList 底层使用链表,增删快查找慢 效率高
│├ArrayList 底层使用数组,查询快增删慢,线程不安全效率高
│└Vector 底层使用数组,查询快增删慢,线程安全效率高
│ └Stack
└Set 无序不重复的集,旗下TreeSet有序
Map 双列结构的映射
├Hashtable
├HashMap
└WeakHashMap
Collection接口:
由上可知Java中的集合都实现了这个接口,故只要是集合就会存在以下的一些方法:
其中可以发现 存在其当中的Iterator迭代器。这个迭代器一般用于遍历集合。
List
由于实现了Collecton接口,所以List当中的方法大多苟同,这里只关心他们三个的特点和区别:
ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
Set
此处暂时只写HashSet的构造方法,由于TreeSet独有的单列排序无重复的特点,放到后面和 TreeMap一起。而HashSet继承了 AbstractSet,在底层Set在去元素重复的时候会有这样一个过程:每添加一个新的元素的时候Set会生成一个Hash值,这个值来源于其底层的HashCode方法,他会先比较hash值,若值相同会继续使用equals方法来对比。当插入的引用是自定义的时候,需要重写equals方法和hashcode方法来自定义自己的去重复标准。
Map
Map的双列结构注定和单列的Collection不一样,他的构造方法如下:
而Map也是根据键值对来确定你的元素是否重复,若键值相同那么Map就实行后来者居上的办法将原来的值覆盖。其中HashMap和HashTable还是有区别的:
Hashtable是JDK1.0版本出现的,是线程安全的,效率低;HashMap是JDK1.2版本出现的,是线程不安全的,效率高
Hashtable不可以存储null键和null值;HashMap可以存储null键和null值
Map旗下方法大致有:
下面来说留下的TreeSet和TreeMap
TreeSet
单看构造方法也觉得没什么特别,但是TreeSet是有序集,通过实现Comparable接口亦或者是Comparator接口,其中的comparaTo或者compare方法会实现排序,同样的,当传入的引用是自定义的对象时,你先需要重写上面的两个方法之一,他们之间还是有区别的:
1)自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
2)比较器顺序(Comparator)
创建TreeSet的时候可以指定一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
3)两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序
TreeSet如果传入Comparator, 就优先按照Comparator
具体情况如下:
这个时候需要拿出来快凉了的TreeMap,他只是同时拥有Tree 和 Map的特性,定义和使用和HashMap没有什么大的区别。
而在java开发中集合的使用往往离不开泛型:
泛型:参数化数据类型,将数据类型作为参数进行传递
泛型好处:
1)提高安全性:将运行期的错误转换到编译期
2)增加可读性
详细请跳转:https://www.ziwenxie.site/2017/03/01/java-generic/