Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从局部变量创建ByteArrayInputStream有效吗?_Java_Variables_Garbage Collection_Inputstream_Local - Fatal编程技术网

Java 从局部变量创建ByteArrayInputStream有效吗?

Java 从局部变量创建ByteArrayInputStream有效吗?,java,variables,garbage-collection,inputstream,local,Java,Variables,Garbage Collection,Inputstream,Local,假设函数如下: InputStream func() { byte[] buffer = new byte[] {0,1,2,3}; return new ByteArrayInputStream(buffer); } 如果我调用该函数,是否有可能垃圾收集器删除“buffer”变量而InputStream不再工作 垃圾收集器是否有可能删除“缓冲区” 变量和InputStream不再工作 否,不允许垃圾收集器删除仍被引用的对象。该对象从Byt

假设函数如下:

InputStream func() {            
       byte[] buffer = new byte[] {0,1,2,3};

       return new ByteArrayInputStream(buffer);
}
如果我调用该函数,是否有可能垃圾收集器删除“buffer”变量而InputStream不再工作

垃圾收集器是否有可能删除“缓冲区” 变量和InputStream不再工作


否,不允许垃圾收集器删除仍被引用的对象。该对象从ByteArrayInputStream对象中引用,其内部buf成员引用该对象。

如果您将看到ByteArrayInputStream的构造函数,您将看到以下内容

 public ByteArrayInputStream(byte buf[]) {
        this.buf = buf;
        this.pos = 0;
        this.count = buf.length;
    }

如您所见,字节数组的引用存储在InputStream对象中:this.buf=buf。GC不会收集具有强引用的对象。所以没什么好担心的。

如果它这样做了,那就是一个糟糕的垃圾收集器,因为ByteArrayInputStream仍然在引用数组。不,这是一个很好的工厂式的创建。java中的一切都存在于堆中。数组对象的地址放在本地堆栈变量缓冲区中,但只返回地址。与结果一样,参数也是如此:作为参数的变量永远不会在地址传递时更改其值。有趣的是,了解到“你不需要担心内存”垃圾收集器的存在会让人们在给定内存量的情况下担心它“垃圾回收器会破坏这个吗”的问题。答案当然是,它在使用缓冲区时不会“删除”缓冲区。顺便说一下,你也可以使用更短的数组分配语法:byte[]buffer={0,1,2,3};,结果将是相同的。编辑您的答案,使其更清晰。因为对问题标题和问题正文的回答是相互矛盾的:@Michael Yeah,在发布答案后也看到了这个问题。感谢您提供了这个好的解决方案!