容器总结
容器架构
数组就是一种容器,可以在其中放置对象或基本类型数据。
数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。
数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。
Collection
-
Collection
表示一组对象,它是集中、收集的意思,就是把一些数据收集起来。 -
Collection
接口的两个子接口:- List中的元素有顺序,可重复。常用的实现类有
ArrayList、LinkedList和 vector
。
- List中的元素有顺序,可重复。常用的实现类有
Ø ArrayList
特点:查询效率高,增删效率低,线程不安全。
Ø LinkedList
特点:查询效率低,增删效率高,线程不安全。
Ø vector
特点:线程安全,效率低,其它特征类似于ArrayList
。
Set
中的元素没有顺序,不可重复。常用的实现类有HashSet和TreeSet
。
Ø HashSe
t特点:采用哈希算法实现,查询效率和增删效率都比较高。
Ø TreeSet
特点:内部需要对存储的元素进行排序。因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()
方法比较对象之间的大小,才能进行内部排序。
泛型
本质是数据类型的参数化。可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。提高了代码可读性和安全性。<T,E,V>
Collection接口
Collection接口的两个子接口是List、Set接口。
这里注意的是remove是移除元素,而不是删除元素,具体来说是删除了原来的引用,但是引用的对象还是存在。
前面的方法都是针对元素操作,后面的针对集合操作。
Collection<String> c = new ArrayList<>();
c.add("hello");
c.add("world");
Object[] obj = c.toArray();//返回的是Object
String[] str = c.toArray(new String[0]);//返回String
list
有序,可重复容器。
List接口常用的实现类有3个:ArrayList、LinkedList和Vector。
ArraryList
ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它
增删效率低,本质是数组的复制。
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
LinkedList
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
Vector向量
底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”
Map
底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。
HashMap
HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们以后理解很多技术都非常有帮助(比如:redis数据库的核心技术和HashMap一样),因此,非常有必要让大家理解。
数据结构中由数组和链表来实现对数据的存储,他们各有特点。
(1) 数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低。
(2) 链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。
那么,我们能不能结合数组和链表的优点(即查询快,增删效率也高)呢? 答案就是“哈希表”。
哈希表的本质就是“数组+链表”。
TreeMap
TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap。
排序顺序需要实现Comparable
接口。
HashTable
HashMap与HashTable的区别
-
HashMap: 线程不安全,效率高。允许key或value为null。
-
HashTable: 线程安全,效率低。不允许key或value为null。
Set
Set容器特点:无序、不可重复。
HashSet
HashSet是采用哈希算法实现,底层实际是用HashMap
实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。
TreeSet
TreeSet
底层实际是用TreeMap
实现的,内部维持了一个简化版的TreeMap
,通过key
来存储Set
的元素。 TreeSet
内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable
接口。这样,才能根据compareTo()
方法比较对象之间的大小,才能进行内部排序。
Iterator
可边遍历边删除元素。
Collection工具类
类 java.util.Collections
提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
-
void sort(List)
//对List容器内的元素排序,排序的规则是按照升序进行排序。 -
void shuffle(List)
//对List容器内的元素进行随机排列。 -
void reverse(List)
//对List容器内的元素进行逆续排列 。 -
void fill(List, Object)
//用一个特定的对象重写整个List容器。 -
int binarySearch(List, Object)
//对于顺序的List容器,采用折半查找的方法查找特定对象。