今日内容
1.List
2.Set
一:List
1.1:List概述
-
首先List和Set都属于有序的collection(也称为序列)
-
List接口:
1.有序的集合(有序)
-
什么是有序?——存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的
2.带索引的集合(索引)
-
通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)
3.集合中可以有重复元素(重复)
-
通过元素的equals方法,来比较是否为重复的元素
1.2如何使用List接口
1.2.1:构造方法
-
因为是接口,他没有构造方法,要想获得实例就得
-
多态
-
内部类
-
找方法
-
1.2.2:常用方法
-
方法介绍
-
-
增加元素方法
-
-
add(Object e):向集合末尾处,添加指定的元素
-
add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移
-
-
删除元素删除
-
-
remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素
-
remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素
-
-
替换元素方法
-
-
set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素
-
-
查询元素方法
-
-
get(int index):获取指定索引处的元素,并返回该元素
-
-
-
注意:由于List集合拥有索引,因此List集合迭代方式除了使用迭代器之外,还可以使用索引进行迭代。
1.2.3:Iterator的并发修改异常
package list接口实例化; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; public class Demo { public static void main(String[] args) { Collection<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); List<String> l =new ArrayList(); l.add("a"); l.add("b"); l.add("c"); Iterator<String> it = l.iterator(); while (it.hasNext()){ //不允许做并发操作,一般做循环操作就是循环,不要再做更新操作 if (it.next().equals("a")){ it.remove(); //仅仅可以做删除,因为这个remove是iterator自带的,慎用 } } System.out.println(l); } }
-
并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素。
1.3:List接口数据结构
-
List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。
-
数据存储的常用结构有:堆栈、队列、数组、链表。
1.堆栈 (先进后出)
2.队列 (先进先出)
3.数组 ()
-
查找元素快:通过索引,可以快速访问指定位置的元素
-
增删元素慢
4.链表
-
查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
-
增删元素快
1.4ArrayList集合
-
ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快
-
-
构造方法
-
ArrayList()
面试题:List接口数据结构、ArrayList扩容机制
开发:ArryList:增删改查
1.5LinkedList集合
-
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
-
LinkedList是List的子类,List中的方法LinkedList都是可以使用
二:Set接口
-
-
Collection中可以存放重复元素,也可以不存放重复元素,List中是可以存放重复元素的。,Set接口,它里面的集合,所存储的元素就是不重复的。
-
2.1:Set概述
-
通过元素的equals方法,来判断是否为重复元素
-
特点
-
-
不允许重复
-
存取无序
-
2.1.1Set使用
-
构造
-
方法
2.1.1.1构造
Set set = new HashSet();
2.1.1.2:特点研究
-
不重复
import java.util.HashSet; import java.util.Set; public class Demo { public static void main(String[] args) { Set set = new HashSet(); System.out.println(set.add("a")); System.out.println(set.add("a")); set.add("b"); System.out.println(set); } }
-
无序
package Set接口; import java.util.HashSet; import java.util.Set; public class Demo { public static void main(String[] args) { //不允许重复 Set list = new HashSet<>();//无序 list.add("a"); System.out.println(list.add("a")); //不允许重复 list.add("张翼德"); list.add(123); for (Object o :list){ System.out.println(o); //无序 } } }
2.1.1.3方法
-
同Collection及子类一样
2.2:HashSet集合介绍
-
此类实现Set接口,由哈希表支持(实际上是一个 HashMap集合)。
-
HashSet集合不能保证的迭代顺序与元素存储顺序相同。
-
HashSet集合,采用哈希表+红黑树结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
2.3:HashSet集合存储数据的结构(哈希表)
-
什么是哈希表呢?
-
-
哈希表底层使用的也是数组机制,数组中也存放对象
-
-
-
哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置
-
-
-
如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突
-
-
哈希结构
-
-
先算对象的哈希值,求出哈希表中的存储位置
-
-
-
-
-
如果hash值一样,哈希冲突(有可能一样)
-
-
-
-
-
-
-
如果哈希冲突了,在调用equals方法,比较内容,如果内容也相同,就认为存的内存一样的
-
-
-
-
结论:对象内容,默认要让hash值也一样,以后要重写hashcode方法
-
-
toString:
-
equals:
-
hashCode
-
-
总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式