目录
Collection接口概述:
Collection接口是集合中的顶层接口,那么它中定义的所有功能子类都可以使用,是共性的功能,是集合中所有实现类必须拥有的方法。
所有我们学习的时候首先从父类Collection开始,然后再学习子类中特有的内容。
Collection接口的基本方法
以上的方法基本都是常用方法,需要记住。
创建集合的格式:
方式1:Collection<元素类型> 变量名 = new ArrayList<元素类型>();
方式2:Collection 变量名 = new ArrayList();
方式1创建的集合,只能存储<>中指定的元素类型,该方式为常用方式。(这里使用了泛型)
方式2创建的集合,集合的元素类型默认为Object类型,即任何类型的元素都可以存储。(但是后续可能会需要强制类型转换)。
Iterator迭代器使用:
具体演示:
public void test2() {
Collection<String> collection = new ArrayList<>();
collection.add("张三");
collection.add("李四");
collection.add("王五");
collection.add("张三");
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {//判断有没有下一个,有下一个返回true
String data = iterator.next();//用来返回迭代的下一个元素,并把指针向后移动一位
System.out.println(data);
}
}
List接口特点(也是其所有实现类的特点):
1、它是一个元素存取有序的集合。有序指的是存元素的顺序是11、22、33。取出来的时候也是11、22、33。而不是22、11、33这种情况。不是自动排序。
2、它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3、 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List接口的常用子类有:
ArrayList集合
LinkedList集合
Vector集合(已经不再使用)
ArrayList:
ArrayList集合数据存储的结构是数组结构。是方便查找指定元素和替换指定元素的集合。
1、增加元素方法
add(Object e):向集合末尾处,添加指定的元素
add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移
2、删除元素删除
remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素
remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素
3、替换元素方法
set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素
4、查询元素方法
get(int index):获取指定索引处的元素,并返回该元素
注意一个问题:
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
//对获取出的元素s,进行判断,是不是有"abc3"
if(s.equals("abc3")){
list.add("ABC3");
}
System.out.println(s);
}
如果想要使用迭代器遍历集合并且进行添加操作的话是不可以的,因为迭代器中没有定义添加方法。如果想要实现添加操作可以使用ListIterator进行迭代。另外for,each增强for循环也是不可以添加操作的。删除操作可以使用Iterator。
LinkedList:
LinkedList集合数据存储的结构是链表结构。是方便元素添加、删除的集合。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
除此之外LinkedList还有offer()、poll()组合完成对队列的操作,peek()获取队首元素,pollLast()队尾出列方法。所以Linkedlist既可以实现栈也可以实现队列。
Vector:
Set接口:
Set中元素无序不重复。无序指的是存取无序。不重复即不允许出现相同元素。Set中允许null值但是只允许一个!在List集合中允许多个null值。
实现Set接口的有HashSet和TreeSet。
LinkedHashSet继承了HashSet类。
HashSet:
无序:HashSet集合不能保证的迭代顺序与元素存储顺序相同。
不重复:HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于两个方法:hashCode()与equals()方法。
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
HashSet元素不能重复,如何实现:
在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。
解决哈希冲突(四种方法)_君诀的博客-CSDN博客_解决哈希冲突的方法
在ThreadLocal中解决哈希冲突的方法是开放定址法。
在HashMap中解决哈希冲突的方法是链式寻址法。
保证HashSet集合元素的唯一,是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,为了保证其唯一,必须复写hashCode和equals方法建立属于当前对象的比较方式。
LinkedHashSet介绍
public void test4() {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
TreeSet:
Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一。
那TreeSet为什么能保证元素唯一,它是怎样排序的呢?
需要在自定义类(Student)中实现```Comparable```接口,并重写接口中的compareTo方法
@Override
public int compareTo(Student o) {
return 0; //当compareTo方法返回0,认为是相同的元素
return >0; //当compareTo方法返回值正数,读取时是正序排列的
return <0; //当compareTo方法返回值负数,读取时是倒序排列的
}
}
Map接口:
1、Collection中的集合,元素孤立存在。向集合中存储元素采用一个个元素的方式存储。
2、Map中的集合,元素成对存在。每个元素由键与值两部分组成,通过键可以找对所对应的值。
3、Collection中的集合称为单列集合,Map中的集合称为双列集合。
4、需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
(Key可以为null但是只能有一个为null,值可以多个为null)
5、Map中常用的集合为HashMap集合、LinkedHashMap集合。
HashMap<K,V>:
存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。(存放自定义类的时候重写,API中的类不需要)
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
Map集合遍历键找值方式:
![](https://i-blog.csdnimg.cn/blog_migrate/01fb9289b0b16d2c19047d16e0261917.png)
2.遍历键的Set集合,得到每一个键
3.根据键,获取键所对应的值
二、Map集合遍历键值对方式
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
1.获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。
2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象
3.通过键值对(Entry)对象,获取Entry对象中的键与值。
注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
Collections集合工具类 Arrays
Collections类常用方法总结
public static <T> void sort(List<T> list) // 集合元素排序
//排序前元素list集合元素 [33,11,77,55]
Collections.sort( list );
//排序后元素list集合元素 [11,33,55,77]
public static void shuffle(List<?> list) // 集合元素存储位置打乱
//list集合元素 [11,33,55,77]
Collections.shuffle( list );
//使用shuffle方法后,集合中的元素为[77,33,11,55],每次执行该方法,集合中存储的元素位置都会随机打乱