Set接口的特点
- 存入集合的顺序与取出集合的顺序有可能不一致
- 没有索引
- 存入集合的元素没有重复
HashSet存储自定义对象并遍历
public class TestForHashSet{
public static void main(String[] args){
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
Student s4 = new Student();
Student s5 = new Student();
hs.add(s1);hs.add(s2);hs.add(s3);hs.add(s4);hs.add(s5);
for(Student s:hs){
System.out println(s);
}
}
}
HashSet自动去重原理
- add()方法的原理为:
- HashSet添加元素时,会先拿着这个元素的HashCode值和已经添加的元素的HashCode值比较,如果都不相同,直接添加,如果有相同的,就让这个元素和HashCode值相同的那些元素依次比较(调用对象的equals方法)看是否相同,如果比较一遍都不同,则添加元素并返回true,如果比较式时发现有相同的,直接不添加,并返回false
- 由于只是比较对象的HashCode和调用equals方法来确认对象是否重复,所以会出现无法实现预期中的去重效果的情况
- 源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
实现HashSet存储自定义对象去重
- 由于HashSet在存入元素时会自行进行一次判断来去除重复对象,因只需重写hashCode和equals方法重新定义对象相等的含义即可实现自定义对象去重
Collections工具类
- int binarySearch(List list,E e)
- void sort(List list)
- void copy(List dest,List src
- void reverse(List list)
- void shuffle(List list)
- void swap(List list, int index1, int index2)
- void fill(List list, Object obj)
Map接口的概述
- Map中的集合被称为双列集合
- 元素成对存在,每个元素由键与值两部分组成,通过键可以找到其所对应的值
- Map中的集合不能包含重复的键,但是值可以重复(类似数学中函数的映射关系),每个键只能对应一个唯一的值
Map的功能概述
Map<K key, V value>
V put(K key,V value)
V get(Object key)
int size()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
void clear()
V remove(Object key)
Set<Map.Entry<K,V>> entrySet()
Set<K> keySet()
Collection<V> values()
Map的第一种遍历方式
- 拿到所有的键值,再由键值去Map中集合获取其对应的值
Set<Key> keyset = map.keySet();
for(Key key:keyset){
System.out.println(keyset+" = "+map.get(keyset);
}
Map的第二种遍历方式
- 先获取所有的键值对对象,再通过键值对对象获取其中的键值和值
Set<Map.Entry<Key,Value>> entrys = map.entrySet();
for(Map.Entry<Key,Value> entry:entrys){
Key key = entry.getKey();
Value value = entry.getValue();
System.out.println(key+" = "+value);
}
HashMap存储数据并遍历时的注意事项
- 由于HashMap的左列为HashSet数据结构,当以对象作为键值时,因为HashSet的自动去重功能使用的是对象的哈希值和调用equals方法,所以也可能会出现左列键值“重复”的现象,此时可以重写对象的hashCode和equals方法来自定义对象“重复”的含义,达到键值不重复的“目的”
可变参数
- 写一个方法时,当参数的个数不确定时,可以用可变参数来处理
- 格式(以int类型的参数为例):
public void method(int...a){
方法体;
}
- Java可以把多个参数转换成数组
- 可变参数的本身就是一个长度可变的数组
- 注意事项:
- 在可变参数之前可以增加参数,但可变参数必须是参数列表中的最后一个参数
- 可变参数传入时的个数为0或任意多个