Collections集合:
1.1数据结构
栈:
特点:
1.只能在一端进行元素的添加和删除
2.先进后出
队列:
特点:
1.先进先出
2.入口和出口分别再两端
数组: (ArrayList底层是数组的实现)
特点:
1.增删慢(长度不可变)
2.查询快(元素有对应的索,是一片连续的内存空间)
链表:
特点:
1.每个元素都是一个对象,对象中包含有元素数据,指针,每个元素之间通过指针相连
2.增删快,查询慢
* 双向链表相对单向查询会稍微快一点
红黑树:
特点:
1.趋近于平衡树,查询速度非常快,查询叶子节点最大和最小次数不能超过2倍。
名词解释:
二叉树:分支不超过两个
查找树/排序树:是一个有序的二叉树(左子树小于节点,右子数大于节点)左中右,则是从小到大
平衡数:左右子数高度差不超过1
红黑树:趋近于平衡树,查询速度非常快。
1.2 java.util.List
概述:
List中的特有功能
void add(int index,E element):仔指定索引位置添加元素
E remove(int index):删除指定索引位置的元素,把被删除的元素返回
E set(int index,E element):修改指定索引位置的元素为指定值,把被修改的元素返回
E get(int index):获取指定索引位置的元素
java.util.LinkedList集合inmlements List接口
LinkedList集合的特点:(可以模拟栈和队列)
1.底层是一个链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
*注意:使用LinkedList集合特有的方法,不能使用多态
*当对集合种增删操作比较多是时候,推荐使用LikedList
*当对集合种查询操作比较多是时候,推荐使用ArrayList
Vector:
和ArrayList实现功能是一致的(底层也是数组的实现)
唯一的区别:ArrayList是不同步的(效率高,安全性低)
Vector是同步的(效率低,安全性高)
java.util.Set接口extends Collection接口
Set接口的特点:
1.不允许储存重复的元素
2.没有索引,没有带索引的方法,也不能使用普通for循环遍历
java.util.HashSet集合 implements Set接口
HashSet特点:(底层是hash表的实现,查询的效率非常高)
1.不允许储存重复的元素
2.没有索引。没有带索引的方法,也不能使用普通的for循环遍历
3.是一个无需的集合,存储元素和取出元素可以不一致
4.
哈希值:
默认情况:根据对象的物理地址算出来的一个十进制的整数,由系统随机给出(相当于是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是物理地址)
本质:数组(储存了链表的数组),数组中的元素是一个个的链表
Object类中有一个可以返回哈希值的方法
int hashCode()//返回该对象的哈希码值
hashCode方法的源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法
HashSet的储存原理:
通过hash Code方法确定索引位置
在通过equals方法去除重复元素
总结:
储存元素的操作
1.想获取对象的hash值去储存元素
1.1hash值不一样,直接储存
1.2hash值一样
则比较equals的返回值,
如果是true则认为元素重复
如果是fals,则认为元素不重复,则添加元素
* 当我们用HashSet存储自定义对象的时候,如果想保证元素的唯一性,则需要重写hashCode和equals方法
问题:没有办法去重复
解决办法:重写hashCode方法,让hashCode的返回值和地址值不相干,跟属性值相关
LinkedHashSet:本质就是一个有序的HashSet: hash表+链表实现
hash表用于存储元素,
链表用于记录元素存储的顺序,当我们获取元素的时候,则会通过链表记录的顺序去获取元素。
2.可变参数
一种特殊的参数类型。可以接受任意多个同种数据类型的数据或者数组
1.1 Map集合的特点:
1.Map集合是一个双列结合,一个元素包含两个值(一个key,一个value)
2.Map集合中,key不可以重复的,value可以重复的。
3.Map集合中,可以通过key可以找到对应的值(value)
1.2 Map的实现类:
HashMap: 底层是哈希表的实现(HashMap中的键其实就是HashSet)
LinkedHashMap:HashMap的子类, 就是一个有序的HashMap
Hashtable:
Properties:可以方便和IO流相结合来使用
1.3 比较:
Hashtable是同步的,不允许null键和null值
HashMap是不同步的,允许null键和null值,但是null键只能出现一次
1.4: Map的使用功能:
V put(K k,V v):put方法添加元素,如果键不存在,直接添加,put方法返回null。如果键已经存在,由于不能
重复,会将新的值替换旧的值再将旧的值返回。
V remove(K k)按照给定的键删除整个键值对,并且返回被删除的值
V get(Object key)获取指定键对应的值(通过键获取值)
boolean containsKey(Object key) 判断指定的键是否存在
boolean containsValue(Object Value) 判断指定的值是否存在
1. 5:遍历功能:
Set<K> KeySet() 获取包含所有键的set集合 其实HashMap中的键就相当于一个HashSet(键找值)
Set<Map.Entry<K,V>> entrySet() 获取包含所有键值对元素(Entry)的Set集合
1.6用HashMap存储自定义对象:
由于HashMap中的键相当于一个HashSet,所以当HashMap中的键是自定义类型的时候,则需要重写
hashCode和equale方法,以保证键的唯一性
其实使用HashSet存储元素的时候,底层是吧元素存Map中的键里面
2.0 JDK9的新特性:
2.1 添加元素到集合的of方法:
在List,Map,Set接口中定义了一些重载的静态方法of可以实现将多个元素添加到集合中
注意事项:
1.只能使用接口类型调用这些静态方法,实现类去调用则不可以
2.使用of方法将元素添加到集合中后,元素不能改变
3.Map/Set接口中不允许出现重复的键/元素,如果有重复,则会抛出异常
3.0 Debug用IDEA找出bug的东西
|
|