关于java中HashMap的put方法中的参数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java中HashMap的put方法中的参数问题相关的知识,希望对你有一定的参考价值。

请问下面中key指的是对象的什么参数,还有value中我应该插入什么值
list.put(objcet key,objcet value);

HashMap 是以 键值对 形式 保存 数据的,
简单形容 可以 理解为 学号(key),学员(value)
object 类型是java中 除了基本数据类型以外的超类,
也就是说只要你放的对象类型直接或间接继承object,就可以装入key或value中
如果使用泛型 的话 键值是固定的,value不需要强制转换
参考技术A put方法中的参数类型可以在创建HashMap的时候进行指定,之后进行赋值即可。举例:
HashMap<String,String> headers = new LinkedHashMap<String,String>();
headers.put("Cache-Control", "no-cache");
headers.put("Connection", "close");
以上HashMap就是先定义了存放的key和value值都是字符串类型,之后可以通过get方法获取到对应的值(如:headers.get("Cache-Control"),结果就是”no-cache“);
备注:”<String,String>“这个中的类型可以根据实际需要进行修改即可。
参考技术B //ArrayList

ArrayList arraylist=new ArrayList();
arraylist.add(0,"end");//指定索引加入值
//需注意的是,如果现有2个值,我加入索引为5的那么就会出现异常
for(int i=0;i<2;i++)
arraylist.add(i,String.valueOf(i));

System.out.println("ArrayList:");
for(int i=0;i<arraylist.size();i++)
System.out.print(arraylist.get(i)+";");

arraylist.add("0");//直接加入值到ArrayList的最后
arraylist.add("0");
System.out.print("\nArrayList\'s lastIndexOf(\"0\") is "+arraylist.lastIndexOf("0"));

//Arrays

String []array=new String[]"a","b","c";
List list=Arrays.asList(array);
System.out.println("\nArrays:");
for(int i=0;i<list.size();i++)
System.out.print(list.get(i)+";");

System.out.print("\nArrays\'s length is "+array.length);//打印数组的长度


//HashMap

HashMap hashmap=new HashMap();//一个速度最快的容器
hashmap.put("0","c");
hashmap.put("1","a");
hashmap.put("2","b");
hashmap.put("3","a");
System.out.println("HashMap:");
System.out.println(hashmap);//该容器有其内部的排序方式
Set set=hashmap.keySet();//获取全部键
Iterator iterator=set.iterator();
while(iterator.hasNext())
System.out.print(hashmap.get(iterator.next())+";");


//HashSet

HashSet hashset=new HashSet();//一个绝对不能重复的类型
hashset.add("c");
hashset.add("b");
hashset.add("a");
hashset.add("a");
hashset.add("b");
System.out.println("\nHashSet:");
System.out.println(hashset);
Iterator iterator=hashset.iterator();//取出元素
while(iterator.hasNext())
System.out.print(iterator.next()+";");



//LinkedList

LinkedList linkedlist=new LinkedList();//自由使用是它的特色
linkedlist.add("a");
linkedlist.add(1,"c");
linkedlist.addLast("b");
linkedlist.addFirst("d");
System.out.println("\nLinkedList:");
System.out.println(linkedlist);
//linkedlist.clear();//该方法清空容器
//linkedlist.remove(0);//删除索引为0的元素
//linkedlist.remove("d");//删除值为d的元素
//linkedlist.removeFirst();//删除第一个元素
//linkedlist.removeLast();//删除最后一个元素
for(int i=0;i<linkedlist.size();i++)
System.out.print(linkedlist.get(i)+";");




参考技术C 我对楼上做一些补充
key 是唯一的,不可重复的,落在后面的代码中重新给该KEY赋值的话,以前KEY中的值将会被新的值代替掉
OBJECT是所有类的‘祖先’
参考技术D 什么类型都可以的 HashMap我们最常把key存为String类型 value存储集合或者对象 在做购物车的时候用HashMap是很方便的

HashMap的put()方法的再理解

一.创建

这个相信大家也都知道怎么使用。今天就深入理解一下这里的底层原理。
首先HashMap在java中,创建出来是一个数组,然后数组上存放的元素是一个链表。

二.put()

进入底层源码看一下。


HashMap,在添加第一个元素的时候创建一个默认2的幂的数组。也就是16,这个参数也可以你自己设置。但是一定是2的幂,假如new HashMap(30),那么只会创建一个32大小的数组。

计算出元素的hashcode,放到指定位置,看数组中是否有元素,无元素直接放到数组元素上,有元素的话则进行(jdk1.8)尾插。

当一个数组元素下的链表长度超过8,就会触发treeifyBin(),

但是必须满足,数组的长度大于64,否则,只是就行resize()扩容,重新hash。
如果满足链表长度大于8,并且数组长度大于64,此时就把链表转换成红黑树(一种比较平衡的二叉搜索树)。
着里再讲一个设计remove()删除元素,当红黑树里的元素被删除到小于8的时候怎么办?其实这里有个过渡,不是8,而是如果红黑树里的元素删除的小于6的时候就会触发收缩检测。

此时就会红黑树收缩回链表了。

三.数组初始化

前面 put里提到过,初始new HashMap() 默认大小是16,可以指定数组大小,但是一定是2的幂。如 new HashMap(30),那么数组的大小就为32了。这个都很好理解。

四.扩容


负载因子 = 添加的元素 / hash表的长度

这个值默认是 0.75 ( jdk1.8)(可以根据实际需求调整,当值越大hash冲突概率就高,查询效率低,节省了空间,反之相反),当超过0.75,就会触发resize(),进行数组的扩容。

以上是关于关于java中HashMap的put方法中的参数问题的主要内容,如果未能解决你的问题,请参考以下文章

关于JAVA中的HashMap 和iterator的问题

Java集合源码剖析——基于JDK1.8中HashMap的实现原理

HashMap的put()方法的再理解

HashMap的put()方法的再理解

HashMap的put()方法的再理解

HashMap的put()方法的再理解