集合的一点小总结
集合
1.长度:动态扩容
2.内容:可以是基本数据类型,也可以是引用数据类型
3.元素:存储的元素可以多元化,但是一般存储的都是同一数据类型
- Collection集合
List和Set
区别:
- List有序,而Set的存储和取出都是无序的
- List中的元素可以重复,而Set不行
List
- ArrayList:增删慢,查询快,效率高,线程不安全
- LinkedList:增删快,查询慢,效率高,线程不安全
- Vector:增删慢,查询快,效率高,线程安全
所以,ArrayList更加偏向于需要查询数据的存储形式,因为他的地址连续。
而LinkedList地址随机,是基于链表的结构,所以在增删上有很大的优势。
在ArrayList的无参构造函数中,构造的长度不是一开始就为10的,是第一个对象存储进去之后,list的长度初始化为10
Set
- HashSet:底层是哈希表,存储无序,且所有元素只能单一存在,效率高,线程不安全,靠的是hashCode()和equals()来判断是否为统一对象。
- TreeSet:底层是二叉树来实现的,所以在创建TreeSet对象时,需要重写Comparable接口里的CompareTo()方法
- LinkedHashList:底层用链表和哈希表存储,保证了存储的顺序,线程不安全,效率高
值得注意的是,因为List是有序的,所以不仅可以用迭代,也可以用下标来遍历,但是Set不行,因为Set的存储完全是无序的,所以只能通过迭代来遍历
Map
Map用来保存具有映射关系的一对数据,分别是key和value,在这之中,key不能重复
HashMap
- HashMap线程不安全
- 可以放入null值的key或者value,但是key只能有一个为null
- key必须实现hashCode和equals的方法(因为key的根本是一个set)
- 因为key其实是set存储,所以也是不能保证键值对顺序的
- 不要使用可变对象作为key值,因为会导致hashCode的变化
HashTable
- 线程安全
- key和value中不能有空值
- 效率较差
- 同样的和HashMap一样,也是不能保证键值对的顺序,并且在使用时必须实现对象的equals和hashCode方法
TreeMap
- key的存储其实是TreeSet,所以要按照TreeSet那一套来
- 因为是TreeSet存储的key,所以他是能够排序的,基本数据类型可以自然排序,自定义数据类型需要重写comparable接口里的compareTo方法