Set集合,是接口Set,继承Collection接口. Set集合不存储重复元素
Set接口下的所有实现类,都会具有这个特性.
Set接口的方法,和父接口Collection中的方法完全一样
- public static void main(String[] args) {
- //Set集合存储并迭代
- Set
set = new HashSet(); - //存储元素方法 add
- set.add("a");
- set.add("b");
- set.add("c");
- set.add("d");
- set.add("d");//不能存储相同元素
- System.out.println("set = " + set);
-
- Iterator
it = set.iterator(); - while (it.hasNext()){
- System.out.println(it.next());
- }
- }
- //如果想找某一个元素,只能遍历判断,set没有索引不能 get(0)、get(1)
如果想找某一个元素,只能遍历判断,set没有索引不能 get(0)、get(1)
HashSet集合类的特点 :
实现Set接口,底层调用的是HashMap集合
HashSet的底层实现原理是哈希表
HashSet不保证迭代顺序,元素存储和取出的顺序不一定
线程不安全,运行速度快
每个类继承Object类,Object类定义方法 :
public native int hashCode(); // C++语言编写,不开源
方法使用没有区别 : 方法返回int类型的值,就称为哈希值
哈希值的结果不知道是怎么计算的,调用toString()方法的时候,返回的十六进制数和哈希值是一样的, @1b6d3586叫哈希值 (根本和内存地址是无关的)
- public static void main(String[] args) {
- Person p = new Person();
- int code = p.hashCode();
- // int 变量 460141958 (是什么,无所谓, 数字就是对象的哈希值)//十进制数
- System.out.println(code);
- // com.atguigu.hash.Person@1b6d3586
- System.out.println(p.toString());//toString方法返回十六进制数
- }
- /**
- * 重写父类的方法
- * 返回int值
- */
- public int hashCode(){
- return 9527;
- }
字符串类重写方法hashCode(),自定义了哈希值,哈希值的计算方法是 :
h = 31 * 上一次的计算结果 + 字符数组中元素的ASCII码值
*31 的目的,减少相同哈希值的计算

- //字符串String对象的哈希值
- private static void stringHash(){
- String s1 ="abc";
- String s2 ="abc";
- System.out.println(s1 == s2); //T
- //String类继承Object,可以使用方法hashCode
- System.out.println(s1.hashCode() == s2.hashCode()); //T
- /**
- * String类继承Object类
- * String类重写父类的方法 hashCode() 自己定义了哈希值
- */
- System.out.println(s1.hashCode());
- System.out.println(s2.hashCode());
- System.out.println("=============");
-
- /**
- * 字符串内容不一样,有没有可能计算出相同的哈希值
- * String s1 ="abc";
- * String s2 ="abc";
- */