小编dgu*_*091的帖子

什么是hashmap中的桶?

最近,在一次采访中我被问到,hashmap中究竟是什么?无论是数组还是arraylist还是什么?

我很困惑.我知道哈希映射是由数组支持的.那么我可以说bucket是一个容量为16的数组,在开始存储哈希码时,链接列表的起始指针是什么?

我知道hashmap内部是如何工作的,只是想知道数据结构方面究竟是什么样的桶.

java linked-list hashmap hashcode bucket

27
推荐指数
3
解决办法
2万
查看次数

在哈希图中,将新元素添加到存储桶的内部链表中总是在最后。为什么?

在哈希图中,当我们具有相同的哈希码时,我们将对象插入为链表,然后将其转换为TreeNode。具有相同哈希码的每个New对象将添加到附加的链表的最后一个。因此,我的问题是,为什么不添加新元素作为附加到存储桶的内部链接列表的第一个元素?为什么我们要遍历到最后一个元素,然后添加新元素。

链接列表花费的时间:

在开始处插入新元素= O(1)

在末尾插入新元素= O(n)


可能的答案可能是,因为hashmap不是线程安全的,因此从单个位置并发读取和写入元素可能导致异常。例如,有两个事务:

T1-将新对象添加到哈希图中已经存在哈希码的地图中。

T2-从地图读取新对象,再次在哈希图中已经存在哈希码。

当这两个事务同时发生,并且我们开始将新元素添加到开头而不是最后一个位置时,由于在第一个位置进行了更改,因此读取操作可能会受到影响的可能性很小。

如果有人对此有更好的见解,请发表评论。

java collections concurrency linked-list hashmap

9
推荐指数
1
解决办法
492
查看次数

如果keySet()维护HashMap的顺序,为什么我们需要LinkedHashMap?

public class HashMapKeySet {

public static void main(String[] args) {
    Map<HashCodeSame,Boolean> map=new HashMap();

    map.put(new HashCodeSame(10),true);
    map.put(new HashCodeSame(2),false);

    for(HashCodeSame i:map.keySet())
        System.out.println("Key: "+i+"\t Key Value: "+i.getA()+"\t Value: "+map.get(i)+"\t Hashcode: "+i
                .hashCode());

    System.out.println("\nEntry Set******");
    for(Map.Entry<HashCodeSame, Boolean> i:map.entrySet())
        System.out.println("Key: "+i.getKey().getA()+"\t Value: "+i.getValue()+"\t Hashcode: "+i.hashCode());

    System.out.println("\nValues******");
    for(Boolean i:map.values())
        System.out.println("Key: "+i+"\t Value: "+map.get(i)+"\t Hashcode: "+i.hashCode());

}

static class HashCodeSame{

    private int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    HashCodeSame(int a){
        this.a=a;
    }

    @Override
    public boolean equals(Object …
Run Code Online (Sandbox Code Playgroud)

java collections hashmap linkedhashmap keyset

3
推荐指数
1
解决办法
919
查看次数

为什么hashcode()返回一个整数但不长?

在java中,hashcode()方法返回整数而不是long.有什么具体原因吗?

java arrays performance hashcode bucket

3
推荐指数
1
解决办法
411
查看次数

为什么说我们不需要克隆不可变的类?

不可变类只是其实例无法修改的类。不可变类非常适合缓存,并且是线程安全的。不变对象是实例,实例一旦启动就不会改变。

而对象克隆是指创建对象的精确副本。它创建当前对象类的新实例,并使用该对象相应字段的内容完全初始化其所有字段。

现在,出现了一个问题,为什么它说我们不需要克隆一个不可变的类?

是因为创建已经用于缓存目的的数据的精确副本会添加到系统中创建的垃圾中,并可能减慢应用程序的速度。还是其他一些相关的答案呢?

java clone immutability

3
推荐指数
1
解决办法
92
查看次数

在存储桶中的条目对象从阈值开始减少后,JDK 8中的hashmap是否会再次自行调整大小.

我遇到了一个博客,其中在JDK8中给出了hashmap的更改和性能改进.

从JDK 1.8开始,HashMap引入了一种改进的策略来处理高冲突率.由于糟糕的散列函数(例如总是返回相同存储桶的位置),可以将HashMap转换为链接列表,即将get()方法转换为在O(n)而不是O(1)中执行,并且有人可以利用这一事实,一旦某个阈值被破坏,Java现在在内部将链表重新替换为二进制true.这确保了性能或命令O(log(n)),即使在散列函数没有正确分配密钥的最坏情况下也是如此.

在JDK 8中,我们都知道无论何时达到阈值,链表都会将自身重新调整为二叉树.我想知道当节点变得小于阈值数时,二叉树是否会将自身重新调整为链表.

有人在接受采访时向我询问,不,因为每次数字发生变化时都不会重新调整尺寸.我对吗?

博客供参考:

  1. http://javarevisited.blogspot.com/2014/07/java-optimization-empty-arraylist-and-Hashmap-cost-less-memory-jdk-17040-update.html
  2. http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html

java dictionary linked-list hashmap binary-search-tree

0
推荐指数
1
解决办法
593
查看次数