文字数:约2400字 阅读时间:40分钟
此文章为学习总结类型,文字很多且皆为基础知识
一.List集合数据结构
List 接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点。
1.数据存储的常用结构
1.1堆栈结构(简称:栈)
1.1.1 特点
先进后出:存进去的元素,要将在它后面的元素依次取出后才能取出这个元素;栈的入口、出口都是栈的顶端位置
1.1.2 应用场景
Java中的方法运行时所用的内存空间结构就是堆栈结构;英文单词:Stack
1.2队列
1.2.1 特点
先进先出:存进去的元素,要将在它前面的元素依次取出后才能取出这个元素
1.2.2 应用场景
凡是需要排队的地方均可以使用
例如,安检。排成一列,每个人依次检查,只有前面的人全部检查完毕后,才能排到当前的人进行检查;英语单词:Queue
堆与队列的示意图:
1.3数组
1.3.1 特点
查找元素快:通过索引,可以快速访问指定位置的元素
增删慢:增删时会重新复制新建一个数组
1.3.2 应用场景
容器的查询次数多,修改次数少的时候可以使用;英语单词:ArrayList
1.4链表结构
1.4.1 特点
多个节点之间,通过地址进行连接,呈现链式链接(查询慢,增删快)
1.4.2 应用场景
凡是增删多,查询少的时候都可以使用;英语单词:LinkedList
数组与链表示意图:
2.LinkedList 集合
2.1介绍
List 接口的链接列表实现,为对集合的开头和结尾的进行操作提供了一系列方法
2.2与链式结构相关的方法
LinkedList():构造一个空列表。
LinkedList(Collection<? extends E> c):构造一个包含指定 collection 中的元素的列表,
这些元素按其 collection 的迭代器返回的顺序排列。
2.3 常用方法
addFirst(E e):将指定元素插入此列表的开头。
addLast(E e):将指定元素添加到此列表的结尾。
getFirst():返回此列表的第一个元素。
getLast():返回此列表的最后一个元素。
offerFirst(E e):在此列表的开头插入指定的元素。
offerLast(E e): 在此列表末尾插入指定的元素。
peekFirst():获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
peekLast():获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
pollFirst():获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
pollLast() :获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
removeFirst():移除并返回此列表的第一个元素。
removeLast():移除并返回此列表的最后一个元素。
pop(): 从此列表所表示的堆栈处弹出一个元素。(此方法等效于 removeFirst())
push(E e):将元素推入此列表所表示的堆栈(此方法等效于 addFirst(E) )
2.4 List集合的特点
可以存储重复的元素
有序(有索引)
可以存放多个null值
二.Set集合数据结构
1. 概述
一个不包含重复元素的Collection集合,并且最多只能包含一个NULL值
2. 常用的子类
2.1 HashSet
2.1.1 构造方法
HashSet(): 构造一个新的空 set
HashSet(Collection<? extends E> c):构造一个包含指定 collection 中的元素的新 set。
2.1.2 常用方法
参考Collection中的方法
2.2 LinkedHashSet
LinkedHashSet属于HashSet子类,可以保证存值的顺序与取值的顺序一致;
使用方式与HashSet一致
(上述两个集合的数据结构中都包含hash表结构)
3. Hash表
3.1 介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。
保证 HashSet 集合元素的唯一,其实就是根据对象的 hashCode 和 equals 方法来,决定的
哈希表与哈希值理解图:
3.2 Hash表结构
在判断元素是否重复的时候,会先判断元素的hash值;如果hash值一致的情况下,再次判断equals方法
3.3 HashCode方法
3.3.1 作用
提升hash表性能
3.3.2 hashCode 的常规协定是
1)在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
2) 如果根据 equals(Object) 方法,两个对象是相等的,
那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
3) 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法时一定生成不同的整数结果。但是,程序员应该意识到,因为不相等的对象生成不同整数结果可以提高哈希表的性能。
3.4 生成规则
1) 如果没有重写hashCode方法,那么将按照Object中的hashCode方法生成(通过内部地址生成)
2) 如果重写了hashCode方法,那么将按照子类中的成员变量的hash值生成!!!
3.4.1注意
自定义数据类型,必须同时重写equals方法和hashCode方法,缺一不可!!!
4. HashSet与list判断元素是否重复的规则
4.1 hashSet的Contains方法
比较的时候,直接通过参数对象的hash值比较一次,再通过equals方法确认一次即可;
4.2 List的Contains方法
比较的时候,按集合中元素的顺序逐次与参数比较,直到比完或比对成功为止!效率低!仅仅依赖equals方法,不使用hashcode方法;
5. Set集合的特点
1) 不可以存放重复的元素
2) 无序;(无索引)(不能保证存值的顺序与取值的顺序一致)
3) 最多只能存放一个null值
为更好理解set集合的唯一性,下图粗浅的解析了set中add方法的源码
三. Collection总结
1. List集合
可以存储重复元素,有序的(元素存取顺序)
1.1 ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
1.2 LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
2. Set集合
不能存储重复元素,无序的(元素存取顺序)
2.1 HashSet
1) 元素唯一不能重复
2) 底层结构是哈希表结构
3) 元素的存与取的顺序不能保证一致
如何保证元素的唯一的?
重写hashCode() 与 equals()方法
2.2 LinkedHashSet
1) 元素唯一不能重复
2) 底层结构是 哈希表结构 + 链表结构
3) 元素的存与取的顺序一致
3. Collection成员方法
add(Object e) :把给定的对象添加到当前集合中
clear() :清空集合中所有的元素
remove(Object o) :把给定的对象在当前集合中删除
contains(Object o) :判断当前集合中是否包含给定的对象
boolean isEmpty() :判断当前集合是否为空
Iterator iterator() :迭代器,用来遍历集合中的元素的
int size() :返回集合中元素的个数
toArray() :把集合中的元素,存储到数组中
Collection集合结构图:
4. Iterator : 迭代器
next(): 返回迭代的下一个元素
hasNext(): 如果仍有元素可以迭代,则返回 true。
5. List与Set集合的区别?
List:它是一个有序的集合(元素存与取的顺序相同),它可以存储重复的元素
Set:它是一个无序的集合(元素存与取的顺序可能不同),它不能存储重复的元素
6. List集合中的特有方法
add(int index, Object element) :将指定的元素,添加到该集合中的指定位置上
get(int index):返回集合中指定位置的元素。
remove(int index) :移除列表中指定位置的元素, 返回的是被移除的元素
set(int index, Object element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素
7. 增强for
简化数组和Collection集合的遍历
格式:for(元素数据类型 变量 : 数组或者Collection集合) {使用变量即可,该变量就是元素}
好处:简化遍历
8. 泛型
用来约束数据的数据类型
格式: <泛型名>
泛型的好处:
1) 提高了程序的安全性
2) 将运行期遇到的问题转移到了编译期
3) 省去了类型强转的麻烦