A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘琦 中级黑马   /  2013-3-16 12:58  /  1641 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘琦 于 2013-3-17 17:24 编辑

String s = new String("678");创建了几个String object?在多线程那里涉及了很多类和对象,到底是怎么去考虑创建了多少个对象呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 虽然类似的问题很多,10分以下,加油.

查看全部评分

8 个回复

倒序浏览
不就是一个对象么!!或许我的理解比较浅薄!
new了一个string,调用它有参数的构造方法。
我是这么简单的理解的!
回复 使用道具 举报
有几个new,就新建了几个对象
回复 使用道具 举报
俩?我猜的{:soso_e144:}
回复 使用道具 举报
String s = new String("678");创建了几个String object?在多线程那里涉及了很多类和对象,到底是怎么去考虑创建了多少个对象呢?


老实说,就你这句话String s = new String("678"); 是创建了两个对象,首先有一个new 关键字就表示创建了一个对象,其次String s = "678";也是创建了一个对象。
从这个方面说,上网的那句话已经创建了两个对象。

而在多线程里面,由start开启一个线程,如果在线程代码块里面创建对象,那么每开启一次线程就会创建一个对象,这里就需要去run方法中到底是new 了几个对象了。



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
    一般情况下,创建对象时通过new关键字创建出来的,但是有的时候会通过一个方法返回类的实例对象,比如单例模式就是通过public static Object getInstance()方法得到的对象,但是这个方法内部也是new出来对象的。所以综上一般情况下都是通过new出来对象的。但是String类确实属于比较另类的一个,因为当你String str = “678”;的时候就也会创建对象,但这个字符串对象会放在常量池中,供以后访问同样的字符串时调用。
    所以,String str = new String("678")这句代码,首先是在常量池中创建了“678”对象,在在堆内存中创建String对象(引用str存在栈内存中),并把常量池中对象“678”的引用传递给String,所以如此下来是创建了两个对象。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
刘凯 金牌黑马 2013-3-16 19:34:08
7#
唐永康 发表于 2013-3-16 14:44
老实说,就你这句话String s = new String("678"); 是创建了两个对象,首先有一个new 关键字就表示创建了 ...

假设在最后一个所有线程都创建字符串前,前边的线程都还没死,且常量池中 的“678”未成垃圾被收回,那么个人认为是 线程个数+1个对象 个人认为是   如楼上所说  当第一个线程String str = “678”;的时候就也会创建对象,但这个字符串对象会放在常量池中,供以后访问同样的字符串时调用。 再有个线程来执行String str = “678”;语句时,由于常量池里已经有了 “678”这个字符串常量了,所以就不必在创建该对象,只需指向就行了 ,而String s = new String("678");是每个线程必须创建一次 放入堆内存中去的   所以 说是线程数+1次   
个人见解
回复 使用道具 举报
若还有问题,请继续追问;没有了的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
刘凯 金牌黑马 2013-3-16 19:56:15
9#
陈丽莉 发表于 2013-3-16 19:49
若还有问题,请继续追问;没有了的话,请将帖子分类改成【已解决】~

这个好多句话 你也不给分{:3_63:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马