Set集合,是接口Set,继承Collection接口. Set集合不存储重复元素
Set接口下的所有实现类,都会具有这个特性.
Set接口的方法,和父接口Collection中的方法完全一样
1 Set集合存储和遍历
public static void main(String[] args) {
//Set集合存储并迭代
Set<String> set = new HashSet<String>();
//存储元素方法 add
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("d");//不能存储相同元素
System.out.println("set = " + set);
Iterator<String> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
//如果想找某一个元素,只能遍历判断,set没有索引不能 get(0)、get(1)
如果想找某一个元素,只能遍历判断,set没有索引不能 get(0)、get(1)
2 Set接口实现类HashSet类
-
HashSet集合类的特点 :
-
实现Set接口,底层调用的是HashMap集合
-
HashSet的底层实现原理是哈希表
-
HashSet不保证迭代顺序,元素存储和取出的顺序不一定
-
线程不安全,运行速度快
-
3 对象的哈希值
每个类继承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;
}
4 String类的哈希值
字符串类重写方法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";
*/