相关标签:
Java
Set接口的特点
- 存入集合的顺序与取出集合的顺序有可能不一致
- 没有索引
- 存入集合的元素没有重复
HashSet存储自定义对象并遍历
public class TestForHashSet{
public static void main(String[] args){
HashSet<Student> hs = new HashSet<>(); //创建HashSet集合
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
Student s4 = new Student();
Student s5 = new Student(); //创建学生类对象*5
hs.add(s1);hs.add(s2);hs.add(s3);hs.add(s4);hs.add(s5); //将学生对象存入集合中
for(Student s:hs){
System.out println(s); //由于HashSet集合没有索引,所以此处用增强for循环来遍历
}
}
}
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) //调换集合中索引为index1和index2的元素的位置
- void fill(List list, Object obj) //以元素obj填充list集合
Map接口的概述
- Map中的集合被称为双列集合
- 元素成对存在,每个元素由键与值两部分组成,通过键可以找到其所对应的值
- Map中的集合不能包含重复的键,但是值可以重复(类似数学中函数的映射关系),每个键只能对应一个唯一的值
Map的功能概述
Map<K key, V value> //Map是一个接口,只能创建其已经实现了的子类对象
V put(K key,V value) //以键=值的方式存入Map集合,并将值返回
V get(Object key) //根据键值获取其所对应的值,如果Map集合中不存在该键值则返回null
int size() //返回Map中键值对的个数
boolean containsKey(Object key) //判断Map集合中是否包含键值为key的键值对
boolean containsValue(Object value) //判断Map集合中是否包含值为value的键值对
boolean isEmpty() //判断Map集合中是否没有任何键值对
void clear() //清空Map集合中所有的键值对
V remove(Object key) //根据键值删除Map中的键值对,并将键值对应的值返回
Set<Map.Entry<K,V>> entrySet() //将Map中的每个键值对封装到一个个的Entry对象中,再将所有的Entry对象存储到一个Set集合中并返回此Set集合
Set<K> keySet() //将Map中所有的键值封装到一个Set集合中并返回此Set集合
Collection<V> values() //将集合中所有的value的值的集合返回
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或任意多个