栈:先进后出,当存入一个元素继续存下一个元素时,会出现要存入的元素对已经存入的元素进行压栈,所以取出元素时的顺序为先存入的元素后取出
队列:先进先出,横向队列
链表:通过一个链子把多个结点(元素)连接起来,该结点由地址和数据组成,结点本身还有一个地址值。
特点:查询慢,增删快
分类:1.单向链表: 结点元素由下一个结点的地址和数据组成
1.1单向循环链表:最后一个结点存储的地址是第一个结点的地址
1.2普通单向链表:
2.双向链表: 结点由数据和下一个结点的地址和上一个结点的地址组成。
2.1双向循环链表:最后一个结点存储的两个地址分别是第一个元素的地址和上一个元素的地址。
2.2 普通双向链表
数组:查询快增删慢
hash:散列,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。所以散列值的空间即输出的空间远小于输入的空间。
注意:因为不同的输入可能会映射成相同的输出,所以不能从散列值来唯一的确定输入值。
集合类的出现:面向对象的语言对事物的体现都是以对象的形式,而为了方便对多个对象的操作就需要对多个对象进行存储,而之前学过存储多个元素的东西是数组,但是由于数组的长度固定,不适应动态的需求变化,所以java就为我们提供了集合类供我们使用。
集合和数组的区别:
数组:长度固定;可以存储基本类型也可以存储引用类型;存储的元素类型需一致。
集合:长度可变;只能存储引用类型;可存储多种元素类型
Collection体系结构图:
Collection
List
ArrayList
LinkedList
Vector
Set HashSet
TreeSet
1. Collection<E>:单列集合的顶层接口,定义了单列集合的共性内容
成员方法:(看到E我们先把它理解为Object即可)
A:添加功能
boolean add(Object obj):往集合中添加一个元素
boolean addAll(Collection c):往集合中添加多个元素(即添加一个集合)
B:删除功能
voidclear():清空所有元素
booleanremove(Object o):从集合中删除一个元素
booleanremoveAll(Collection c):从集合中删除另一个集合的元素
C:判断功能
booleancontains(Object o):判断集合中是否包含指定的元素
booleancontainsAll(Collection c):判断集合中是否包含另一个集合的元素
booleanisEmpty():判断集合是否为空。
D:交集功能
boolean retainAll(Collection c) :移除此 collection 中未包含在指定 collection 中的所有元素,如果此 collection 由于调用而发生更改,则返回true。
E:迭代器(集合特有的遍历方式)
Iterator iterator()
重点:Iterator的使用
A:使用步骤
B:迭代器原理
F:长度功能
int size():返回集合中元素的个数
练习题:数组有length()吗?字符串有length()吗?集合有length()吗?
数组里面是length属性;
字符串里面是length()方法;
集合里面是size()方法
G:集合转数组
Object[]toArray():把集合转成数组,然后遍历数组,其实就相当于遍历了集合。
遍历集合的方法:
(1)将集合转成数组,遍历数组(不常用)
(2)迭代器遍历(创建迭代器对象,用while循环调用hasnext()方法判断下一个元素是否存在,然后调用迭代器的next()方法)
(3)用foreach直接进行遍历
格式:for(数据类型 变量名:要遍历的集合名){
直接输出变量;
}
2. List<E>: 接口,元素有序(存储和取出的顺序一致),元素可重复
List的特有功能:
A:添加功能: void add(int index,Object obj):在指定的位置添加元素
B:删除功能: Object remove(int index):通过指定的索引删除元素,并把删除的元素返回
C:获取功能: get(int index) 返回列表中指定位置的元素。
D:替换功能: Object set(int index,Object obj)
List的倒序与洗牌
List中元素顺序可以被洗牌Collections.shuffle(list)
List中元素顺序可以被倒序Collections.reverse(list)
Collections.sort(list)对List元素排序;(字母:按字符表的顺序进行排序;数字:按从小到大进行排序)
ArrayList<E>: List的具体实现类;
LinkedList<E>: List的具体实现类;
LinkedList特有功能:
publicvoid addFirst(E e) :在集合元素的第一个位置添加指定元素
publicvoid addLast(E e):在集合元素的最后一个位置添加指定元素
public E getFirst():获取集合中的第一个元素
public E getLast():获取集合中的最后一个元素
public E removeFirst():删除集合中的第一个元素
publicE removeLast():删除集合中的最后一个元素
ArrayList与LinkedList的相同点和不同点
相同点:元素有顺序,且元素可以重复
不同点:(1):ArrayList:底层数据结构为数组,查询快,增删慢;
线程不安全,效率高
(2):LinkedList:底层数据结构为链表,查询慢,增删快;
线程安全,效率低
List的遍历方法:(1)普通for
(2)增强for即foreach
(3)迭代器遍历
范型:是一种把明确数据类型的工作推迟到创建对象或者调用方法再去明确数据类型的特殊类型。
格式:<数据类型>:这里的数据类型只能是引用数据类型
好处:(1)把运行时期的错误提前到了编译时期
(2)优化程序设计,解决了黄色警告线问题
(3)避免了强制类型转化
3. Set<E>: 接口,元素不可重复
HashSet<E>:Set接口的实现类,
(1)元素唯一,但是无序(它不保证set的迭代顺序,特别是不保证该顺序恒久不变)
(2)如何保证元素的唯一性
(2.1)和add()方法相关,查看add()方法的源码可得,底层依赖的内容为:
if (e.hash == hash&& ((k = e.key) == key || key.equals(k))) {...}
左边:e.hash==hash:
判断要存入元素的哈希值是否和已存入元素的哈希值相同
右边:(k = e.key) == key || key.equals(k)
左边:((k=e.key)==key)
判断要存入元素的地址值是否和已存入元素的地址值相同
右边:key.equals(k)
判断要存入元素的内容是否和已存在元素的内容相同
结论;HashCode底层数据结构是哈希表,哈希表依赖hashCode()和equals()方法
(2.2)执行流程:首先判断哈希值是否相同,如果不同,就直接添加到集合。
如果相同,继续执行equals(),看其返回值,
如果是false,就直接添加到集合。
如果是true,说明元素重复不添加。
注意:如果遇到hashSet集合,就要考虑重写hashCode()和equals()方法,如果重写自动生成即可(Alt+Shift+S)
treeSet<E>:set集合的实现类
(1)元素的顺序:根据构造方法的选择对元素进行排序
TreeSet
()
根据其元素的自然顺序进行排序,依赖于compareTo()方法
compareTo()里面书写的就是元素需要按那种逻辑进行排序,
TreeSet
(Comparator<E> comparator)
根据指定比较器进行排序。(通过匿名内部类new Comparator()直接传参)
(
2
)底层算法:二叉树
在二叉树存储数据的过程中,会和其他数据做一个减法:
结果为正:放右边
结果为负:放左边
结果为
0
:不存储
取出元素的时候从左中右依次取出元素。
(
3
)
.
一个类存储到
treeSet
集合中要想按自然顺序进行排序,则需要满足的条件为:(
1
)实现
comparable<T>
T
- 可以与此对象进行比较的那些对象的类型
(2)重写comparable接口的compareTo()方法(根据题目的排序要求写对应的排序方法)
HashSet和TreeSet的相同点和不同点:
相同点:单列集合,元素不可重复
不同点:(1).底层存储的数据结构不同:HashSet底层用的HashMap哈希表结构存储,而TreeSet底层用的TreeMap树结构存储
(2).存储时保证数据唯一性依据不同:HashSet依据的是HashCode()和equals()方法;TreeSet通过实现Comparable接口的CompareTo()方法。
(3).有序性不同:HashSet无序;TreeSet有序。
双列集合:
Map:将键映射到值的对象,一个映射中键不能重复,一个键只能映射到一个值
A:删除功能
void clear():移除集合中的所有键值对元素
remove(Object key):根据键移除键值对元素,并返回值
B:判断功能
boolean containsKey(Object key):判断集合中是否包含指定的键
boolean containsValue(Object value):判断集合中是否包含指定的值
booleanisEmpty():判断集合是否为空
C:获取功能
Set<Map.Entry<K,V>> entrySet():获取键值对对象的集合,遍历键值对对象,利用getKey(),getValue()取出键和值(理解即可)
V get(Object key):根据键获取值
Set<K> keySet():获取所有的键
Collection<V> values():获取所有的值
D:添加功能
V put(K key,V value):集合添加键值对
E:长度功能
intsize():键值对对数。
1.HashMap
元素顺序:元素顺序不可预测
底层算法:哈希算法
对键没有要求(仅仅相对于TreeMap来说),存入(Student,String),键是同一个对象的时候要把之前存入的元素挤出去,想要实现这样的效果的话,需要重写javabean里面的hashCode()和equals()方法
2.TreeMap
元素顺序:元素顺序与键的排序规则有关
底层算法:Tree算法
3.HashMap与TreeMap的相同点与不同点
相同点:主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
(1)HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
(2)TreeMap取出来的是排序后的键值对。所以如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
4.Map集合的遍历
集合遍历:
(1)根据键找值----------i.获取键的集合keySet() ii.遍历键foreach iii.根据键找值get(object key);
(2)entrySet():(Set<Map.Entry<K,V>> entrySet()-------------先找到键值对对象,再从键值对对象里面找到键和值;getKey(), getValue()