赞
踩
提示:哈希表是很重要的数据结构!
哈希表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
}
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));
}
代码自己撸一下,看看啥情况
以上增删改查一律o(1)复杂度
当然,操作字符串的话,还不是o(1),是o(k),k是字符串长度。将来操作字符串还是要考虑一下实际的时间的
(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,引用传递的地址不再一样了 }
看结果:
true
true
false
哈希表中,基础数据类型,不管大写还是小写数据类型【都是基础数据类型】,一律按照值传递
而非基础数据类型【比如节点Node,自定义那些数据结构】,一律按照引用传递
区别在呢?
值传递,啥玩意都传了,容易占用太多内存,访问速度慢
但是引用传递,如果Node太大,比如20G,咱只需要引用传递它的地址,不过也就8字节,就不会占用那么多人空间了
懂了吧!就是为了节约空间,节省时间。!!!
提示:重要经验:
1)哈希表,哈希集,是很重要的数据结构,今后很多数据结构与算法的题目,都要用哈希表来实现
2)了解java中数据结构类型的传递形式,哈希表的基础数据类型一律值传递,非基础数据类型一律引用传递
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。