CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

一道java面面试题,迷糊了

楼主cloufei(cloufei)2006-03-15 19:54:08 在 Java / J2SE / 基础类 提问

String   s   =   new   String   ("abc");  
  创建了几个对象?  
  请指教 问题点数:20、回复次数:77Top

1 楼TONYBLARED(奔放的犀牛)回复于 2006-03-15 20:01:07 得分 0

2个.麻烦以后不要问这种白痴问题了,前面有N个帖子有讨论.  
  我是斑竹,谢谢合作.Top

2 楼wizardblue()回复于 2006-03-15 20:01:42 得分 0

好像是说三个吧,"abc"是pool里边的好像,然后再new   一个String   object,再就是一个object   refrence到这个String   objectTop

3 楼goodgod105(不来电)回复于 2006-03-15 20:01:50 得分 0

2个Top

4 楼wshlxvb(酒鬼英明)回复于 2006-03-15 20:01:58 得分 0

两  
  一个是s  
  一个是字符串abc  
  哈哈Top

5 楼Waiting4you(毛毛)回复于 2006-03-15 20:02:39 得分 0

一个对象Top

6 楼universe01(未知软体)回复于 2006-03-15 20:03:23 得分 0

两个对象.堆中一个.  
  栈中一个.Top

7 楼universe01(未知软体)回复于 2006-03-15 20:05:47 得分 0

前提是在栈中先前没有"abc"这个对象.会是两个.Top

8 楼HappyOneRose(小毛)回复于 2006-03-15 20:06:33 得分 0

那也不能说是对象啊,因为JAVA里面除了8中基本的数据类型是对象外,那么剩下的就是引用了啊Top

9 楼sler(施乐)回复于 2006-03-15 20:37:15 得分 0

显然是开辟那一段“abc”的内存,给S这个地址的引用Top

10 楼Flowing_air(凡飞)回复于 2006-03-15 21:01:11 得分 0

路过,不过我觉得应该是两个吧Top

11 楼liuganquan()回复于 2006-03-15 23:37:09 得分 0

简单问题,2个  
  String   s   =   new   String("abc");   //   creates   two   objects,   and   one  
  //   reference   variableTop

12 楼gggggame(小刀)回复于 2006-03-16 00:55:47 得分 0

2Top

13 楼taolei(实在无聊)回复于 2006-03-16 01:50:33 得分 0

简单问题?2个?  
  String   s1   =   new   String("abc");  
  String   s2   =   new   String("abc");  
  上面两行代码创建了几个对象?4个?那就错了。  
   
  得批评一下版主,不要以个人的看法来判断某个问题是否有讨论的必要。如果大家都不感兴趣的话,它自然会沉下去。  
  Top

14 楼TONYBLARED(奔放的犀牛)回复于 2006-03-16 05:05:37 得分 0

实在无聊,你别说话.Top

15 楼Albert_1030()回复于 2006-03-16 07:34:03 得分 0

jiu   shi   4   ge!Top

16 楼lping1986(我是好学生)回复于 2006-03-16 08:22:41 得分 0

2Top

17 楼woolceo(努力升仙)回复于 2006-03-16 08:50:10 得分 0

to   :   taolei(实在无聊)   (   )   信誉:100    
   
  二楼的不是斑竹...Top

18 楼Gorgr(LoveLifeLoveTT!!)回复于 2006-03-16 09:11:20 得分 0

两个Top

