• Java(七)——集合框架---Set集合


    Set集合,是接口Set,继承Collection接口. Set集合不存储重复元素

    Set接口下的所有实现类,都会具有这个特性.

    Set接口的方法,和父接口Collection中的方法完全一样

    1 Set集合存储和遍历

    1. public static void main(String[] args) {
    2. //Set集合存储并迭代
    3. Set set = new HashSet();
    4. //存储元素方法 add
    5. set.add("a");
    6. set.add("b");
    7. set.add("c");
    8. set.add("d");
    9. set.add("d");//不能存储相同元素
    10. System.out.println("set = " + set);
    11. Iterator it = set.iterator();
    12. while (it.hasNext()){
    13. System.out.println(it.next());
    14. }
    15. }
    16. //如果想找某一个元素,只能遍历判断,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叫哈希值 (根本和内存地址是无关的)

    1. public static void main(String[] args) {
    2. Person p = new Person();
    3. int code = p.hashCode();
    4. // int 变量 460141958 (是什么,无所谓, 数字就是对象的哈希值)//十进制数
    5. System.out.println(code);
    6. // com.atguigu.hash.Person@1b6d3586
    7. System.out.println(p.toString());//toString方法返回十六进制数
    8. }
    1. /**
    2. * 重写父类的方法
    3. * 返回int值
    4. */
    5. public int hashCode(){
    6. return 9527;
    7. }

    4 String类的哈希值

    字符串类重写方法hashCode(),自定义了哈希值,哈希值的计算方法是 :

    h = 31 * 上一次的计算结果 + 字符数组中元素的ASCII码值

    *31 的目的,减少相同哈希值的计算

    1. //字符串String对象的哈希值
    2. private static void stringHash(){
    3. String s1 ="abc";
    4. String s2 ="abc";
    5. System.out.println(s1 == s2); //T
    6. //String类继承Object,可以使用方法hashCode
    7. System.out.println(s1.hashCode() == s2.hashCode()); //T
    8. /**
    9. * String类继承Object类
    10. * String类重写父类的方法 hashCode() 自己定义了哈希值
    11. */
    12. System.out.println(s1.hashCode());
    13. System.out.println(s2.hashCode());
    14. System.out.println("=============");
    15. /**
    16. * 字符串内容不一样,有没有可能计算出相同的哈希值
    17. * String s1 ="abc";
    18. * String s2 ="abc";
    19. */
  • 相关阅读:
    android查漏补缺(6)android相关属性
    C#常识篇(一)
    Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 & Redis Lua脚本操作
    【LeetCode75】第七十三题 用最少数量的箭引爆气球
    pip install 超时中断处理
    东软始业教育结业考试
    Git手记
    CSRF漏洞详解与挖掘
    js滚动条触底加载更多#js懒加载数据#步骤条布局懒加载
    Python 操作MongoDB数据库
  • 原文地址:https://blog.csdn.net/MrDaKai/article/details/127727272