一.List接口
1.List的特点:
有序(存和取的顺序一致),有索引,元素可以重复。
增
void add(int index,E e) :在指定位置添加元素
删
E remove(int index): 删除指定位置的元素 并返回被删除的元素
改
E set(int index,E e): 将指定位置元素使用新的元素替换掉
查
E get(int index): 根据索引获取指定位置元素
二. 数据结构
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率
1.堆栈
特点:先进后出
压栈:
把数据放入栈
弹栈:
把数据取出来
2.队列
特点:先进先出
3.数组
特点:查询快,增删慢。
4.链表
特点:查询慢,增删快
5.红黑树:是二叉树的一种
特点:提高搜索效率
三.LinkedList集合
底层是链表结构(双向链表)
E getFirst()
返回此列表的第一个元素。
E getLast()
返回此列表的最后一个元素。
void addFirst(E e)
将指定元素插入此列表的开头。
void addLast(E e)
将指定元素添加到此列表的结尾。
E removeFirst()
移除并返回此列表的第一个元素。
E removeLast()
移除并返回此列表的最后一个元素。
E get(int index);
LinkedList集合底层是使用的链表结构实现的,但为什么可以使用索引来操作元素值。
使用索引是为了提高对集合的查询效率。
四:Set集合
特点:无序,无索引,元素唯一
实现类:HashSet --> 底层hash表结构
1. java.util.Set接口
无序接口 保证集合中元素的唯一性 不能保证元素存取顺序一致
Collection中的子接口 Set没有定义特殊的功能 所以 使用的都是Collection中定义的
HashSet就是Set最主要的一个实现类
通过哈希表保证存储元素的唯一性,不能保证存取顺序一致
通过现象研究原理
原理写到这里:
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,
保证元素唯一性的方式依赖于:hashCode与equals方法。
元素存储的时候
会根据元素的hashCode方法算出一个哈希值,代表了元素被存储的位置。
若该位置上无其他元素,可以存储到该位置上
如果该位置上有相同的哈希值的元素,这个现象叫哈希冲突
哈希冲突,再使用该元素的equals方法与该位置上所有的元素进行比较
只要有一个结果为true 说明添加的是一个重复元素 不存
如果结果都是false,没有重复的元素 存
哈希表
数组+链表
JDK8之后 同位置上如果 小于 8个元素 数组+链表 --> 单向链表
超过 8个元素 数组+红黑树 --> 提高对元素的搜索效率
我们一般说对象是否重复 指的是 里面的成员属性是否全部一致
所以如果我们使用HashSet存储自定义类型的话 那么必须重写hashCode和equals
使用快捷键 Alt + (Fn)insert
总结:
HashSet保证元素唯一是跟两个方法有关:hashCode,equals()
先执行hashCode方法,如果hashCode值相等才会执行equlas();
会先判断两个对象的hashCode值是否相等,
如果不相等:直接添加元素到集合中
如果两个对象的hashCode值相等:会使用equals()比较他们的地址值或者属性值。
如果equals方法相等(true):不添加
如果equals方法不相等(false):添加
LinkedHashSet集合可以保证元素存和取顺序是一致的。
五:可变参数
JDK1.5之后的新特性 如果多个参数类型一样 就可以使用可变参数形式书写
修饰符 返回值类型 方法名(数据类型... 变量名)
等效于
修饰符 返回值类型 方法名(数据类型[] 变量名)
可变参数 其实就是一个数组
注意:可变参数后面不能再有其他参数。可变参数之间可以有其他参数
错误写法: public static void sum(int... array,String str){ }
六:Collections 集合工具类
- public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
- public static void shuffle(List<?> list):打乱集合顺序。
- public static <T> void sort(List<T> list):将集合中元素按照默认规则排序(自然排序)。
补充:
HashSet的数据结构 --> 是Hash表结构
在jdk8之前,使用的就是数组+链表的结构
数组记录的是Hash值,而链表记录的是Hash值对应元素的地址值。因为我们不能保证
会有Hash值相同,而元素不同的情况。
在jdk8之后,如果在同一个Hash值下的元素,不超过8个元素。使用的还是:数组+链表的结构
如果超过了8个元素。为了提高对元素的搜索效率,使用了:数组 + 红黑树的结构。
因为我们知道,红黑树就是为了提高搜索效率的。