本文是学习Java时所记录的学习笔记,本节包含了集合的介绍,重点记录了集合中特性的部分,是从《疯狂Java讲义第四版》中学习。欢迎留言、私信交流~~
文章目录
集合API
继承树
Collection集合体系的继承树
Map集合体系的继承树
Collection集合
- Java Collection Framework API。也叫容器类。
- 只存储了一组对象,一次可以添加一个元素。
- 三种底层模式:数组、栈(先进后出)、队列(先进先出)。
Set集合
- 就是Collection。它们的行为完全相似。
- 该类是子接口,相当于标准的Collection。
- Collection相关方法
- removeALL() //集合相减。
- addALL() //集合相减,不重复。
- retainAll() //求交集部分。
- 遍历Set集合,有两种方式:
- 用迭代器。
//例子 Iterator it = paramMap.entrySet().iterator(); //判断是否还有值 while (it.hasNext()){ //把it中的当前值取出来,强转为键值对类型 Map.Entry entry = (Map.Entry)it.next(); String mapKey = entry.getKey(); String mapValue = ""; //通常map中value的类型是String[],一般需要先将value赋值给object,然后通过判断再赋值给String[] Object obj = entry.getValue(); if(obj instanceof String[]){ String[] strs = (String[])obj; mapValue = Arrays.toString(strs); } }
- 用foreach循环。
- 用迭代器。
HashSet
- HashSet的存储机制:底层用一个数组存元素,数组元素只能是2的N次方。
- 最理想的情况向,HashSet的性能几乎可以和数组匹敌,存储性能非常高。
- 通过计算HashCode来确认元素存储位置(所以可以说是无序存储)。
- HashSet是Set的实现类。
- 在HashSet没有大量出现“链表”的情况下,HashSet性能比TreeSet性能好。
- 如果经常出现“rehash”,性能就没有TreeSet好。
- 构造器
- HashSet的构造器:HashSet(int initialCapacity,float loadFactor)
- [initialCapacity] - 控制底层数组的长度,默认是16。如果传入的数组长度不是2的N次方,则HashSet会自动将他扩展到2的N次方。
- [loadFactor] - 当HashSet元素达到这个百分比时(默认0.75),再次创建一个长度为原有数组长度2倍的数组。原来的数组变为垃圾——并且要把原有数组的元素复制到新数组种,专业说法叫“rehash(重hash)”。
- HashSet的构造器:HashSet(int initialCapacity,float loadFactor)
- HashSet存入机制
- 当有元素加进来时,HashSet会调用该对象的hashCode()方法,得到一个int值。
- 根据hashCode()返回的int值,计算出它在【底层数组】的存储位置(数组中索引)。
- 如果要加入的位置是空的,直接放入。
- 如果要加入的位置已经有元素,此处就会形成“链表”。
- HashSet取元素机制
- 当有取一个元素时,HashSet会调用该对象的hashCode()方法,得到一个int值。
- 根据hashCode()返回的int值,计算出它在【底层数组】的存储位置。
- 如果该位置恰好是要找的元素,直接取出即可。
- 如果该位置有链表,HashSet要“逐个”搜索链表里的元素。
- HashSet两个对象是相等的判断条件
- 两个对象的hashCode()返回值相等。
- 两个对象通过equals比较也返回true。
- 要求自定义类的hashCode()与equals()方法是一致的。(要求程序重写equals()所用的关键属性,与计算hashCode()所用到的关键属性相同)
- 例子
import java.util.*; HashSet<String> h1 = new HashSet<>(); h1.add("1雷军"); h1.add("2王兴");
LinkedHashSet
- LinkedHashSet 是HashSet的子类,与HashSet的存储机制相似。
- 但LinkedHashSet额外的维护一个链表,可以记住元素的添加顺序。
- HashSet的子类,有序。
TreeSet
- 保证Set里的元素是“大小”排序。字符串的大小是一次比较每个字符串unicode值。
- 它是标准的“红黑树”。
- 树 → 二叉树 → 排序二叉树 → 平衡排序二叉树 → 红黑树。
- Set-SortedSet的实现类。
- TreeSet的存入、检索机制
- 底层用一颗“红黑树”存放所有数据。
- 元素存入、检索的性能比较好。
- TreeSet与HashSet的区别
- TreeSet不会像HashSet有“空”值。
- TreeSet可以保证集合元素是按“大小”排序的。
- TreeSet两个对象判断相等的条件
- 只要两个对象通过compareTo比较返回0,TreeSet认为他们是相等的。
- 要求集合元素必须是可以比较大小的。
- Java比较大小有两种方式:
- 自然排序(所有集合元素实现Comparable接口)
- 定制排序(要求创建TreeSet时,提供Comparator对象)
- Comparator对象负责对元素进行比较大小。
- 可以重写compare对TreeSet进行排序。对象的比较可以用compareTo。
List集合
- 可以根据索引存储元素。
- 子接口,线性表,数组实现存储元素。类似于竹筒,有索引。
ArrayList
- List的实现类,数组实现。
- 优点:可以根据底层数组的索引存取元素,所以性能非常快。
- 缺点:当插入元素、删除元素,后面的所有元素要跟着整体移动。
- ArrayList与Vector的区别
- ArrayList与Vector的存储机制:
- 它们底层完全基于数组。
- ArrayList与Vector的区别:
- Vector是老版本的技术。
- ArrayList是线程不安全的,Vector是线程安全的。
- ArrayList的性能比Vector要好。
- 可以使用Collections把ArrayList转换成线程安全的。
- ArrayList与Vector的存储机制:
LinkedList
- 实现类,是List和Deque的实现类,链表。
- 即是线性表,又是队列,还是栈。LinkedList底层是基于链表实现的。
- 优点:插入元素、删除元素时,无需整体移动,所以性能非常快。
- 缺点:由于底层采用链表存储元素,因此根据索引存取元素时,性能较慢。
Queue集合
- 子接口,特征为队列:先进先出,后进后出。
Deque
- 功能被限制的线性表。既是队列,又是栈。
- Queue的子接口。是双端队列。可以先进先出和后进先出都可以。
ArrayDeque
- Deque的实现类,基于数组实现。
- 栈模式
Dequ<String> deque = new ArrayDeque<>(); //把Deque当栈用。 push() //存入 pop() //取出 peek() //访问栈顶元素,并不弹出
- 队列模式
Dequ<String> deque = new ArrayDeque<>(); //把Deque当栈用。 offer() //添加元素 poll() //从队列头部取出元素 peek() //访问栈顶元素,并不弹出
Map集合
- 每次可以添加一对元素,被称为双列集合。
- 存放的内容为:key-value对。
- 以键值对的形式存储数据,但键不能重复,键具有唯一性。
HashMap
- 根据key的hashCode()方法的返回值来计算key的存、取位置。
- HashMap判断两个key重复的条件
- 通过equals比较返回true。
- 两个key的hashCode()返回值相等。
Hashtable
- Hashtable和HashMap几乎相同。
- HashTable和HashMap的区别
- Hashtable是从JDK1.0就有的,尽量少用。
- Hashtable不允许使用unll作为key、value。但HashMap允许。
- Hashtable是线程安全(实现不好),HashMap是线程不安全。HashMap性能好。
TreeMap
- 底层的红黑树只对key进行排序。
- treeMap要求key必须是可比较大小:
- 自然排序:要求所有key实现Comparable接口。
- 定制排序:要求创建TreeMap时提供一个Comparator接口。
- treeMap判断两个key重复的条件
- 通过compareTo()比较大小时返回0,表明两个元素相等。
操作集合的工具类(collections)
- Collections类
方法名称 说明 reverse() 反转 synchronizedXxx 把原有的集合,包装成线程安全的集合。 sway(List<?> list,int i,int j) 把指定集合的2个位置互换。 shuffle(List<?> list) 将list集合元素进行随机排列。
相关知识
参考资料
- 《疯狂Java讲义(第4版)》 李刚