第八章:集合
数组和集合的区别
数组:一旦声明了数组长度无法改变,只能保持指定的数据类型,元素的数据类型必须相同,不能混排。
集合:长度和动态扩容,元素类型可以是任何类型,可以混合使用。
Collection接口
List接口
List接口:不唯一,有序(添加顺序)
ArrayList
ArrayList可以看作可变长度的数组,在内存中存储空间是连续的。
优点:随机访问或遍历时效率较高。
缺点:添加和删除元素时效率较低。
LinkedList
采用的链表结构进行存储,在内存中存储空间是不连续的。
优点:添加和删除元素是效率较高
缺点:随机访问或遍历时效率较低。
Vector
Vector类似与ArrayList的线性结构,Vector是基于线程安全的,在多线程中使用;ArrayList是非线程安全的,效率较高
Stack
Stack(栈):后进先出(Last In First Out) LIFO
Quence
队列:先进先出(First In First Out) FIFO
Set接口
无序(添加循序),不重复。
HashSet
HashSet:采用哈希表的方式存储。
优点:查询,添加,删除效率较高
HashSet如何保证其元素的唯一性?
在添加元素时调用hashCode()获取元素的哈希码,判断要添加元素的哈希码是否相同,如果相同调用equals方法比较内容是否相同;如果哈希码不相同,equals方法将不再调用。
如果两个对象的equals比较的结果为true,其hashCode一定相同;反之则不成立。
LinkedHashSet
LinkedHashSet继承了HashSet,采用的是哈希码+链表的结构进行存储,其中的元素有序(添加顺序)。
TreeSet
TreeSet:采用二叉树的方式进行存储,其中元素有序(大小顺序)。要添加元素是必须实现Comparable接口或传入一个比较器(需要实现Comparator接口)
Map接口
Map接口并不是Collection接口的子接口,Map接口采用的键值对方式进行存储数据。
HashMap
HashMap类似于HashSet,采用的是哈希码进行存储
无序。
Hashtable
Hashtable与HashMap类似,不同之处主要是以下两点:
1.HashMap是非线程安全的,而Hashtable是线程安全的
2.HashMap中的键和值都运行为null,而Hashtable不允许。
LinkedHashMap
LinkedHashMap是HashMap的子类,类似于LinkedHashSet,采用的是哈希表+链表的结构存储数据。其中元素是有序的(添加顺序)
TreeMap
TreeMap采用二叉树的方式存储,与TreeSet类似。其中的元素有序(大小顺序)。
要求添加的元素必须是可比较大小
1.实现Comparable接口
2.创建一个比较器(实现Comparator接口)
在添加元素时根据键的自然顺序进行存储数据。
Collections类
Collections类是一个对Collection集合进行操作的工具类型,其中提供一些静态的工具方法方便操作
sort()
reverse()
binaySearch()
.....