19 楼Net8Java(男将╭ァM'r杜)回复于 2006-03-16 09:25:20 得分 0

你搜索一下就行了撒```昏,怎么又是这个问题?Top

20 楼k3179(螃蟹)回复于 2006-03-16 09:31:47 得分 2

String   a1=new   String("abc");  
  String   a2=new   String("abc");  
  .  
  .  
  .  
  String   an=new   String("abc");  
  这样就是n+1个对象,一个"abc"对象和n个new出来的对象Top

21 楼diy8187(雞狗豬驢)回复于 2006-03-16 09:44:09 得分 2

两个对象,一个是“abc”,一个是指向“abc”的引用对象s。  
  JAVA常见的面试题.  
  Top

22 楼yxiao80()回复于 2006-03-16 09:53:01 得分 0

2个Top

23 楼roypayne(工作时候一心工作,学习时候一心学习,玩的时候好好玩!)回复于 2006-03-16 10:48:50 得分 0

同上  
  Top

24 楼lyf040230427(枫叶)回复于 2006-03-16 12:06:47 得分 0

别在这里空说,写个程序测试一下就知道了.3个.  
  public   class   Test{  
              public   static   void   main(String   args[]){  
                            String   a1   =   new   String("abc");  
                            String   a2   =   new   String("abc");  
                            System.out.println(a1   ==   a2);     //false  
                            System.out.println(a1   ==   "abc");   //false  
                            System.out.println(a2   ==   "abc");     //false  
                             
              }  
  }  
  测试后是3个对象.  
  这种问题CSDN上已经有很多了.  
  Top

25 楼suncheng_hong(亮)回复于 2006-03-16 13:13:42 得分 0

栈中s,堆中"abc"Top

26 楼sler(施乐)回复于 2006-03-16 15:05:08 得分 0

经过推敲,觉得是2个对象。。。Top

27 楼chenliang0629(狼)回复于 2006-03-16 15:36:13 得分 0

应该是两个对象。Top

28 楼taolei(实在无聊)回复于 2006-03-16 16:14:00 得分 2

晕了,真不知道为什么这么多人坚持是两个,答案是靠背的?  
  象"abc"这样的字符串常量只在第一次引用的时候创建一个对象,以后使用的时候将引用同一个对象。  
  例如:  
  s1   =   "abc";  
  s2   =   "abc";  
  那么   (s1==s2)就是true,s1和s2引用同一个对象。  
   
   
  String   s   =   new   String   ("abc");  
  这里   s和"abc"   是不同的对象。s是新创建的对象,但是,"abc"这个对象是不是在这里创建的呢?这要看"abc"是不是第一次被引用了,从给出的问题上无法判断,所以不一定是创建了两个对象。  
  Top

29 楼treeroot(旗鲁特)回复于 2006-03-16 16:17:25 得分 0

真无聊,创建了几个对象就数一下有一个new操作符就可以了  
   
  很明显就一个new当然是一个对象了,大家都过敏了呀!Top

30 楼chyx413332087()回复于 2006-03-16 16:32:20 得分 0

一个对像(abc),一个指向对像对像的引用  
  其实这样的问题以前有好多了,  
  Top

31 楼Waiting4you(毛毛)回复于 2006-03-16 20:03:49 得分 0

这个问题没必要讨论,那个公司出这种面试题呀?  
  String   s   =   new   String   ("abc");这个过程中出现过几个对象只有sun公司才去关心,我们只管用好s就行了,也许现在是三个,或者两个.可能以后sun公司把它优化了一下,就只有一个了.也就是说做编译器(或者在VM里?)的最后目标就是把它优化成只出现一个对象.Top

32 楼cloufei(cloufei)回复于 2006-03-16 22:12:28 得分 0

谁能给出老贴的地址啊?Top

33 楼cloufei(cloufei)回复于 2006-03-16 22:47:39 得分 0

java中的   =   号   在使用过程中会产生内存的分配吗?Top

34 楼treeroot(旗鲁特)回复于 2006-03-17 08:57:46 得分 0

和编译器没有关系,和sun也没有关系  
  一个就是一个,根本没有什么不确定因素Top

35 楼LoveXiaoShuang()回复于 2006-03-17 08:59:57 得分 0

String   s   =   new   String   ("abc");  
  当然是创建了2个对象。  
  Top

36 楼strawren(大漠)回复于 2006-03-17 12:31:45 得分 2

晕了,真不知道为什么这么多人坚持是两个,答案是靠背的?  
  象"abc"这样的字符串常量只在第一次引用的时候创建一个对象,以后使用的时候将引用同一个对象。  
  例如:  
  s1   =   "abc";  
  s2   =   "abc";  
  那么   (s1==s2)就是true,s1和s2引用同一个对象。  
   
   
  String   s   =   new   String   ("abc");  
  这里   s和"abc"   是不同的对象。s是新创建的对象,但是,"abc"这个对象是不是在这里创建的呢?这要看"abc"是不是第一次被引用了,从给出的问题上无法判断,所以不一定是创建了两个对象。  
  Top

37 楼ibiswang(神鸟)回复于 2006-03-17 12:36:11 得分 2

是三个对象!!!!  
   
  因为String是个特殊的类型,也就是说String对象之间的赋值是传值而不是通常意义上的传址或引用。  
   
  首先:"abc"被compiler放到一个临时的对象中,我们设为obj1;  
  然后:new   String("abc")将一个新String对象,设定为obj2;  
  再后:用obj2对s对象进行赋值,由于String的特殊性,它是将obj2进行copy到的字串放到s对象中;  
   
  所以:三个对象。  
  Top

38 楼ibiswang(神鸟)回复于 2006-03-17 12:41:56 得分 2

再一下Java原代码吧:  
   
  1.   构造方法:  
   
          public   String(String   original)   {  
    this.count   =   original.count;  
    if   (original.value.length   >   this.count)   {  
            //   The   array   representing   the   String   is   bigger   than   the   new  
            //   String   itself.     Perhaps   this   constructor   is   being   called  
            //   in   order   to   trim   the   baggage,   so   make   a   copy   of   the   array.  
            this.value   =   new   char[this.count];  
            System.arraycopy(original.value,   original.offset,  
              this.value,   0,   this.count);  
    }   else   {  
            //   The   array   representing   the   String   is   the   same  
            //   size   as   the   String,   so   no   point   in   making   a   copy.  
            this.value   =   original.value;  
    }  
          }  
   
  ===================  
  上面说明"abc"与new   String("abc")不是同一个对象,是两个不同的String对象;-------2个;  
   
  2.   另外,再看看Java相关的教材就知道了string对象是值copy对象,所以=会再产生一个string   对象.--------1个;  
   
  所以共3个对象。  
   
  Top

39 楼murasaki(风羽)回复于 2006-03-17 14:38:42 得分 2

String   s=new   String("abc");  
  "abc"如果在string   pool里面有,则不创建,如果没有,则在String   pool里创建一个String类型的对象实例。  
  new   String("abc");会在heap中创建一个String对象实例,并将String   pool里的"abc"的内容复制到heap中。  
  而s是指向heap的一个指针,s本身是在栈中,其本身是指针结构而不是String对象结构  
   
  所以,上题正确的答案应该是,若"abc"不在string   pool中,则该语句会创建两个String结构的对象。  
   
  不知道这样解释清楚了么?  
  另外,String的值copy特性只在其做为参数传值时体现。  
  所以  
  String   a="abc";  
  String   b=a;  
  System.out.println(a==b);  
  是true,这证明了a和b都是指针,并且指向了相同的地址,所以相等。  
  而如果此时真的是值copy,则String   b=a;应该是将a所指向的String   对象结构复制到b指向的另一空间的String对象结构,则a不应该等于b,因为它们应指向不同的地址。Top

40 楼soft1999(豆子1999)回复于 2006-03-17 14:40:49 得分 0

3个对象。  
   
  一般都把pool里边的忘了Top

41 楼jiang_xiao(原来秋天)回复于 2006-03-17 14:52:31 得分 0

明显一个对象"abc".还有一个是引用,类似c++的指针,在栈上。Top

42 楼zxjoe(joe)回复于 2006-03-17 15:25:46 得分 0

2geTop

43 楼Kirschs()回复于 2006-03-17 15:48:08 得分 2

比较赞同下述观点  
   
    liuganquan()   (   )   信誉:100     2006-3-15   23:37:10     得分:   0            
  简单问题,2个  
  String   s   =   new   String("abc");   //   creates   two   objects,   and   one  
  //   reference   variable  
   
   
    taolei(实在无聊)   (   )   信誉:100     2006-03-16   16:14:00     得分:   0        
        晕了,真不知道为什么这么多人坚持是两个,答案是靠背的?  
  象"abc"这样的字符串常量只在第一次引用的时候创建一个对象,以后使用的时候将引用同一个对象。  
  例如:  
  s1   =   "abc";  
  s2   =   "abc";  
  那么   (s1==s2)就是true,s1和s2引用同一个对象。  
   
  String   s   =   new   String   ("abc");  
  这里   s和"abc"   是不同的对象。s是新创建的对象,但是,"abc"这个对象是不是在这里创建的呢?这要看"abc"是不是第一次被引用了,从给出的问题上无法判断,所以不一定是创建了两个对象。  
     
  Top

44 楼Jeremyzhou(Jeremy)回复于 2006-03-17 16:16:04 得分 2

taolei(实在无聊)   (   )   信誉:100     2006-03-16   16:14:00     得分:   0        
  比较支持这种观点。  
  但是我还是认为是2个  
  因为这里面考的不是我们abc创建的对象。而是new的那句话创建的对象。  
  鄙人从出题者的观点看待这个问题Top

45 楼fennsky(大米)回复于 2006-03-17 16:21:29 得分 0

String   s=   new   String("haha");  
  s--->是个引用,在栈里  
  haha---->是创建出来得对象,放在堆里Top

46 楼gavin_yue(炙冰)回复于 2006-03-17 16:25:58 得分 0

晕   不懂JAVA也敢参加JAVA面试啊?Top

47 楼youngerpeo(小强q)回复于 2006-03-17 17:26:26 得分 0

这里有很多人把  
  String   a   =   "abc";  
  跟  
  String   a   =   new   string("abc");  
  搞混了~  
  Top

48 楼kunzhong(昆仲)回复于 2006-03-17 17:38:57 得分 0

应该是一个哦  
  那就是s哦  
  那个abc是s的初使值百!  
  看看new不就知道是一个的哦  
  怎么回有两个呢Top

49 楼funcreal(为中华之崛起而编程)回复于 2006-03-17 17:53:29 得分 0

哈哈哈哈哈哈哈。大家很好笑。Top

50 楼kunzhong(昆仲)回复于 2006-03-17 18:25:44 得分 0

我刚才看了上面的  
  现在有个程序   枫叶的  
  public   class   hu{  
              public   static   void   main(String   args[]){  
                             
                          String   a1=new   String("abc");  
                               
                            System.out.println(a1   ==   "abc");   //false  
                             
   
              }  
  }  
  而  
  public   class   hu{  
              public   static   void   main(String   args[]){  
                             
                          String   a1="abc";  
                               
                            System.out.println(a1   ==   "abc");   //true  
                               
   
              }  
  }  
  所以说应该是两对象呢  
  Top

51 楼msk316647129(轩辕)回复于 2006-03-17 19:52:28 得分 0

晕Top

52 楼msk316647129(轩辕)回复于 2006-03-17 20:18:30 得分 0

使用new是新建了一个对象s是肯定的,主要是考虑string所起的作用.在给定类中定义了一个构造函数(注意本例只定义了一个),该构造函数初始化了一个新的对象及其变量,创建了该对象所需的任何其他对象,  
  也就是说构造函数定义了一个对象,(上句可参考java2 21天自学通63页)  
  故此程序应该是创建了两个对象Top

53 楼suker3312(小过)回复于 2006-03-17 21:31:45 得分 0

2   个Top

54 楼Nowish(看我能忍耐多久)回复于 2006-03-17 22:01:07 得分 0

MARK~Top

55 楼filippo_le(命--(天晓得我是哪个))回复于 2006-03-17 22:55:26 得分 0

对象不要去在意了,知道==,equal的比较,返回!这些功能就可以了  
  当然,字符串的东西还是要搞清楚的,可以去查查String的源代码,你应该会更清楚点Top

56 楼quqiujie(紫炎)回复于 2006-03-17 23:15:52 得分 0

谁给出个正确的答案呀  
   
  我都晕了!Top

57 楼Nowish(看我能忍耐多久)回复于 2006-03-17 23:20:37 得分 0

2个   肯定的Top

58 楼qiubiyu()回复于 2006-03-17 23:24:04 得分 0

请给出一个权威的答案!Top

59 楼larryzhao(Larry.Zhao)回复于 2006-03-18 10:13:28 得分 0

顶了关注Top

60 楼gj_world(gj)回复于 2006-03-18 12:08:18 得分 0

到底是几个啊?   说来说就我都不知道怎么办了,对我这新手来说是好晕啊!Top

61 楼zncn2(embedded system)回复于 2006-03-18 12:47:22 得分 0

markTop

62 楼channel_niu(牛牛)回复于 2006-03-18 13:19:11 得分 0

我也想知道真实的答案!Top

63 楼youngerpeo(小强q)回复于 2006-03-18 13:41:41 得分 2

 
  说了好几遍了~~  
   
  string   a   =   new   string("abc");  
   
  跟  
   
  string   a   =   "abc";  
   
  原理不一样  
   
  string   a   =   new   string("abc");  
  一定是创建了一个string对象(堆),一个是string对象的引用(栈)  
   
  string   a   =   "abc";  
  这要看情况,如果之前有   string   X="abc";,这样子不会新创建string对象,而只是创建了一个对象引用.  
   
  如果没有string   x="abc";之类的存在,则会创建一个新的string对象abc,并且还会创建一个string对象的引用Top

64 楼WiseDragon(慧龙)回复于 2006-03-18 13:47:54 得分 0

晕了Top

65 楼cqsls(阿玄)回复于 2006-03-18 14:36:02 得分 0

分呢Top

66 楼cloufei(cloufei)回复于 2006-03-19 15:18:38 得分 0

晕死了,结贴了.不过希望有人能把arraycopy解释的清楚一点.我问了275考试中这题的标准答案是2个.谢谢大家.Top

67 楼jik120()回复于 2006-03-23 01:49:52 得分 0

两个Top

68 楼chengjianbing(java程)回复于 2006-03-23 18:59:57 得分 0

答案是:两个,这个面试题我也做过,Top

69 楼treeroot(旗鲁特)回复于 2006-03-24 10:14:05 得分 0

简直就是误人子弟!  
  作为字符串常量池是编译器处理的,不能当作创建的对象之说  
  所谓创建的对象就是指在堆中分配的,使用new才作为创建的,是一种动态行为。  
  常量池是静态行为,不作为创建的对象。  
  在栈里的引用更不能作为对象处理,其实和c语言是一样的,只有malloc才算真正的非配内存,  
  其他的定义都是静态分配的。  
  Top

70 楼bdwer(bdwer)回复于 2006-03-24 16:22:08 得分 0

都让你们给搞晕了,到底几个啊?、  
  另外我记得判断是否相等是用的:equals()方法吧???  
  同志们!Top

71 楼murasaki(风羽)回复于 2006-03-27 16:53:52 得分 0

嗯,如果按照treeroot的说法,我也觉得有一定道理。  
   
  我理解,按照treeroot所说,所谓静态行为,即在编译时将这些字符串事先编译到了代码段里。  
   
  也就是说,并非是程序运行到String   s="abc";才去池中查找,才知道要在池里建个abc,而是在编译时,早就将本程序所有的静态字符串扫描过了,都编在了代码里,包括这个"abc"。那么当然,“运行这句时,在池中查找,如果没有就建立”的说法是不成立的了。  
   
  下面我还有个问题就是,池中的"abc"的内存结构是不是和堆上建立的那些String   一样的?即包括完整的toString()方法等的定义?Top

72 楼qcrg(青春如歌)回复于 2006-03-29 22:34:04 得分 0

两个,一个为对象,一个是对象的引用Top

73 楼welfarefanwei(伟大)回复于 2006-03-31 07:52:42 得分 0

Mark!Top

74 楼kangtayanzi(樱空)回复于 2006-04-01 14:15:01 得分 0

真是个无聊的问题Top

75 楼Acoolice()回复于 2006-04-03 20:45:50 得分 0

2Top

76 楼NerGP(大雄)回复于 2006-04-16 16:04:56 得分 0

2个,一个Class对象,一个String对象Top

77 楼catmiw(catmiw)回复于 2006-06-19 16:09:37 得分 0

这个问题很无聊吗?  
  可以说没几个人答得上来Top

相关问题

  • 求java面试题
  • ### java面试问题集 ###
  • 再一java面试题目
  • 收集JAVA面试时的问题
  • JAVA程序员面试的问题
  • JAVA面试题:那位仁兄能做?
  • java刚刚面试的一道试题!
  • Java 面试题目,顶者有分
  • 面试问题?
  • IBM面试题!

关键词

  • 编译器
  • 指针
  • 函数
  • 信誉
  • 内存
  • 代码
  • 结构
  • 对象
  • abc
  • 创建

得分解答快速导航

  • 帖主:cloufei
  • k3179
  • diy8187
  • taolei
  • strawren
  • ibiswang
  • ibiswang
  • murasaki
  • Kirschs
  • Jeremyzhou
  • youngerpeo

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo