当前位置:   article > 正文

哈希表HashMap和哈希集HashSet的区别,操作复杂度o(1),哈希表的值传递和引用传递的区别_hashset o(1)

hashset o(1)

哈希表HashMap和哈希集HashSet的区别,操作复杂度o(1),哈希表的值传递和引用传递的区别

提示:哈希表是很重要的数据结构!


系统数据结构o(1)操作的哈希表和哈希集

哈希表HashMap:键值对,存放key,key挂value
有点像python中的字典
在这里插入图片描述
哈希集:HashSet
只有key没有value
在这里插入图片描述
但是他们都可以put(key,value),remove(key)
哈希表有:查找key是否存在的函数containsKey(x),没有的就返回null
哈希集有:查找key是否存在的函数contains(x)
他们俩的底层数据组织方式一模一样

另外呢,哈希表和哈希集,他们的key当然是独立的,不允许重复,可以达到去重的目的,
第二次放同样的key,那就是修改更新操作了【重复添加即修改值】

public static void testHashMap(){
        HashMap<Integer, String> map = new HashMap<>();//别忘了new
        map.put(1,"王远阳");
        map.put(2,"总巴狗");
        map.remove(2);
        System.out.println(map.containsKey(2));
        System.out.println(map.containsKey(1));
        map.put(1,"ssss");//重复添加即修改值
        System.out.println(map.get(1));
        System.out.println(map.get(10));//没有的就是null
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
public static void testHashSet1(){
        HashSet<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(2);//重复添加即修改值
        set.add(3);
        set.add(4);
        set.remove(4);
        System.out.println(set.contains(2));
        System.out.println(set.contains(10));
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

代码自己撸一下,看看啥情况

以上增删改查一律o(1)复杂度
当然,操作字符串的话,还不是o(1),是o(k),k是字符串长度。将来操作字符串还是要考虑一下实际的时间的


哈希表的值传递和引用传递(java)

(1)基础数据类型int,double,float,他们是值传递
所谓值传递,就是真的赋值!
(2)Integer,Float,Double等大写的数据类型,采用的是引用传递,传的是地址
注意:这种大写的数据类型,如果当数值范围在-128–127时仍然是值传递

//注意:此处Integer,Float,Double等大写的数据类型,采用的是引用传递,传的是地址
    //而int,float,double等等是基础数据类型,采用值传递,直接用值
    //在Hash中Integer啥的一律按照“值传递”的方式,记住这个知识点,
    // 而在Hash中,非基础类型是引用传递,比如Node
    public static void testIntegerAndint(){
        int a = 1;
        int b = 1;
        System.out.println(a == b);//这里是true
        Integer c = 1;
        Integer d = 1;
        System.out.println(c == d);//这里是true——当数值范围在-128--127时仍然是值传递
        //当数值范围超出了-128--127时,才是引用传递
        Integer e = 100000;
        Integer f = 100000;
        System.out.println(e == f);//这里是false,引用传递的地址不再一样了
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

看结果:

true
true
false
  • 1
  • 2
  • 3

哈希表中,基础数据类型,不管大写还是小写数据类型【都是基础数据类型】,一律按照值传递
而非基础数据类型【比如节点Node,自定义那些数据结构】,一律按照引用传递

区别在呢?
值传递,啥玩意都传了,容易占用太多内存,访问速度慢
但是引用传递,如果Node太大,比如20G,咱只需要引用传递它的地址,不过也就8字节,就不会占用那么多人空间了
懂了吧!就是为了节约空间,节省时间。!!!


总结

提示:重要经验:

1)哈希表,哈希集,是很重要的数据结构,今后很多数据结构与算法的题目,都要用哈希表来实现
2)了解java中数据结构类型的传递形式,哈希表的基础数据类型一律值传递,非基础数据类型一律引用传递

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/383999
推荐阅读
相关标签
  

闽ICP备14008679号