容器总结

容器架构

image

数组就是一种容器,可以在其中放置对象或基本类型数据。

数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。

数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。

Collection

  1. Collection 表示一组对象,它是集中、收集的意思,就是把一些数据收集起来。

  2. Collection接口的两个子接口:

    1. List中的元素有顺序,可重复。常用的实现类有ArrayList、LinkedList和 vector

​ Ø ArrayList特点:查询效率高,增删效率低,线程不安全。

​ Ø LinkedList特点:查询效率低,增删效率高,线程不安全。

​ Ø vector特点:线程安全,效率低,其它特征类似于ArrayList

  1. Set中的元素没有顺序,不可重复。常用的实现类有HashSet和TreeSet

​ Ø HashSet特点:采用哈希算法实现,查询效率和增删效率都比较高。

​ Ø TreeSet特点:内部需要对存储的元素进行排序。因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。

泛型

本质是数据类型的参数化。可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。提高了代码可读性和安全性。<T,E,V>

Collection接口

Collection接口的两个子接口是List、Set接口。

image

这里注意的是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。

image

ArraryList

ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它

增删效率低,本质是数组的复制。

System.arraycopy(elementData, index, elementData, index + 1,
                 size - index);

LinkedList

LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。

image

Vector向量

底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”

Map

image

底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。

HashMap

HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们以后理解很多技术都非常有帮助(比如:redis数据库的核心技术和HashMap一样),因此,非常有必要让大家理解。

数据结构中由数组和链表来实现对数据的存储,他们各有特点。

(1) 数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低。

(2) 链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。

那么,我们能不能结合数组和链表的优点(即查询快,增删效率也高)呢? 答案就是“哈希表”。

哈希表的本质就是“数组+链表”。

TreeMap

TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap

排序顺序需要实现Comparable接口。

HashTable

HashMap与HashTable的区别

  1. HashMap: 线程不安全,效率高。允许key或value为null。

  2. 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进行排序、填充、查找元素的辅助方法。

  1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。

  2. void shuffle(List) //对List容器内的元素进行随机排列。

  3. void reverse(List) //对List容器内的元素进行逆续排列 。

  4. void fill(List, Object) //用一个特定的对象重写整个List容器。

  5. int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查找特定对象。

posted @ 2021-05-12 20:23  我来自火星  阅读(58)  评论(0)    收藏  举报