常见的数据结构:
- 栈:先进后出,进口也是出口。
- 队列:先进先出。有进口也有出口。
- 数组:增删慢,查询快。
- 链表:增删快,查询慢。
在集合中创建的数据接口:
- ArrayXXX:底层数据结构是数组:查询快,增删慢。
- LinkedXXX:底层数据结构是链表:查询慢,增删快。
- HashXXX:底层的数据结构是哈希表,依赖hashCode()和equals()方法
- TreeXXX:底层的数据结构是二叉树。
两种排序的方式:
自然排序:使元素实现comparable接口。
比较器排序:创建集合是构造方法接收一个实现了Comparable接口的类的对象
集合:
collection:
集合和数组的区别:
- 长度区别:
数组长度固定。
集合长度可变 - 内容区别:
数组的类型可以是基本数据类型,也可以是引用类型。
集合只能存储引用类型。 - 元素区别:
数组只能存储同一种类型。
集合可以存储不同的数据类型。(一般情况下存储的还是同一种类型。)
集合的继承体系:
List:有序的,可重复的。
- ArrayList:底层使用的数组的数据结构,查询快,增删慢。线程不安全,效率高。
- Vector:底层使用的也是数组的数据结构。线程安全,效率低。
- LinkedList:底层使用的链表的数据结构。增删快,查询慢。
Set:无序的,不可重复的。
HashSet:
底层的数据结构是哈希表,哈希表底层依赖两个方面:hashCode()和equals();
执行的顺序:
首先比较hashCode(),哈希值是否相等。
相同:继续执行equals()方法。
返回true元素重复了,不添加。
返回false:直接把元素添加到集合。
不相同:就把直接把元素放到集合中
LinkedHashSet:有序的并且唯一的,底层的数据结构是链表和哈希表,链表控制顺序,哈希表控制元素的唯一。
TreeSet:
底层数据结构是红黑数(一个自平衡的二叉树)
保证元素的排序的方式:
- 自然排序:
让元素所属的类实现comparable的接口。 - 比较器排序:
让集合的构造方法接收Comparable的实现类对象。
Map:
以键值对的方式存储数据,不能有重复的键,每个键最多对应一个值。
Map和Collection的区别:
- Map:以键值对的形式存储数据,键是唯一的,值可以重复。
- collection :存储单个元素。子接口:List有序的,元素可以重复。Set无序的,不可以重复,唯一的
hashMap:
基于哈希表实现。通过hashCode和equals确保键的唯一性。
treeMap
红黑树,默认根据key来排序,创建的时候构造方法需要接收一个实现了
comparable接口的实现类的对象,或者key值的类相同并实现了comparable接口。
Collections
Collections是针对集合进行操作的工具类。
Collection和Collections的区别
一个是集合的最顶层接口,一个是操作集合的工具类。
常用方法:
sort(Collection):对集合进行排序
reverse():反转集合中元素的顺序
集合关于线程的问题:
一:早期的线程安全集合:
Vector:Vector和ArrayList一样,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,他几乎给所有的public 修饰的方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用
HashTable :
HashTable和HashMap类似,不同点是HashTable是线程安全的,它给几乎所有public方法都加上了synchronized关键字,还有一个不同点是HashTable的K,V都不能是null,但HashMap可以,它现在也因为性能原因被弃用了
二:Collections包装方法
当Vector和HashTable弃用用之后,Collections提供了一系列的包装方法,把他们都包装成线程安全的集合。
Collections针对每一种集合都生命了一个线程安全的包装类,在原集合的基础上添加锁对象,集合中的每个方法都通过这个锁对象进行同步。
三:java.util.concurrent包中的集合
ConcurrentHashMap和HashTable都是线程安全的集合,他们的不同主要是加锁粒度的不同,CopyOnWriteArrayList和CopyOnWriteArraySet
它们是加了写锁的ArrayList和ArraySet,锁住的是整个对象,但读操作可以并发执行