一.4集合Set集合
6.Set集合
6.1HashSet集合介绍
java.util. Set接口extends Collection接口 Set接口的特点: 1.不允许存储重复的元素 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java. util. HashSet集合implements Set接口 HashSet特点: 1.不允许存储重复的元素 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历(可以使用增强for和迭代器) 3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致 4.底层是一个哈希表结构(查询的速度非常的快)
6.2哈希值
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址) 在0bject类有一个方法,可以获取对象的哈希值 int hashCode() 返回该对象的哈希码值。 hashCode方法的源码: public native int hashCode(); native :代表该方法调用的是本地操作系统的方法 使用:?.hashCode(); hashCode方法可被重写,在自定义的类(Demo02Person)里,重写hashCode方法可以让 Demo02Person per=new Demo02Person(); Demo02Person per2=new Demo02Person(); per.hashCode();的值等于per2.hashCode(); 但是 System.out.println(per==per2);//false,即使重写hashcode方法后,实际物理意义上per和per2也不等。 //String类的哈希值 // String类重写了object类的hashcode方法 特殊:“重地” 和 “通话” 哈希值相等。
6.3HashSet集合存储数据结构(图库)
HashSet集合存储数据的结构*//*探究如何存储*/ /*HashSet慊合存儲数据的結枸(哈希表) jdk1.8版本之前:哈希表=数蛆+鉦表 jdk.8版本之后 哈希表=数姐+链表 哈希表=数姐+紅黒树(提高査詢的速度) 哈希表的特点:速度快 数組结构把元素迸行了分組(相同哈希値的元素是一俎) 链表/红黑树把相同哈希値的元素链接一起 如果链表的长度超过了8位那么就会把链表换成红黑树(提高查询的速度); 哈希冲突:俩的哈希值相同。
6.4Set集合存储元素不重复的原理
HashSet如何存储 * Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复 例:HashSet<String> h=new HashSet<>(); String s1=new String("aaa"); String s2=new String("aaa"); h.add(s1); h.add(s2); *h. add(s1); . add方法会调用s1的hashCode方法计算字符串"abc的哈希值,哈希值是96354 在集合中找有没有96354这个哈希值的元素,发现没有 就会把s1存储到集合中 h.add(s2); add方法会调用s2的hashCode方法计算字符串"abc"的哈希值哈希值是96354在集合中找有没有96354这个哈希值的元素发现有(哈希冲突 s2会调用equals方法和哈希值相同的元素进行比较s2.equals(s1),返回true两个元素的哈希值相同,equals方法返回true,认定两个元素相同 就不会把s2存储到集合中 例: h.add("重地"); h.add("通话"); * h.add(“重地"); add方法会调用"重地”的hashCode方法计算字符串"重地”的哈希值,哈希值是1179395 在集合中找有没有1179395这个哈希值的元素,发现没有 就会把“重地“存储到集合中 h. add("通话"); add方法会调用"通话"的hashCode方法计算字符串"通话"的哈希值,哈希值是1179395 在集合中找有没有1179395这个哈希值的元素,发现有(哈希冲突) 接着 "通话“会调用equals方法和哈希值相同的元素进行比较:“通话" .equals(重地),返回false 两个元素的哈希值相同,equals方法返@false,认定两个元素不同 就会把"通话"存储到集合中
6.5HashSet存储自定义类型元素
(在自定义的类中,除了重写toString方法让其输出内容,还需要重写HashCode方法和equals方法,以便为了HashSet方法的使用(使用HashSet方法必须重写HashCode方法和equals方法,不然就没有办法保证不在集合里保存不重复的项))
HashSet存储自定义类型元素 set集合报错元素唯一: 存储的元素 (String, Integer,. . . Student, Person...),必须重写hashCode和equals方法 例:要求: 同名同年龄的人,视为同一个人,只能存储一次
6..6LinkedHashSet集合
java.util. LinkedHashSetâ extends HashSetâ LinkedHashSet集合特点: 底层是一个哈希表(数组+链表/红黑树)+链表:多了-条链表(记录元素的存储顺序),保证元素有序 LinkedHashSet<String(通配符)> linked = new LinkedHashSet<>();
6.7可变参数
可变参数: 是JDK1.5之后出现的新特性 使用前提: 当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数. 使用格式:定义方法时使用 修饰符 返回值类型 方法名(数据类型.. .变量名){} 可变参数的原理: 可变参数底层就是一个 数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数传递的参数个数,可以是0个(不传递),1,2...多个 //可变参数的注意事项 //1.一个方法的参数列表,只能有一个可变参数 //2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