草庐IT

JAVA学习day11

栗悟饭与龟波功004 2023-03-28 原文

HashMap和HashSet的区别

1.HashMap的底层原理是( ),HashSet的底层原理( )
2.HashMap储存的是( ),HashSet储存的是( )
3.HashMap添加元素的方法名是( ),HashSet添加元素的方法名是( )
4.HashMap是通过Key来计算HashCode值
HashSet是通过成员变量来计算HashCode值,对于两个对象来说,hashCode值可能相同,所以通过equals()来判断对象的相等性,如果两个对象不相等则返回false

HashSet和HashMap的唯一性和无序性

1.测试唯一性
2.测试无序性
3.遍历
以hashset为例证明其无序性和唯一性

public static void main(String[] args) {
    HashSet hs = new HashSet();
    hs.add("嘻嘻");
    hs.add("哈哈");
    hs.add("哈哈");
    hs.add("嘿嘿");
    hs.add("10086");
    Iterator it = hs.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }
}

遍历HashMap和HashSet的几种方式

不可以用普通for循环,非线性结构不支持用索引号遍历
不可以用增强型for循环
可以forEach循环
可以用迭代器:
1.先获取Entry的集合,然后在获取Entry结合的迭代器
2.先获取key的耳机和,然后在获取key集合的迭代器

package chapter9;

import kotlin.reflect.jvm.internal.impl.builtins.StandardNames;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test {
    public static void main(String[] args) {
        HashMap<String,Integer> map = new HashMap();
            map.put("张飞",75);
            map.put("关于",85);
            map.put("赵云",95);
            map.put("张飞",82);
            map.put("黄忠",84);
        System.out.println("HashMap的遍历方式一:forEach循环");
        //每次取出一组键值对,把key赋给箭头函数的两个参数,并把key和value分别赋给箭头函数的两个参数
        map.forEach((key,value)->{
            System.out.println(key + ":" + value);
        });

        System.out.println("HashMAp的遍历方式二:官方的迭代器");
        //map.entrySet()返回一个Entry集合,一个Entry就是一组键值对
        Set<Map.Entry<String, Integer>> set = map.entrySet();
        //获取Entry集合的迭代器对象
        Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
        //遍历迭代器对象
        while(iterator.hasNext()){
        Map.Entry<String,Integer> entry = iterator.next();
        //entry.getKey()取出key,entry.getValue()取出value
         System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        System.out.println("HashMap的遍历方式3:先获取key的集合,然后遍历key,在用key取value");
        //获取key的集合
        Set<String> keySet = map.keySet();
        //获取key集合的迭代器
        Iterator<String> keyIterator = keySet.iterator();
        //遍历迭代器
        while(keyIterator.hasNext()){
            //取出每个key
            String key =keyIterator.next();
            //根据key取出value
            System.out.println(key + ":" +map.get(key));
        }
    }
}

---------------------------------------- 答案分割线 ----------------------------------------------------
1.数组,单向链表/红黑树 | HashMap
2.键值对 | 对象
3.put | add


结果.png

哈希表

哈希表是无序且唯一的
数组是有序且不唯一的

如何确认集合中元素的唯一性

1.遍历+比较,性能低
2.通过hash运算,给字符串生成指纹

HashMap的底层实现

数组+单向链表/红黑树
java中最简单的数据结构是数组和对象(指针),一切复杂的数据结构都可以基于数组和对象实现

HashMap类的签名中有两个泛型,K,V代表两个位置的数据类型


java源码.png

K是key的数据类型,V是value的数据类型


哈希表.png

Hash表示Node数据类型
数组中每一个索引都能存储一个Node对象,Node对象身上有后继指针next,那么数组的每一个元素能可以成为单链表的表头

HashMap的put方法的底层原理

1.根据key的hashCode计算出数组index2.落槽时
---1.如果数组中节点为null,创建新的节点对象,把k,v存储在节点对象中,把节点对象存储在数组中2.如果数组的节点不为null,判断节点的key与插入元素的key是否相等
---------------1.相等,直接用新的k ,v覆盖原节点中的k,v
----------------------2.不相等,判断此时节点是否为红黑树
----1.是红黑树,创建红黑树节点对象存储k,v,插入到红黑树中
--------------2.不是红黑树,创建链表节点对象存储k,v,插入到链表中,判断链表长度是否大于阈值8
-----1.大于阈值8,链表转换为红黑树
------------3.判断++size是否大于阈值,是就扩容

HashMap的resize()扩容方法的底层原理

HashMap默认初始容量是16
resize()方法是在hashmap中的size大于阈值时或者初始化时,就调用resize方法进行扩容每次扩容的时候始终是原数组长度的2倍,即长度永远是2的n次方
扩容后节点对象的位置要么在原位置,要么偏移到两倍的位置

4. HashMap的长度为什么是2的幂次方

为了能让HashMap存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。

什么是哈希码

Java中,哈希码代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其哈希码相等,则这两个字符串是相等的。其次,哈希码是一种数据结构的算法。

什么是哈希函数

就是一个函数
同一个字符串使用同样的哈希函数计算出来的哈希码必定是一样的
不同的字符串使用同样的哈希函数计算出来的哈希码大概率是不一样的,小概率一样(理想状态是完全不一样)


哈希函数.png

什么是哈希碰撞/哈希冲突

如果有两个字符串通过同样的哈希算法计算出来的哈希码是一样的,则称他们发生了哈希碰撞

如何解决哈希冲突

1.开放地址法
2.拉链法(链地址法)HsapMap默认使用的

如何决定使用HashMap还是TreeMap ?

对于在Map中插入、删除和定位元秦这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行逼历,Treelap是更好的选择。基于你的co1lection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历

有关JAVA学习day11的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  7. ruby - 安装libv8(3.11.8.13)出错,Bundler无法继续 - 2

    运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  10. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

随机推荐