精华内容
下载资源
问答
  • 一个类可以创建几个对象? 1.一个类可以创建多个对象 2.多个对象都调用函数的时候,self地址不相同

    一个类可以创建几个对象?

    1.一个类可以创建多个对象
    2.多个对象都调用函数的时候,self地址不相同

    展开全文
  • 字符串常量池和创建几个对象

    1、字符串常量池

    定义:新的内存空间, 同样的字面值对象 "aaa" 只会在字符串常量池中出现一次, 如果第二次再定义相同的字面值 "aaa"对象,并不会在内存中再新建一份 新的空间保存"aaa" 而是直接 引用常量池中 已经有的 "aaa"对象

    2.关于创建几个对象的知识点

    一. 直接赋值

    创建了一个对象 在字符串常量池中

    无则创建、有则返回

    String s1 = "aaa";// 创建了几个对象?    创建了1个对象  在字符串常量池中

    演示代码:

    public class 演示创建了几个对象 {
     public static void main(String[] args) {
      
      String s1 = "aaa";
      String s2 = "aaa";
      
      System.out.println(s1==s2);//true
      System.out.println(s1.equals(s2));//true
     }
    }
    


    2. new

    Student s=new Student();

    创建了两个对象:

    (1) 字符串常量池中  真正的字面值对象

    无则创建、有则返回

     (2) 堆里的

    无论如何都要被创建,存的是常量池中 字面值对象的地址

     

     

    展开全文
  • new String()究竟创建几个对象?

    万次阅读 多人点赞 2016-11-14 17:39:30
    new String()究竟创建几个对象?1. 由来遇到一个Java面试题,是关于String的,自己对String还有点研究?下面是题目的描述: 在Java中,new String("hello")这样的创建方式,到底创建了几个String对象? 题目下答案,...

    new String()究竟创建几个对象?

    1. 由来

    遇到一个Java面试题,是关于String的,自己对String还有点研究?下面是题目的描述:

    在Java中,new String("hello")这样的创建方式,到底创建了几个String对象?

    题目下答案,各说纷纭,有说1个的,有说2个的。我觉得都对,但也都不对,因为要加上一定的条件,下面来分析下!

    2. 解答

    2.1. 分析

    题目中的String创建方式,是调用String的有参构造函数,而这个有参构造函数的源码则是这样的public String(String original),这就是说,我们可以把代码转换为下面这种:

    
    String temp = "hello";  // 在常量池中
    
    String str = new String(temp); // 在堆上
    

    这段代码就创建了2个String对象,temp指向在常量池中的,str指向堆上的,而str内部的char value[]则指向常量池中的char value[],所以这里的答案是2个对象。(这里不再详述内部过程,之前的文章有写,参考深入浅出Java String)

    那之前我为什么说答案是1个的也对呢,假如就只有这一句String str = new String("hello")代码,并且此时的常量池的没有"hello"这个String,那么答案是两个;如果此时常量池中,已经存在了"hello",那么此时就只创建堆上str,而不会创建常量池中temp,(注意这里都是引用),所以此时答案就是1个。

    当然,光说不练假把式,下面就来用例子验证一下:

    2.2. 验证

    不啰嗦,直接看第一段代码:

    
    // 代码1
    
    public static void main(String[] args) {
    
        String str = new String("hello");
    
        String after_str = "hello";
    
        System.out.println(str + after_str);
    
    }
    

    我们在println语句那里加个断点,debug下,如下图:

    debug-code1

    可以看到在代码1中,strafter_str不是同一个对象,这个应该没有疑问把,一个在堆上,一个常量池中,但是我们注意到str.valueafter_str.value的地址确是同一个,即是同一个char数组,所以可以理解为,当执行str那句代码时,创建了两个String对象,一个在常量池,一个在堆上,接下来到执行after_str这句时,这种方式创建的字符串都在常量池中,但是如果常量中如果有,就直接返回了,所以这里返回的是上一句在常量池那里创建的String,所以str这句代码创建的是2个对象。

    接下来再看一段代码:

    
    // 代码2
    
    public static void main(String[] args) {
    
        String before_str = "hello";
    
        String str = new String("hello");
    
        System.out.println(str + before_str);
    
    }
    

    同样在println打断点,如下图:

    debug-code2

    代码2中,str.valuebefore_str.value也是用的同一个char数组,但这里的代码可不是和代码1相同的,这里我们把"hello"提到前面创建,这也就是说明当执行str那句代码时,没有再在常量池中创建"hello"了,所以str这句则是创建了1个对象。

    2.3. 补充

    这里突然想到,还要补充一下上面如果常量池中没有,则创建2个对象,很多人会误解这句话的含义,这个常量池,不是你没手动的创建,常量池中就没有东西,这个理解是错误的,大家一定要修正它。在你的程序启动时,就已经装载来很多class,这里面也有字符常量的创建,只是不是你自己创建的,你只是不知道而已。

    例如下面这段代码:

    
    // 代码3,JDK >= 1.7
    
    public static void main(String[] args) {
    
        String str1 = new StringBuilder("hel").append("lo").toString();
    
        String str2 = new StringBuilder("ja").append("va").toString();
    
    
    
        System.out.println(str1.intern() == str1); // true
    
        System.out.println(str2.intern() == str2); // false
    
    }
    

    (关于intern在不同JDK的不同表现,之前也说过了,详情请看深入浅出Java String)

    代码3这里,str1的结果是很多人都能理解的,但是str2的结果为false就说明,常量池中已经有了"java"了,这里很多人不解,这个就是系统装入的字符常量,除了"java",类似的还有"false","true"(在java.lang.String里)等等。但是这个"java"我始终没找到在那个类中,可能在native方法中把,知道的请告知下,谢谢!

    3. 总结

    通过这个面试题,可以看到String真的是有很多”坑”,但是弄明白这些”坑”也是很有趣的。还有,这些都是我自己找资料,实践,总结,分析出来的,难免有错误存在,有发现的错误的同学,还请指正!

    展开全文
  • 文章目录题1: new String("ab") 会创建几个对象?题2:new String("a") + new String("b") 会创建几个对象 ? 题1: new String(“ab”) 会创建几个对象? public class StringNewTest { public static void main...

    题1: String str =new String(“ab”) 会创建几个对象?

    public class StringNewTest {
        public static void main(String[] args) {
            String str = new String("ab");
        }
    }
    

    javap -v StringNewTest.class 反编译后, 部分片段如下:

    在这里插入图片描述

    根据反编译后字节码分析:

    1. 一个对象是:new关键字在堆空间创建的;
    2. 另一个对象是:字符串常量池中的对象"ab"。 (如果前后文中还有代码,并且已经有 ab 常量在常量池存在时,ab 将不再创建,因为在常量池只能存在一份相同的对象)

    结论是至少是2个对象。

    题2:String str =new String(“a”) + new String(“b”) 会创建几个对象 ?

    public class StringNewTest {
        public static void main(String[] args) {
            String str = new String("a") + new String("b");
        }
    }
    

    javap -v StringNewTest.class 反编译后, 部分片段如下:
    在这里插入图片描述

    根据反编译后字节码分析:

    对象1: new StringBuilder()
    对象2: new String(“a”)
    对象3: 常量池中的"a"
    对象4: new String(“b”)
    对象5: 常量池中的"b"

    深入剖析: StringBuilder 的 toString() 方法中有 new String(value, 0, count)
    对象6 :new String(“ab”)

    强调一下:
    StringBuilder 的 toString() 的调用,在字符串常量池中,没有生成"ab"。
    如果前后文中还有代码,并且已经常量在常量池存在时,相同的常量 将不再创建,因为在常量池只能存在一份相同的对象。

    结论是至少是6个对象。

    题3:String str =“a”+ “b” 会创建几个对象 ?

    public class StringNewTest {
        public static void main(String[] args) {
            String str = "a" + "b";
        }
    }
    

    javap -v StringNewTest.class 反编译后, 部分片段如下:
    在这里插入图片描述
    "a" + "b" 在编译时,就已经编译为 ab, 被放到常量池中。
    所以只有一个对象 :ab

    注意:
    如果前后文中还有代码,并且已经有 ab 常量在常量池存在时,ab 将不再创建,因为在常量池只能存在一份相同的对象。

    字符串拼接操作的总结

    • 常量常量 的拼接结果在 常量池,原理是 编译期 优化;
    • 常量池 中不会存在相同内容的常量;
    • 只要其中一个是变量,结果在堆中。 如: String s2 = s1+"DEF" ;
      变量拼接的原理 是StringBuilder 。
    • 如果拼接的结果是调用 intern() 方法,则主动将常量池中 还没有的字符串 对象放入池中,并返回地址。
    展开全文
  • new String()究竟创建几个对象? 1、由来 遇到一个java面试题,是关于String的,下面是题目的描述: //在java中,new String("hello")这样的创建方式,到底创建了几个String对象? 2、解答 2.1.分析 ​ 题目中的...
  • String 创建几个对象问题(详解)
  • 几个对象 解释 String str="abc"; 1 引号内包含文本,这种方式是String特有的,并且它与new的方式存在很大区别 String a="abc"; String b="abc"; 1 还是一个对象 String str=new ...
  • Java中newString(abc)创建几个对象解释 分类: Java2012-02-27 09:192185人阅读评论(0)收藏举报 javastring虚拟机classcfloat String str=new String(“abc”); 紧接着这段代码之后的往往是这...
  • 创建几个对象的问题 你知道在java中除了8中基本类型外,其他的都是类对象以及其引用。所以 "xyz "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性。 看: String s= ...
  • String:字符串常量池,搞懂创建几个对象,是否相等的问题 前言 今天博主将为大家分享:String:字符串常量池,搞懂创建几个对象,是否相等的问题!不喜勿喷,如有异议欢迎讨论! 作为最基础的引用数据类型,...
  • 在内存中创建几个对象? 1个String对象 "a"+"b"+"c"在编译期已经常量折叠为"abc" 变量a获得是"abc"。 甲骨文jdk(1.7),javac会进行常量折叠,全字面量字符...
  • 这段代码(code)共创建几个对象? 答:只创建了两个对象。 第一行创建了,(对象的引用变量a存在栈中,到常量池中找有没有“abc”,因为没有,所以直接在常量池中创建“abc”对象,然后栈中的a指向常量池中的“a....
  • JAVA基础之再次解读String-创建几个对象

    千次阅读 热门讨论 2014-03-12 10:41:07
    换工作了,当换工作或者找工作的时候,往往会激发人们的学习动力——多学一点就可以多要点工资(嘿嘿)。  吾乃凡人一个,虽平时都有学习的习惯,但此次投简历...第一个基础就是:String-创建几个对象的例子。  S
  • String a=new String(“b”+”c”)会创建几个对象? String a=new String(“b”,”c”)会创建几个对象? String a=new String(“b”+”c”)又会创建几个?为什么?1.String a=new String(“b”+”c”); b一个 c一...
  • String s = new String("xyz");创建几个String Object? 二者之间有什么区别?
  •  创建几个对象的问题  (2011-10-23 21:09:46) 转载▼ 标签:  string   杂谈   你知道在java中除了8中基本类型外,其他的都是类对象以及其引用。所以 "xyz "在java中它...
  • 下面代码中创建几个对象? new String("abc");答案众说纷纭,有说创建了1个对象,也有说创建了2个对象。答案对,也不对,关键是要学到问题底层的原理。 底层原理分析 在上篇文章《面试题系列第1篇:说说=...
  • new String("abc")创建几个对象的解释关键字: string String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知...
  • String a=new String("b","c")会创建几个对象?  String a=new String("b"+"c")又会创建几个?为什么?   1.String a=new String("b"+"c");  b一个 c一个 b+c一个 a一个 总共四个 1、Java中New出的...
  • 这两段代码创建几个对象?  本人回答的是3个。当时是这样想的:首先String s1="aa" 会先在常量区找aa,没有自己创建一个,这里就一个对象了;s1我也想当然的觉得是创建了一个对象,这就两个了;String s2
  • String s1="a"; String s2=s1+"b"; String s3="a"+"b"; System.out.println(s2=="ab"); //false System.out.println(s3=="ab"); //true String s="a"+"b"+"c"+"d";...System.out.println(s=="abcd");...
  • 创建个对象,因为javac编译时,会对其优化,变成"ab",不必等到运行期去进行加法运算处理。 2,String s = new String("a"); 分情况,如果常量池中有"a",那么new了一个对象;如果常量池中没有"a",那么创建了两...
  • 下面代码中创建几个对象? new String("abc"); 答案众说纷纭,有说创建了1个对象,也有说创建了2个对象。答案对,也不对,关键是要学到问题底层的原理。 底层原理分析 在上篇文章《面试题系列第1篇:说说==和...
  • 我们知道String是个不可变的常理,每次赋值都会创建一个对象,但是今天遇到个问题,String a=new String("a")创建几个对象? 首先我举个列子来复习下String; String s="Hellow"; s="android"; String str=...
  • 作者:臧圩人(zangweiren)  网址:http://zangweiren.javaeye.com >>>转载请注明出处! ...我们首先来看一段代码: ...紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建几个Strin

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,555
精华内容 8,622
关键字:

创建几个对象