Java高级特性
第一章 集合框架和泛型(二)
一、Set接口
Set集合称之为散列表,其存储元素时,会根据元素自身的特性,将其在Set集合中挑选一个合适的位置进行存储。当多个元素所存储的位置相同时,后面的元素会覆盖前面的元素内容。
Set集合的最大特征:无序不重复。
二、HashSet 类
HashSet是Set接口常用的实现类。
1、HashSet类的常用方法
2、如何获取Set集合中的元素
(1)对于Set集合来说,最大的特征就是无序,因此当存放多个相同元素时,Set集合只保留相同元素中的最后一个。
(2)由于Set集合是无序的,那么就无法通过下标来获得Set集合中的元素。
(3)要获得Set集合中的元素,只能通过循环结构进行遍历,逐一判断。
这里提供三种方法:
第一种:
由于普通的for循环需要通过下标来获得元素,那么Set集合是无法使用的,此时借助foreach循环结构。
// 创建 HashSet 集合
HashSet<String> hashSet = new HashSet<String>();
// 通过 size() 能够获得该 HashSet 集合中所存储元素的个数
System.out.println("此时 HashSet 中所存储的元素个数:" + hashSet.size());
// 向 HashSet 中存放元素,通过 add() 实现
hashSet.add("张三");
hashSet.add("里斯");
hashSet.add("王五");
for (String name : hashSet) {
System.out.println(name);
}
第二种:
由于List集合和Set集合都来自于Collection接口,因此可以直接借助于构造方法。
List<String> list = new ArrayList<String>(hashSet);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
第三种:
使用迭代器(Iterator)实现对集合的遍历。
- 将Set集合中所有的元素存入到Iterator对象中
Iterator<String> iterator = hashSet.iterator();
- 由于元素的个数不止一个,因此使用循环结构来进行,因为循环次数不确定,且元素可能不存在,因此采用while循环。
while (iterator.hasNext()) {
// 如果 iterator.hasNext() 有元素,那么取出该元素
String name = iterator.next();
System.out.println(name);
}
hasNext()方法用于判断此时迭代器中是否有元素,返回true则说明有元素,否则返回false,说明没有元素。
next()返回要访问的下一个元素。
注:凡是有Collection接口派生而来的接口或者类,都实现了iterate()方法,iterate()方法返回一个Iterator对象。
三、Map接口
1、概述
有别于Collection,Map在存储元素时,是成对存入的,即以“键值”的形式存入的。可以通过键(key)来获取值(value)。Map集合的key采用了类似于Set集合的形式,也就是说Map集合的key是不允许重复的,value允许重复。
2、HashMap类
最常用的Map实现类是HashMap,其优点是查询指定元素时效率较高。
3、Map接口的数据结构特征(源码)
(1)Map集合的初识容量是16。
(2)Map集合的最大容量是1073741824。
(3)Map集合的每次扩容都是在原来的基础上增加0.75倍。
补充:
本质上,HashSet集合使用的是一个HasMap类型的key,而value则统一是new Object()。
4、Map接口的常用方法
5、如何获取Map集合中的元素
方法1:通过迭代器Iterator实现遍历
方法2:增强型for循环
方法3:键值对
// 由于 HashMap 中是通过 key 来获取 value 的,那么如果能够循环每一个 key,就能够获得对应的 value。要想循环 HashMap 的 key,则可以将 Map 集合的 key 独立取出,形成一个 Set 集合。
Set<String> keySet = hashMap.keySet();
// 那么就可以对这个 Set 集合进行循环遍历
for (String key : keySet) {
System.out.println(key + " : " + hashMap.get(key));
}
四、Collections算法类
Collections是Java提供的一个集合操作工具类,它包含了大量的静态方法,用于实现对集合元素的排序、查找、替换等操作。
1、Arrays工具类
借助于Arrays.aList()方法可以将数组转化为集合。
List<String> nameList = Arrays.asList("张三", "里斯", "王五");
2、Collections工具类
(1)addAll()
// 使用addAll()将所给定的元素插入集合中
Collections.addAll(arrayList, "张三", "里斯", "白王五", "赵六");
(2)copy()
// 使用 copy() 进行元素的复制
ArrayList<String> nameList = new ArrayList<String>();
Collections.addAll(nameList, "", "", "", "");
Collections.copy(nameList, arrayList);
(3)fill()
//使用 fill()将 List 集合中每个元素的值都用统一的值进行替换
Collections.fill(nameList, "张大");
(4)sort()
// 使用 sort() 实现对集合从小到大排序
Collections.sort(arrayList);
- 在Java中,如果想要实现一个类的对象之间比较大小,那么这个类就需要实现Comparable接口。
- 此接口强行对实现它的每个类的对象进行整体排序,这排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法。此方法用于比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
- compareTo()方法的定义语法格式:
int compareTo(Object obj );
其中:obj是要比较的对象;
返回值:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象返回不同的值。 - 实现此接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序。