3.java集合体系。
集合框架图:
可以看到集合框架包括两大容器:
- 集合(Collection):存储一个元素
- Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
- Map():存储键/值对映射
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
- 接口:
是代表集合的抽象数据类型
。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象 - 实现(类):
是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构
,例如:ArrayList、LinkedList、HashSet、HashMap。 - 算法:
是实现集合接口的对象里的方法执行的一些有用的计算
,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
集合接口
名称 | 描述 |
---|---|
Collection 接口 | Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。 Collection 接口存储一组不唯一,无序的对象。 |
List 接口 | List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。 List 接口存储一组不唯一,有序(插入顺序)的对象。 |
Set | Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素. Set 接口存储一组唯一,无序的对象。 |
SortedSet | 继承于Set保存有序的集合。 |
Map | Map 接口存储一组键值对象,提供key(键)到value(值)的映射。 |
Map.Entry | 描述在一个Map中的一个元素(键/值对)。是一个 Map 的内部接口。 |
SortedMap | 继承于 Map,使 Key 保持在升序排列。 |
Enumeration | 这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。 |
Set和List的区别
- Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
- Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
- List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
经常用到的集合详解:
- list:
继承至Collection接口
-
ArrayList:
- 优缺点:
优点: 底层数据结构是数组,查询快 !
缺点: 线程不安全,增删慢。 - 方法汇总:
方法 描述 add() 将元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 删除 arraylist 中的所有元素 clone() 复制一份 arraylist contains() 判断元素是否在 arraylist get() 通过索引值获取 arraylist 中的元素 indexOf() 返回 arraylist 中元素的索引值 removeAll() 删除存在于指定集合中的 arraylist 里的所有元素 remove() 删除 arraylist 里的单个元素 size() 返回 arraylist 里元素数量 isEmpty() 判断 arraylist 是否为空 subList() 截取部分 arraylist 的元素 set() 替换 arraylist 中指定索引的元素 sort() 对 arraylist 元素进行排序 toArray() 将 arraylist 转换为数组 toString() 将 arraylist 转换为字符串 ensureCapacity() 将 arraylist 转换为字符串 ensureCapacity() 设置指定容量大小的 arraylist lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置 retainAll() 保留 arraylist 中在指定集合中也存在的那些元素 containsAll() 查看 arraylist 是否包含指定集合中的所有元素 trimToSize() 将 arraylist 中的容量调整为数组中的元素个数 removeRange() 删除 arraylist 中指定索引之间存在的元素 replaceAll() 将给定的操作内容替换掉数组中每一个元素 removeIf() 删除所有满足特定条件的 arraylist 元素 forEach() 遍历 arraylist 中每一个元素并执行特定操作 - 语法:
public class RunoobTest { public static void main(String[] args) { ArrayList<String> sites = new ArrayList<String>(); //添加元素 sites.add("Google"); //添加元素到 ArrayList sites.add("Runoob");//添加元素到 ArrayList sites.add("Taobao");//添加元素到 ArrayList sites.add("Weibo");//添加元素到 ArrayList System.out.println(sites); //输出结果为:Runoob //获取一个元素 /*注意:这里的数组的索引值从 0 开始*/ System.out.println(sites.get(1));// 访问第二个元素 //输出结果为:[Google, Runoob, Wiki, Weibo] //修改一个元素 sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值 System.out.println(sites); //输出结果为:[Google, Runoob, Wiki, Weibo] //删除一个元素 sites.remove(3); // 删除第四个元素 System.out.println(sites); //输出结果为:[Google, Runoob, Taobao] //计算大小 System.out.println(sites.size()); //输出结果为:4 //迭代数组列表 for (int i = 0; i < sites.size(); i++) { System.out.println(sites.get(i)); } //输出结果为:Google Runoob Taobao Weibo } }
- 实例:
import java.util.*; //循环遍历出ArrayList中的值 public class Test{ public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("Hello"); list.add("World"); list.add("HAHAHAHA"); //第一种遍历方法使用 For-Each 遍历 List for (String str : list) { //也可以改写 for(int i=0;i<list.size();i++) 这种形式 System.out.println(str); } //第二种遍历,把链表变为数组相关的内容进行遍历 String[] strArray=new String[list.size()]; list.toArray(strArray); for(int i=0;i<strArray.length;i++) //这里也可以改写为 for(String str:strArray) 这种形式 { System.out.println(strArray[i]); } //第三种遍历 使用迭代器进行相关遍历 Iterator<String> ite=list.iterator(); while(ite.hasNext())//判断下一个元素之后有值 { System.out.println(ite.next()); } } }
- 优缺点:
-
LinkedList:
- 简介:
LinkedList 继承了 AbstractSequentialList 类。
LinkedList 实现了 Queue 接口,可作为队列使用。
LinkedList 实现了 List 接口,可进行列表的相关操作。
LinkedList 实现了 Deque 接口,可作为队列使用。
LinkedList 实现了 Cloneable 接口,可实现克隆。 - LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输
-
// 引入 LinkedList 类 import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>(); // 普通创建方法 或者 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
- 优缺点:
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高 - 实例:
public class RunoobTest { public static void main(String[] args) { LinkedList<String> sites = new LinkedList<String>(); sites.add("Google"); sites.add("Runoob"); sites.add("Taobao"); sites.add("Weibo"); System.out.println(sites); } } //输出结果:[Google, Runoob, Taobao, Weibo]
- 常用方法
方法 方法描述 public boolean add(E e) 链表末尾添加元素,返回是否成功,成功为 true,失败为 false。 public void add(int index, E element) 向指定位置插入元素。 public boolean addAll(Collection c) 将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。 public void clear() 清空链表。 public E remove(int index) 删除指定位置的元素。
-
- 简介:
-
vector
- 说明:
该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。
- 优缺点
优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低
- stack(栈)
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
- 说明:
-
- set:
继承至Collection接口
- hashSet
- HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。
- 基本类型对应的包装类表如下:
基本类型 引用类型 boolean Boolean byte Byte short Short int Integer long Long float Float double Double char Character - 语法:
import java.util.HashSet; // 引入 HashSet 类
- 实例
// 引入 HashSet 类 import java.util.HashSet; public class RunoobTest { public static void main(String[] args) { HashSet<String> sites = new HashSet<String>(); //添加元素 sites.add("Google"); sites.add("Runoob"); sites.add("Taobao"); sites.add("Zhihu"); sites.add("Runoob"); // 重复的元素不会被添加 System.out.println(sites); //输出结果:[Google, Runoob, Zhihu, Taobao] //判断元素是否存在 System.out.println(sites.contains("Taobao")); //输出结果: true //删除集合中的元素 sites.remove("Taobao"); // 删除某个元素,删除成功返回 true,否则为 false System.out.println(sites); //输出结果:[Google, Runoob, Zhihu] sites.clear(); // 清空集合 System.out.println(sites); 输出结果: [] //计算大小 System.out.println(sites.size()); //输出结果:4 //迭代HashSet for (String i : sites) { System.out.println(i); } //输出结果:Google Runoob Zhihu Taobao } }
- linkedHashSet
- 底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
- 底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
- TreeSet
- 底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?
自然排序
比较器排序 - 如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
- 如何保证元素排序的呢?
- 底层数据结构是红黑树。(唯一,有序)
- hashSet
- map:
独立接口
三个重要的实现类:- HashMap
- TreeMap
- HashTable
- 对比图:
HashMap HashTable TreeMap 顺序 无序 无序 有序 方法是否同步 不同步 同步 - 线程是否安全 不安全 安全 - 效率 较高 较低 - null值 允许null值(key和value都允许) 不允许有null值 - 父类 AbstractMap Dictionary -
部分内容借鉴自:https://blog.csdn.net/zhangqunshuai/article/details/80660974