论坛首页 Java企业应用论坛

请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧

浏览 101438 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-09-29  
很惭愧,没看懂
0 请登录后投票
   发表时间:2010-09-29  
allskylove 写道
好,不看我刚才发的贴了,哈哈,说实话真的很乱,我是先从word里输入的,再copy 过来的。 没有版面了,字体颜色也没有了。 那就这样哈, String a=new String("abc"); 此问题 要依赖于上下文环境来分情况考虑, 如果上文已经产生了"abc" 那么 该句只创建一个String 对象实例, 如果上文没有产生"abc" 那么就创建两个String 对象实例。

不明白的话,再看我上面的长贴。


额,其实楼主有一个例子:
String s1 = new String("xyz");
String s2 = new String("xyz");

用来说明 【如果上文已经产生了"abc"】 这个情况。

关于你之前说楼主JVM方面有不正确的(“ 对jvm 的了解很是无语”),还希望指出来。
0 请登录后投票
   发表时间:2010-09-29  
这个是栈和堆得问题。

使用new是肯定要产生一个对象的。

直接使用字符串"",虚拟机就会在静态栈上寻找有没有,如果没有再创建这样就有2个对象被创建,如果有那么就会以节约空间的办法,使用这个已经创建的字符串。

这个是我理解的概念,如有不对希望指正。
0 请登录后投票
   发表时间:2010-09-29  
allskylove 写道
好,不看我刚才发的贴了,哈哈,说实话真的很乱,我是先从word里输入的,再copy 过来的。 没有版面了,字体颜色也没有了。 那就这样哈, String a=new String("abc"); 此问题 要依赖于上下文环境来分情况考虑, 如果上文已经产生了"abc" 那么 该句只创建一个String 对象实例, 如果上文没有产生"abc" 那么就创建两个String 对象实例。

不明白的话,再看我上面的长贴。

求教allskylove大大,
public class StringDemo2 { 
  public static void m() { 
    String b = "abc";
    String a = new String("abc");
  }
  
  public static void main(String[] args) {
    m();
    m();
  }
}

m 被调用了两次,是不是总共创建了4个String 对象?
0 请登录后投票
   发表时间:2010-09-29   最后修改:2010-09-29
allskylove 写道


你还是再看看吧!我看你被楼主忽悠了! 篇幅长了容易忽悠人! 就想路长了 容易迷路一样! 哈哈。


OK,OK,我又去看了一遍,楼主的文章太长,所以下结论时是有没说清楚的地方, 因为我是本来就知道new String这档子事,所以没有逐字看楼主的文章。

楼主的结论:

所以刚才用于归谬的代码片段:
Java代码
String s1 = new String("xyz"); 
String s2 = new String("xyz"); 

每执行一次只会新创建2个String实例。
就是s1 s2

这必须建立在:如果之前有产生"xyz"。

但楼主之前说了: 在运行时涉及(我理解成,在运行那个函数要创建String时)
应该就是说 上下文为:之前有产生"xyz"。

我觉得楼主还不至于“简直是一派胡言”。但关于JVM,我没看到楼主哪说得有问题呀。



0 请登录后投票
   发表时间:2010-09-29  
allskylove 写道
winipon 写道
这个是栈和堆得问题。

使用new是肯定要产生一个对象的。

直接使用字符串"",虚拟机就会在静态栈上寻找有没有,如果没有再创建这样就有2个对象被创建,如果有那么就会以节约空间的办法,使用这个已经创建的字符串。

这个是我理解的概念,如有不对希望指正。


静态栈? 是什么? 我很希望大家发散思维!错了也没有关系,说不定我们的错误就是对世界的更好认识。打破常规是在创新!

理解上的问题,其实就是栈上分配。
0 请登录后投票
   发表时间:2010-09-29  
zx339 写道
allskylove 写道


你还是再看看吧!我看你被楼主忽悠了! 篇幅长了容易忽悠人! 就想路长了 容易迷路一样! 哈哈。


OK,OK,我又去看了一遍,楼主的文章太长,所以下结论时是有没说清楚的地方, 因为我是本来就知道new String这档子事,所以没有逐字看楼主的文章。

楼主的结论:

所以刚才用于归谬的代码片段:
Java代码
String s1 = new String("xyz"); 
String s2 = new String("xyz"); 

每执行一次只会新创建2个String实例。
就是s1 s2

这必须建立在:如果之前有产生"xyz"。

但楼主之前说了: 在运行时涉及(我理解成,在运行那个函数要创建String时)
应该就是说 上下文为:之前有产生"xyz"。

我觉得楼主还不至于“简直是一派胡言”。但关于JVM,我没看到楼主哪说得有问题呀。






s1, s2是引用,实例是new 产生的,我的理解是new一次就肯定创建一个对象。所以不管有没有xyz,都会有2个对象产生。

上下文产生没产生xyz,这个不是应该是我们咨询面试官的。
0 请登录后投票
   发表时间:2010-09-29  
allskylove 写道


不许跑,你还说人家JVM了解有问题,他哪说得有问题了?
0 请登录后投票
   发表时间:2010-09-29  
非常长…… 见谅不看了^-^
0 请登录后投票
   发表时间:2010-09-30  
这个问题对java应用几乎没什么意义。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics