Collection
集合是 java 中提供的一种容器,可以用来存储多个数据
数组的长度是固定的,集合的长度是可变的
数组中存储的是同一类型的元素,可以存储基本数据类型值,集合存储的都是对象,而且对象的类型可以不一致,在开发中一般对象多的时候,都是用集合进行存储
集合框架
- 集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection 和双列集合 java.util.Map
- Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是 java.util.List 和 java.util.Set 其中,List的特点是元素有序,元素可重复,Set的特点是元素无序,且不可重复,List接口的主要实现有 java.util.ArrayList 和 java.util.LinkedList, Set接口的主要实现有 java.util.HashSet 何 java.util.TreeSet
- 集合
- Collection 常用功能
所有单列集合的最顶层接口,定义了所有单列集合共性方法- public boolean add(E,e);
- public void clear();
- public boolean remove();
- public boolean contains();
- public boolean isEmpty();
- public int size();
- public Object[] toArray(); 把集合中的元素存储到数组中
java.util.List 接口 ,带索引的方法
1. public void add();
2. public E get(); 返回集合中指定位置的元素
3. public E remove();
4. public E set(); 用指定元素替换集合中指定位置的元素,返回被替换的元素
- ArrayList 集合(异步,多线程),底层就是一个数组结构,查询快,增删慢(每次都会创建新数组),查询功能多推荐使用,增删多不推荐使用
- LinkedList集合,List接口的链表实现,底层是链表结构,查询慢,增删快,方便添加和删除,注意: 使用LinkedList集合的特有方法,不能使用多态
- public void addFirst(E,e); 将制定元素插入此列表的开头
- public void addLast(E,e); 将制定元素插入此列表的结尾
- public void push(E,e) 将元素推入此列表所表示的堆栈
- public E getFirst(); 返回此列表第一个元素
- public E getLast(); 返回此列表最后一个元素
- public E removeFirst(); 移除并返回第一个元素
- public E removeLast(); 移除并返回最后一个元素
- public E pop(); 此列表所表示的堆栈处弹出一个元素
- public boolean isEmpty(); 如果列表不包含元素,返回true
- Vector集合(单列集合的祖宗,了解, 和ArrayList类似,底层为数组,(同步)单线程,速度慢)
java.util.Set接口 ,无索引,不重复
-
不允许存储重复的元素
-
没有索引及其方法,不能使用for遍历
-
java.util.HashSet 集合,implements Set接口
- 无序集合,存取顺序可能不一致
- 底层是一个哈希表结构,查询速度非常快
-
哈希值,是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,模拟得到的,不是数据存储的物理地址),Object类有一个方法,可以获取对象的哈希值: int hashCode();
-
哈希表(速度快)
- jdk1.8之前: 哈希表 = 数组 + 链表
- jdk1.8之后: 哈希表 = 数组 + 链表,哈希表 = 数组 + 红黑树(提高查询速度)
数组结构: 把元素进行分组(相同哈希值的元素是一组), 链表/红黑树结构把相同哈希值元素连到一起, 存储数据到集合中,先计算元素的哈希值(两个元素不痛,哈希值相同>哈希冲突)
如果链表的长度超过了8位,就会把链表转换为红黑树(提高查询速度)
-
Set为何不允许存储重复元素
Set集合在调用add的时候,会调用元素的hashCode方法和equals方法,判断元素是否重复,先判断hashCode再判断equals(前提必须重写hashCode和equals方法,内置类等已重写) -
LinkedHashSet 继承 HashSet, 底层是一个 哈希表+链表(多了一条链表,记录元素的存储顺序,保证元素有序)
Collections 集合工具类
- java.utils.Collections是集合工具类,用来对集合进行操作
- public static boolean addAll(Collection c, T …elements); 往集合中添加一些元素
- public static void shuffle(List<?> list); 打乱顺序,打乱集合顺序
- public static void sort(List list); 将集合中元素按照默认规则排序
ps: sort使用前提: 被排序的集合里存储的元素,必须实现Comparable接口,重写接口中的方法 compareTo定义排序规则(自己this 和别人 参数 比较, this.xxx - 参数.xxx为升序,反之降序) - public static void sort(List list, comparator<? super T>); 将集合中元素按照指定规则排序
comparator 相当于找一个裁判,比较两个(a1-a2: 升序,反之降序)