//本人觉得重点的部分会用彩色标出
//本文章只做浅层解释,并不深入探究
1.什么是集合
在Java中,集合就是一种容器,可以保存多个数据
2.有了数组,为什么还要有集合
数组的弊端: 数组的长度是固定的
集合的优点: 集合的长度是可变的
3.集合框架(主要分支)**************************
集合根接口: Collection
集合子接口: List接口 Set接口
List接口: ArrayList LinkedList Vector(作用与ArrayList相近,但运行效率低,运用越来越少,几乎已被淘汰)
Set接口: HashSet LinkedHashSet TreeSet
4.集合根接口Collection中定义的所有集合的共有方法
增: boolean add(E e);
删: boolean remove(元素); void clear();
改: 无
查: 无
其他方法:
int size(), //集合长度
boolean contains(元素); //判断集合中是否包含此元素,返回类型boolean
boolean isEmpty(); //判断是否为空集合(个人感觉作用非常鸡肋,因为直接看size长度即可判断是否为空)
Object[] toArray(); //将集合转变为数组
所有集合的通用遍历方式--迭代器
1.迭代器的使用方式*********************:
//1.创建一个集合
Collection<String> names = new ArrayList<String>();
names.add("马尔扎哈");
names.add("迪丽热巴");
names.add("古力娜扎");
names.add("罗泽罗拉");
names.add("德玛西亚");
//2.使用迭代器遍历
//2.1 先获取迭代器
Iterator<String> it = names.iterator();
//2.2 循环的标准代码
while (it.hasNext()) {
String next = it.next();
System.out.println(next);
}
2.迭代器底层的指针原理
a.刚刚获取的迭代器 指针指向第一个元素的开头
b.调用hasNext方法时,只是判断后面有没有元素,指针不移动
c.调用next方法时,复制出刚刚判断那个元素,同时指针向后移动
3.迭代器使用用于遍历
在使用迭代器的过程,不能向集合中添加或者删除元素,否则迭代器就会抛出异常
ConcurrentModificationException 并发修改异常
4.增强for循环*********************
语法糖:迭代器的语法糖
在JDK1.5之后推出增强for循环
格式:
for(数据类型 变量名 : 集合/数组){
System.out.println(变量名);
}
由于增强for循环底层使用迭代器,不能向集合中添加或者删除元素,否则底层迭代器就会抛出异常
-
List集合
1.List接口下所有的集合特点
a.有序: 在Java有序不是指自然顺序,是指存取顺序一致(保存1 3 2 取出1 3 2)
b.有索引
c.元素可重复
2.List接口自己的特有方法(4个和下标有关的方法)
增: boolean add(E e); void add(int index,E e);
删: boolean remove(元素); E remove(int index);
删除元素的方法,如果有多个相同元素,那么只删除第一个
改: E set(int index,E newE);
查: E get(int index);
3.List接口的实现类
a.ArrayList
数据结构: 底层采用 数组结构,所以增删慢,查询快
方 法: Collection 7个 + List中 4个
线程不安全,效率高
b.Vector
数据结构: 底层采用 数组结构,所以增删慢,查询快
方 法: Collection 7个 + List中 4个
线程安全,效率低
c.LinkedList
数据结构: 底层采用 链表结构,所以增删快,查询慢
方 法: Collection 7个 + List中 4个
大量的首位操作有关的方法(8个):
- public void addFirst(E e): 添加元素到第一个
- public void addLast(E e): 添加元素到最后一个
- public E removeFirst(): 删除第一个元素,返回该元素
- public E removeLast(): 删除最后一个元素,返回该元素
- public E getFirst():获取第一个元素。
- public E getLast():获取最后一个元素
- public void push(E e); 向集合中添加元素,首位,和 addFirst一样的
- public E pop();从集合中删除一个元素,首位 和 removeFirst一样的
4.哈希值
a.什么是哈希值
Java每一个对象的数字指纹
b.如何获取对象的哈希值
调用对象的hashCode方法
我们有三个结论:
a.我们Java中所有的对象地址值都是假的,而是对象的哈希值的16进制表示
b.哈希值是通过真正的地址值计算出来,根据一种散列算法(哈希算法)算出来
c.Java中是有地址值的,对象名中保存的就是地址值, 但是打印不出来
-
Set接口
1.Set接口的特点
a.无序的 (无序也不是指自然顺序 而是存取顺序是否一致 存:1 3 2 取:1 3 2 )
(但是LinkedHashSet除外,TreeSet是自然顺序)
b.无索引
c.元素唯一
2.Set接口无特有方法(方法和Collection接口是一样)
3.Set接口的实现类
HashSet: 底层使用哈希表结构,增删快查询快
由于HashSet可以保证元素的唯一性,所以当添加重复元素时,添加失败!!!!
如何证明: 只需要打印出add方法的返回值,结果为false即可证明
使用自定义类型,也需要重写该类的hashCode和equals方法
LinkedHashSet: 底层使用链表+哈希表
特点:增删快 查询快 但是它是有序的
使用自定义类型,也需要重写该类的hashCode和equals方法
TreeSet: 底层二叉排序树
特点: 它是无序的,但是它是有自然顺序的
向TreeSet中添加元素时,TreeSet会对元素进行自然排序
如果是数值,按照值的从小到大升序
如果是字符,按照ASCII码值升序
如果是字符串,按照首字母ASCII码值升序,首字母一样按照次字母ASCII码值升序,依次类推
4.哈希表结构扩展
a.哈希值: 对象的数字指纹
怎么获取对象的哈希值: 对象名.hashCode()
实际上我们平常看到的地址值,并不是真正的地址值,而是哈希值的16进制表示
b.哈希表结构:
JDK1.8以前: 数组+链表
JDK1.8以后: 数组+链表+红黑树
c.哈希表判断元素重复的依据是什么*************
先比较新旧元素的哈希值,再使用equals判断是否返回true
只有 哈希值相等,并且equals也是true 才判定元素重复,不保存
d.使用哈希表结构保存自定义类型时************
为了保证元素的唯一性,我们必须重写hashCode和equals