关于hashCode
hashSet的使用
简单的来说,就是,如果两个对象的所有值都相同(hashCode值相同),那么就开始判断equals方法是否为false,如果为false就判定这两个对象不是重复的,如果为true就判断是重复的,即:
先判断hashCode值是否相同(对象中的元素是否有不同的,有的话就是不同,都相同就相同),然后再判断equals是否相同(重写之后的equals方法,通过比较对象引用是不是为空,当前引用的getClass方法是不是满足,还有对象的所有属性是否相同),如果相同,就返回true,否则就返回false,理解这么多就够了。具体比较hashCode的方法,看代码(比较方法:设初始值为31,数字初始值为1,将数字的值加一起然后再判断字段是否为空,为空的话就+0,否则就加上字段值(字段的hashCode()方法返回的是一个整数,也就是这个字段的地址值),然后结果就是hashCode值)
Set:
特点:无序,不重复,没有整数索引
HashSet的add方法查找不能去重的原因
1.查看hashCode值是否相等
2.查看地址是否相等
3.查看equals值是否相等
重写hashCode()方法和equals()方法去实现HashSet存储自定义对象时的去重
Collections工具类的查询方法:
1.static int binarySearch(List list,Object key):用于查询元素的位置,注意,被查询的集合必须是有序的(Set不能用)
2.static void copy(List dest,List src):用于列复制,后面的复制到前面
3.static void fill(List list,Object obj);用于填充,将list中的元素全部替换成obj
4.static void reserve(List list);反转,将List列的值的顺序反过来
5.static void shuffle(List list);随机置换,将整个List的元素随机换位置(实现洗牌)
6.static void sort(List<T> list);将list中的元素按自然顺序排列(list中为基本类型)
7.static void swap(List list,int i,int j);将list中指定的两个索引位置的值互换
Map的增删查
1.添加 V put(K key,V value);返回值是V
2.删除 void clear();
3.查询 V get(Object key);
int size();
4.判断 boolean containsKey(Object key);
boolean containsValue(Object value);
boolean isEmpty();
5遍历:
1.用Set存储键值(因为Set不允许重复),然后用Collection存储对应值(因为Collection允许出现重复)
2.用Map的Entry方法,eg:Set<Map.Entry<K,V>> entrys = Map对象.entrySet();
总结:
1.单列集合从上到下依次为:Collection(根集合)--->List(ArrayList,LinkedList(没讲)),Set(HashSet,LinkedHashSet(没讲))
双列集合从上到下依次为:Map--->HashMap,LinkedHashMap(没讲)
2.List和Set的区别:List为有序的可重复的集合,Set为无序的不可重复的集合,并且没有整数索引
3.因为Set是接口,所以用多态创建HashSet的对象,而HashSet实际上是HashMap的包装类,其本质是HashCode()
4.使用HashSet的时候重写equals()和hashCode()的方法
4.Set和Map的相同点和不同点
相同点:都是集合,底层实现都是HashCode();
不同点:Set只有一个获取键值的方法,但是Map有对应的Hash表值,有自己的获取key和value的方法,Map可以用entry遍历
5.LinkedList底层是链表,增删快查询慢,ArrayList底层是数组,查询快增删慢
6.HashMap和Set之间的联动
HashMap的keySet()返回的是Set的映射视图(就是Set集合),将HashMap中的键存入Set中
7.Collections工具类是专门为List接口提供的,同时,被接口实现的类也能使用,包括增删改查的方法