小编pjj*_*pjj的帖子

为什么HashMap的get方法有一个FOR循环?

我正在查看HashMapJava 7 中的源代码,我看到该put方法将检查是否已存在任何条目,如果它存在,那么它将用新值替换旧值.

    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以,基本上它意味着给定密钥总是只有一个条目,我也通过调试看到了这一点,但如果我错了,那么请纠正我.

现在,由于给定键只有一个条目,为什么该get方法有FOR循环,因为它可以简单地直接返回值?

    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;
    } …
Run Code Online (Sandbox Code Playgroud)

java hashmap

46
推荐指数
3
解决办法
4921
查看次数

锁定分裂与锁定条带化

以下是约书亚的Effective Java摘录:

如果在内部同步类,则可以使用各种技术来实现高并发性,例如锁定拆分,锁定条带化和非阻塞并发控制.

以上表明锁定分裂和锁定条带是两种不同的技术,但当我试图找到差异时,我找不到差异.

它们之间是否有区别或它们是一样的?

java multithreading locking

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

关于UDP服务器如何将响应发送回UDP客户端的困惑

我正在编写一个基于UDP的客户端服务器并且已经获得了相当多的代码,但我对UDP服务器如何将响应发送回UDP客户端感到困惑,这是我的理解,直到现在:

  • 假设UDP客户端想要与UDP服务器通信,因此它将向UDP服务器发送请求(使用在客户端打开的UDP套接字),现在这将到达UDP服务器上的UDP模块,UDP模块将在其中识别使用端口号的UDP服务,并将该请求发送到该UDP服务/服务器.
  • 现在,由于UDP是一种无连接协议,因此与TCP不同,UDP服务器不会通过某些连接发送响应,而是UDP服务器将从请求中提取源IP地址和源端口,并将响应发送回客户端.

我的困惑是,在服务器端,有一个套接字绑定到UDP端口并"连续"监听任何UDP客户端请求,但在客户端不是这样,UDP客户端将打开一个套接字发送请求到UDP服务器,那就是它,我认为它不能保持该端口挂起UDP服务器响应,如果该端口关闭,那么客户端将如何接收响应.

我的意思是说,UDP服务器的响应将返回UDP客户端,因为IP地址在那里,但一旦该响应已到达客户端的UDP模块,即使有一个端口,但UDP模块如何将其发送给最初的客户端发送请求是因为它会关闭绑定到该端口的套接字?或者它不会?

我正在寻找能够清楚地描述UDP通信的答案(我不想将它与TCP进行对比或解释TCP,因为我已经对TCP有了一定的了解),尤其是响应将如何回到UDP客户端.

udp tcp-ip

7
推荐指数
1
解决办法
4265
查看次数

内存泄漏使用自动装箱

我正在按照教程,下面是自动装箱内存泄漏的例子.

