精华内容
下载资源
问答
  • Python一个类可以创建几个对象
    千次阅读
    2020-04-24 14:52:51

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

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

    更多相关内容
  • java 面试题: new String() 会创建几个对象

    千次阅读 多人点赞 2020-05-28 14:42:11
    文章目录题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() 方法,则主动将常量池中 还没有的字符串 对象放入池中,并返回地址。
    展开全文
  • String创建几个对象

    千次阅读 2019-07-27 16:11:50
    1.String创建对象问题 ...**在创建个对象时,会在常量池中看有没有abc这个字符串;如果没有 此时还会在常量池中创建一个;如果有 则不创建 **(2).String s1 = “a” +“b”+“c”;**在字符串常量相加时,编...

    1.String创建对象问题

    1.1 字符串常量池

    定义:jvm针对字符串存储的一个特定内存区域。且里面内容都具有唯一性

    1.2 创建对象单个说明

    (1).String s = “abc” 在创建这个对象时,会在常量池中看有没有abc这个字符串;如果没有 此时还会在常量池中创建一个;如果有 则不创建。
    (2).String s1 = “a” +“b”+“c” 在字符串常量相加时,编译器编译时产生的字节码,会把如 “a” +“b”+"c"优化为“abc”。所以只会产生一个对象
    (3).String s = new String(“abc”); 在创建这个对象时因为使用了new关键字,所以肯定会在堆中创建一个对象。然后会在常量池中看有没有abc这个字符串;如果没有 此时还会在常量池中创建一个;如果有 则不创建。所以一共会产生两个对象
    (4).String s = “abc”;String s1= s + “ab”; 在变量与常量进行相加时,‘+’可以理解:为利用加号进行拼接字符串。执行过程如下
    (1.在底层内部中会生成新的StringBuilder对象,调用SringBuilder中的append方法进行拼接。大概执行代码如下:

    	new StringBuilder.append(s).append("ab");
    

    (2.最后拼接完成之后会调用StringBuilder.toString()方法返回一个String的对象“abcab”。

     	new StringBuilder.append(s).append("ab").toString();
     	//StringBuilder.toString的JDK源码
     	@Override
       public String toString() {
           // Create a copy, don't share the array
           return new String(value, 0, count);
       }
    

    (3.所以第二个语句会产生3个对象

    特殊情况

    (5).String s = “c”;String s1 = “a”+“b”+s+“d”+“f” ; 在底层内部进行判断时,在未出现变量之前的部分字符串还满足(2)中的情况,所以会进行自动拼接变成“ab”,出现了变量之后就不符合(2)中的情况,所以后面的字符串不会进行拼接。所以最后变为了:“ab”+s+“d”+“f”; 所以第二个语句中会产生5个对象

    1.3面试题

    1.String s1 = "a" +"b"+"c";   //1个对象
    2. String s2 = "a";		    //1个对象
      String s3= s2 +"bc";   	//3个对象
    3.String s4 = new String("你") + s2 + "b";  	  //5个对象
    -----------------下面代码与上面代码没有联系-------------------------------
    1.String s6 = "a";
    2.String s7= "b" +"c" + s6;  	 //3个对象
    3.String s8= s6 + "d" +"f" ;	 //4个对象
    4.String s9= "ab" + "cd" + s6 + "b" +"c"   //5个对象
    

    下面是这些编译过后的代码,来帮助理解

    1.String s1 = "abc";
    2.String s2 = "a";
      String s3 = s2 + "bc";
    3.String s4 = new String("你") + s2 + "b";
    -----------------下面代码与上面代码没有联系-------------------------------
    1.String s6 = "a";
    2.String s7 = "bc" + s6;
    3.String s8 = s6 + "b" + "c";
    4.String s9= "abcd" + s6 + "b" +"c"
    
    展开全文
  • 谈到这个问题首先得知道String的两种赋值方式: 第一种是通过...程序执行的时候内存到底有几个实例?实例存在哪?字面量又存在了哪里?变量又存在哪?概念很容易搞混。下面我们一个个的讲。虚拟机内存主要分为...

    谈到这个问题首先得知道String的两种赋值方式:

        第一种是通过“字面量”赋值。 例如String str="hello";

        第二种是通过new关键字创建新对象。例如String str=new String("hello");

    这两种方式到底有什么不同?程序执行的时候内存到底有几个实例?实例存在哪?字面量又存在了哪里?变量又存在哪?概念很容易搞混。下面我们一个个的讲。

    虚拟机内存主要分为三块:

    1. 堆:存放对象实例和数组。
    2. 栈:存放基本类型,以及对象的引用。
    3. 方法区:“类”被加载后的信息,常量、静态变量存放在这儿。

    下面开始说String,比如下面这个main方法里声明一个字符串str

    package com.song.test;
    
    public class StringTest {
    	public static void main(String[] args) {
    		String str = new String("hello");
    	}
    }

    我们可以把

    String str = new String("hello");

    这行代码分成String str、=、"hello"和new String()四部分来看。String str只是名为str的String类型的变量,因此并没有创建对象;=是对变量str进行初始化,将某个对象的引用赋值给它,显然也没有创建对象;那么,new String("hello")为什么又能被看成"hello"和new String()呢?

    我们来看一下被我们调用了的String的构造器:  

    public String(String original) {  //other code ...  }   大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:

    一、使用new创建对象。 

    二、调用Class类的newInstance方法,利用反射机制创建对象。

    我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"hello"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。

    这种方式是String特有的,并且它与new的方式存在很大区别。  

    String str="hello";  

    毫无疑问,这行代码创建了一个String对象“hello”。

    String a="hello";  String b="hello"; 那这里呢?

    答案还是一个。

    String a="he"+"llo";   再看看这里呢?

    答案是三个“he”、“llo”、“hello

    在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。  

    我们再回头看看String a="hello";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"hello"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。

    只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,对此我们不再赘述。因此我们提倡大家用引号包含文本的方式来创建String对象以提高效率,实际上这也是我们在编程中常采用的。

    因为new关键字会在堆申请一块新内存来创建对象。虽然字面还是“hello”,但是完全是不同的对象,有不同的内存地址。

    字符串常量池在内存中什么位置呢?

    public class Test {  
      
        public static void main(String[] args) {  
            String str = "abc";  
            char[] array = {'a', 'b', 'c'};  
            String str2 = new String(array);  
            //使用intern()将str2字符串内容放入常量池  
            str2 = str2.intern();  
            //这个比较用来说明字符串字面常量和我们使用intern处理后的字符串是在同一个地方  
            System.out.println(str == str2);  
            //那好,下面我们就拼命的intern吧  
            ArrayList<String> list = new ArrayList<String>();  
            for (int i = 0; i < 10000000; i++) {  
                String temp = String.valueOf(i).intern();  
                list.add(temp);  
            }  
        }  
    }

    执行一下,会怎么样?

    true 
    Exception in thread "main" java.lang.OutOfMemoryError: PermGen space 
            at java.lang.String.intern(Native Method) 
            at Test.main(Test.java:16) 
    Java Result: 1
    

      异常信息告诉我们PermGen 满了。奥,我知道字符串常量池在哪了。PermGen就是jvm规范中所谓的方法区。

         这里偷懒了一下,只是指定了很大的数10000000让PermGen 溢出,不过时间可能长点。勤快的人还是自己指定java运行的内存比较好,稍小点就能验证。



    展开全文
  • 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一...
  • 字符串常量池和运行时常量池是两不同的概念。运行时常量池存储的是类的字面量,是每类独有的,而字符串常量池存储的是字符串字面量,是所有类共享的。JDK1.7字符串常量池在方法区,JDK1.7之后字符串常量池就转移...
  • 在内存中创建几个对象? 1个String对象 "a"+"b"+"c"在编译期已经常量折叠为"abc" 变量a获得是"abc"。 甲骨文jdk(1.7),javac会进行常量折叠,全字面量字符...
  • 我们知道String是个不可变的常理,每次赋值都会创建一个对象,但是今天遇到个问题,String a=new String("a")创建几个对象? 首先我举个列子来复习下String; String s="Hellow"; s="android"; String str=...
  • String a =new String(“abc”) 实际上是创建了两个对象(假设之前String的常量池中没有创建任何对象), 一个是“abc”,一个是new String()。 “abc”创建后就会放入常量池中(下次创建 String对象时先查找常量池 ...
  • String 创建几个对象问题(详解)
  • new String(“123“)创建几个对象

    千次阅读 2019-10-19 17:09:35
    String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以new String("123")创建几个对象为例记录。 二、你能回答正确吗? String a = "123"; 如上 a 定义的为常量; ...
  • new String创建几个对象

    万次阅读 2017-02-06 15:37:19
    String str = new String(“abc”) 到底创建几个对象? 首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String("abc")了。把它拆分成"abc"和new String(),首先在字符串...
  • 注意new时还在堆中创建了一个对象,因此这句话一共创建了2个对象。 ———————————————————————————————————— 相关链接 点击跳转至:“由“==”引发的字符串池机制”...
  • 1.首先声明s不是对象,不是对象,不是对象,s是指针引用2....一个对象3.如果"xyz"在常量池中不存在,会现在常量池中创建一个“xyz”,然后在堆中创建一个new String("xyz");两个对象...
  • 单引号表示char型的,而双引号表示字符串,所以是"abc"以上不是重点(只是注意下)... 啊,s所引用的string对象不是被修改了吗?之前所说的不变性,去那里了啊? 你别着急,让我告诉你说发生了什么事情...
  • String str = new String("abc")究竟创建几个对象

    万次阅读 多人点赞 2018-10-27 11:25:54
    先给出答案:两。(如果原来常量池中没有"abc")   ...创建对象的过程   首先在常量池中查找是否存在内容为"abc"字符串对象 如果不存在则在常量池中创建"abc&qu
  • String s=new String(“abc“) 创建几个对象(详解)

    万次阅读 多人点赞 2019-01-10 15:43:11
    String s=new String("abc"); 首先我们来详细分析这条语句: String s , 这个语句声明一个类String的引用变量 s [我们常常称之为句柄],而对象一般通过...而“abc”呢,也是一个对象,不同的是放在pool...
  • 双引号字符串加号(+)拼接 创建几个对象?结论先行:双引号字符串 加号(+) 拼接,不论多少,只创建了一个对象。昨天看到一个题目,挺有意思的。大意是:String a = "1"+"2"+"3"+&...
  • Java:面试题:String s=new String("abc")创建几个对象?

    万次阅读 多人点赞 2018-10-02 22:04:06
    紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个。 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA...
  • )创建几个对象?(转) 原文地址:https://www.cnblogs.com/fatfatdachao/p/3220975.html [Csharp] view plaincopy String str1="abc";  String str2=new String("abc");  有啥...
  • String str = “a” + “b” + “c"到底创建几个对象?这是我们在讨论中最经常遇到的一个问题同时也是面试题。我们都知道在Java中从”.java"文件编译成".class"文件的过程,会有一个优化器去优化我们的代码。这个...
  • "abc"在字符串常量池创建,这是第一个对象 new String(),在堆中分配内存,里面存着这字符串"abc"在字符串常量池中的地址,这是第二个对象 str 存储在栈中,里面存储着指向堆中new String()的地址 如果以 String str...
  • 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出的...
  • 这两种声明方法得到的String是不一样的,第一种声明方法得到的String是存储在String常量池里面的,而第二种方式的声明很明显是正常的创建个对象的使用方法,所以存储在堆中。 当String类直接赋值时,如果常量池内...
  • 一个类只能有一个对象,对么

    千次阅读 2021-03-17 10:56:20
    一个类只能有一个对象,不对。类是用户定义的一种数据类型,可以使用这个类型来说明一个或多个变量,及对象。类是一种抽象的数据类型,是对对象的抽象;对象是对客观事物的抽象。一个类只能有一个对象,不对。类是...
  • 一、到底创建几个对象 1、String str = “abc”; 创建几个对象?0个 或者 1个 2、String str = new String(“abc”);创建几个对象? 1个或2个 二、首先了解几个基本的概念: 点击了解 JVM的内存管理 1、String...
  • Java 中,String s=new String(“xyz”);创建几个对象?? 我觉得是创建了一个对象s,..... ------答案竟然是一个或两个 ![图片说明](https://img-ask.csdn.net/upload/201609/03/1472861020_566141.png)
  • 下面代码在内存中创建几个对象: String str = "hello"; String str2 = new String(str); 这段代码就创建了2个String对象,str指向在常量池中的,str2指向堆上的,而str内部的char value[]则指向常量池...
  • 结论:单纯执行new String(“XXX”),底层会创建个对象。一个是在堆中创建XXX的对象,另一个是在堆中字符串常量池中创建。这两个对象的内容都是一样的,但是地址是不相同的。 2、升级:执行 String str = new ...
  • C# 创建类的多个对象

    千次阅读 2019-02-12 22:53:11
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;...namespace _0607_创建类的多个对象 { class Program { static void Main(string...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,639,805
精华内容 655,922
关键字:

创建几个对象

友情链接: bixcked.rar