-
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
反编译后, 部分片段如下:根据反编译后字节码分析:
- 一个对象是:new关键字在堆空间创建的;
- 另一个对象是:字符串常量池中的对象"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:501.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"
-
Java里String str = new String("Hello");会创建几个对象?
2018-03-16 06:31:50谈到这个问题首先得知道String的两种赋值方式: 第一种是通过...程序执行的时候内存到底有几个实例?实例存在哪?字面量又存在了哪里?变量又存在哪?概念很容易搞混。下面我们一个个的讲。虚拟机内存主要分为...谈到这个问题首先得知道String的两种赋值方式:
第一种是通过“字面量”赋值。 例如String str="hello";
第二种是通过new关键字创建新对象。例如String str=new String("hello");
这两种方式到底有什么不同?程序执行的时候内存到底有几个实例?实例存在哪?字面量又存在了哪里?变量又存在哪?概念很容易搞混。下面我们一个个的讲。
虚拟机内存主要分为三块:
- 堆:存放对象实例和数组。
- 栈:存放基本类型,以及对象的引用。
- 方法区:“类”被加载后的信息,常量、静态变量存放在这儿。
下面开始说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")会创建几个对象?
2016-11-24 19:25:04String 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(“abc“)创建了几个对象?
2021-03-05 12:40:32字符串常量池和运行时常量池是两个不同的概念。运行时常量池存储的是类的字面量,是每个类独有的,而字符串常量池存储的是字符串字面量,是所有类共享的。JDK1.7字符串常量池在方法区,JDK1.7之后字符串常量池就转移... -
String a="a"+"b"+"c"在内存中创建几个对象? && String s=new String("abc")创建了几个对象?
2018-08-07 16:35:05在内存中创建几个对象? 1个String对象 "a"+"b"+"c"在编译期已经常量折叠为"abc" 变量a获得是"abc"。 甲骨文jdk(1.7),javac会进行常量折叠,全字面量字符... -
关于String a=new String("a")创建几个对象问题的正确答案
2019-09-19 09:00:26我们知道String是个不可变的常理,每次赋值都会创建一个对象,但是今天遇到个问题,String a=new String("a")创建了几个对象? 首先我举个列子来复习下String; String s="Hellow"; s="android"; String str=... -
String a =new String(“abc”)创建了几个对象
2020-11-21 14:08:11String a =new String(“abc”) 实际上是创建了两个对象(假设之前String的常量池中没有创建任何对象), 一个是“abc”,一个是new String()。 “abc”创建后就会放入常量池中(下次创建 String对象时先查找常量池 ... -
String 创建几个对象问题(详解-不容错过)
2014-07-31 21:25:01String 创建几个对象问题(详解) -
new String(“123“)创建了几个对象?
2019-10-19 17:09:35String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以new String("123")创建了几个对象为例记录。 二、你能回答正确吗? String a = "123"; 如上 a 定义的为常量; ... -
new String创建了几个对象
2017-02-06 15:37:19String str = new String(“abc”) 到底创建了几个对象? 首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String("abc")了。把它拆分成"abc"和new String(),首先在字符串... -
String a = new String("a");创建了几个对象?
2019-08-09 17:21:16注意new时还在堆中创建了一个对象,因此这句话一共创建了2个对象。 ———————————————————————————————————— 相关链接 点击跳转至:“由“==”引发的字符串池机制”... -
String s=new String("xyz") 到底创建了几个对象
2018-03-13 17:04:291.首先声明s不是对象,不是对象,不是对象,s是指针引用2....一个对象3.如果"xyz"在常量池中不存在,会现在常量池中创建一个“xyz”,然后在堆中创建一个new String("xyz");两个对象... -
String s=new String(“abc”)创建了几个对象
2018-06-23 11:53:50单引号表示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:11String s=new String("abc"); 首先我们来详细分析这条语句: String s , 这个语句声明一个类String的引用变量 s [我们常常称之为句柄],而对象一般通过...而“abc”呢,也是一个对象,不同的是放在pool... -
深入 -- 双引号字符串加号(+)拼接 创建了几个对象?
2018-06-23 11:17:43双引号字符串加号(+)拼接 创建了几个对象?结论先行:双引号字符串 加号(+) 拼接,不论多少,只创建了一个对象。昨天看到一个题目,挺有意思的。大意是:String a = "1"+"2"+"3"+&... -
Java:面试题:String s=new String("abc")创建了几个对象?
2018-10-02 22:04:06紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个。 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA... -
经典String str = new String("abc")创建了几个对象?(转)
2018-11-26 21:25:22)创建了几个对象?(转) 原文地址:https://www.cnblogs.com/fatfatdachao/p/3220975.html [Csharp] view plaincopy String str1="abc"; String str2=new String("abc"); 有啥... -
【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?
2021-02-19 15:02:52String str = “a” + “b” + “c"到底创建了几个对象?这是我们在讨论中最经常遇到的一个问题同时也是面试题。我们都知道在Java中从”.java"文件编译成".class"文件的过程,会有一个优化器去优化我们的代码。这个... -
Java_String str=new String("a"+"b")创建了几个对象
2019-10-19 17:12:23"abc"在字符串常量池创建,这是第一个对象 new String(),在堆中分配内存,里面存着这字符串"abc"在字符串常量池中的地址,这是第二个对象 str 存储在栈中,里面存储着指向堆中new String()的地址 如果以 String str... -
String a=new String("b","c")会创建几个对象?
2015-07-22 10:57:45String 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出的... -
new String(“abc”)创建了几个对象(不看后悔,一看必懂)
2018-11-03 09:54:15这两种声明方法得到的String是不一样的,第一种声明方法得到的String是存储在String常量池里面的,而第二种方式的声明很明显是正常的创建一个对象的使用方法,所以存储在堆中。 当String类直接赋值时,如果常量池内... -
一个类只能有一个对象,对么
2021-03-17 10:56:20一个类只能有一个对象,不对。类是用户定义的一种数据类型,可以使用这个类型来说明一个或多个变量,及对象。类是一种抽象的数据类型,是对对象的抽象;对象是对客观事物的抽象。一个类只能有一个对象,不对。类是... -
String str = “abc“;和String str =new String(“abc“);到底分别创建了几个对象?
2019-10-22 10:39:32一、到底创建了几个对象 1、String str = “abc”; 创建了几个对象?0个 或者 1个 2、String str = new String(“abc”);创建了几个对象? 1个或2个 二、首先了解几个基本的概念: 点击了解 JVM的内存管理 1、String... -
Java 中,String s=new String(“xyz”);创建了几个对象
2016-09-02 16:51:42Java 中,String s=new String(“xyz”);创建了几个对象?? 我觉得是创建了一个对象s,..... ------答案竟然是一个或两个  -
Java中 String str = new String("hello"); 到底创建了几个对象
2018-03-29 12:17:08下面代码在内存中创建了几个对象: String str = "hello"; String str2 = new String(str); 这段代码就创建了2个String对象,str指向在常量池中的,str2指向堆上的,而str内部的char value[]则指向常量池... -
new String(“ab“)到底创建了几个对象?new String(“a“) + new String(“b“)呢?
2020-07-18 15:59:43结论:单纯执行new String(“XXX”),底层会创建两个对象。一个是在堆中创建XXX的对象,另一个是在堆中字符串常量池中创建。这两个对象的内容都是一样的,但是地址是不相同的。 2、升级:执行 String str = new ... -
C# 创建类的多个对象
2019-02-12 22:53:11using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;...namespace _0607_创建类的多个对象 { class Program { static void Main(string...