package com.example.memoryleak;
public class Adder {
  public long addIncremental(long l) {
    Long sum=0L;
    sum =sum+l;
    return sum;
  }
  public static void main(String[] args) {
    Adder adder = new Adder();
    for(long ;i<1000;i++)  {
      adder.addIncremental(i);
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

现在,我可以理解,由于自动装箱会产生不必要的对象,但它如何导致内存泄漏,我理解的方式是当你持有对死对象的强引用时会导致内存泄漏.现在,在这种情况下,一旦我从FOR循环中出来,就没有对这些Long对象的强引用,那么它是如何导致内存泄漏的?

请注意我想了解它是如何导致内存泄漏的,我知道这些对象是不必要的.

java memory garbage-collection memory-leaks memory-management

5
推荐指数
1
解决办法
649
查看次数

print 函数来自哪个模块

作为初学者,我的理解是Python标准库(PSL)提供了很多模块,这些模块提供了很多功能,但是如果我想使用这些模块,那么我必须导入模块,例如,sys等等os。 PSL 模块,但仍然需要导入。

现在,我想知道是否是这种情况,那么在不导入任何内容的情况下,我如何能够使用printlist等函数len?是他们的“支持内置于解释器中”吗?

python

5
推荐指数
1
解决办法
3611
查看次数

字段注入如何破坏不变性

我读到(例如此处),如果我使用字段依赖项注入,那么我无法创建不可变对象,但我不明白字段依赖项注入如何破坏不可变性,我可以执行如下操作可以创建不可变对象SpringTest,不是吗?

@Component
public final class SpringTest {

    @Autowired
    private Person person;

    // here I will have no setter methods exposing "person" object but will only have getter methods for "person" object, ensuring defensive copying etc...

}
Run Code Online (Sandbox Code Playgroud)

更新:请注意,我的问题特别是关于字段注入破坏不变性,所以我想知道我的上面的代码片段(自我最初的问题以来发生了变化,感谢@Andy和其他人纠正它)是如何破坏不变性的,我认为事实并非如此,所以我认为这个关于字段注入不变性的答案是错误的。

java spring

5
推荐指数
1
解决办法
1013
查看次数

同步和并发集合如何是线程安全的,但它们的内容不是

从这个来源可以阅读:

值得一提的是,同步和并发集合只会使集合本身线程安全,而不是内容。

我认为如果Collection是线程安全的,那么它的内容将隐式是线程安全的。

我的意思是,如果两个线程无法访问我的Collection对象,那么我的Collection对象所持有的对象将隐式成为线程安全的。

我错过了这一点,有人可以用一个例子来解释我吗?

java collections parallel-processing multithreading thread-safety

5
推荐指数
1
解决办法
276
查看次数

这个实现是否会被称为匿名类?

我已经看过很多次,但是我有点困惑这是否会被称为匿名类?

public class Test {
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                System.out.println("##");
            }
        }.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑的原因是因为匿名类没有名称,但是这显然我们已经在Java API中有一个"Thread"类,所以这意味着它有一个名称,如果它有一个名称,那么它是如何匿名的如果它不是一个匿名类,那么它是什么.

我知道这有点愚蠢,但我无法推理自己的确定性 - 因为我看到双方都有有效的论据.

另外,在上面我可以清楚地覆盖类的run方法Thread,现在如果我创建自己的类,让我们说MyClass,在其中定义一些方法,然后尝试做同样的事情,然后为什么我不能覆盖方法MyClass,他们的方式我能够覆盖类的run方法Thread.

public class MyClass {
    private void myMethod1() {

    }

    private void myMethod2() {

    }
}

public class Test {
    public static void main(String[] args) {
        new MyClass(){
            // why I cannot override "myMethod1" and "myMethod1" of `MyClass`, they way …
Run Code Online (Sandbox Code Playgroud)

java anonymous-inner-class anonymous-class inner-classes

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

如何将列表切片直到以负索引结束

我了解到 Python 列表也可以使用负索引遍历,所以我尝试使用负索引对列表进行切片/子列表,但我无法将其切片直到结束。

我的清单是:

areas = ["hallway", 11.25, "kitchen", 18.0, "living room", 20.0, "bedroom", 10.75, "bathroom", 9.50]
Run Code Online (Sandbox Code Playgroud)

知道切片语法是[start:end]并且不计算结束索引,我做到了,upstairs = areas[-4:0]但这并没有给我列表的最后一个元素。

python list slice sublist

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

为什么在HashMap中计算哈希码的索引

我正在检查它的实现,HashMap并且在其中put我看到在计算哈希之后,计算哈希的索引,就像这样int i = indexFor(hash, table.length);,并且它被用作底层地图的索引.

/**
 * Returns index for hash code h.
 */
static int indexFor(int h, int length) {
    return h & (length-1);
}
Run Code Online (Sandbox Code Playgroud)

我搜索没有找到任何解释我的问题,为什么再次计算哈希索引,用作底层数据结构的最终索引.与使用哈希作为索引相比,它有什么优势.

我知道它只是按位而已,但我想知道为什么会这样做.

java hash hashmap

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