String什么时候创建一个新对象?

 1                 String a="a";
 2         String b="b";
 3         String c="a"+"b";
 4         String d=a+b;
 5         String e="ab";
 6         String f=new String("ab");
 7         System.out.println(c==d);          //false
 8         System.out.println(c==e);            //true
 9         System.out.println(e==f);            //false
10         System.out.println(e==f.intern());    //true
11         }

     第3个false显而易见,使用new关键字就会分配一块新的内存,所以比较地址肯定是false

  第1个false其实和第3个false原因是一样的,对于d让两个String对象相加就会自动的使用new关键字调构造方法

  第2个为true,是因为编译的时候,会自动优化中间的那个+号,让c=“ab”,此时这个"ab"字符串在方法区的常量池是没有的,那么会将这个“ab”字符串放入常量池并返回常量池中这个“ab”字符串的引用地址,所以c指向的是常量池中的那个“ab”,而e在赋值“ab”时就会检测到常量池中已经有了这么一个字符串,所以e也指向的是常量池中的“ab”,所以c和e指向的是常量池中的同一个字符串,所以c和e相等,第2个输出结果为true。

  第4个为true,f.intern()会返回常量池中和f这个字符串字符相同的字符串的引用,所以返回的引用地址就是常量池中的“ab”的地址,而e指向的就是常量池中的“ab”,所以第4个结果为true。

总结:

  生成一个字符串首先判断字符串常量池是否有这么一个字符串,没有则会在常量池放入该字符串,再进行接下来的操作。

  对于new String("ab")这样的一个操作会生成的对象个数可能是1,也可能是2,如果常量池中有“ab”字符串,那么就直接在堆分配一块内存,此时创建了一个对象存放“ab”,否则,首先在方法区的字符串常量池分配内存存放“ab”,然后在堆分配一块内存,存放“ab”,此时创建了两个对象。

  对于String a="ab"这样的一个操作,生成的对象个数可能是0,也可能是1,原因同上。

原文地址:https://www.cnblogs.com/darkclouds/p/11695166.html

时间: 2024-11-05 22:36:54

String什么时候创建一个新对象?的相关文章

通过原型继承创建一个新对象

// 通过原型继承创建一个新对象 function inherit(p){ if (p == null) throw TypeError();//p是一个对象,但不能是null if(Object.create) //如果object.create()存在 return Object.create(p); //直接使用它 var t = typeof p;//否则进行进一步检测 if (t !== "object" && t !== 'function') throw

javascript 通过原型继承创建一个新对象

function inherit(p) { if(p == null) throw TypeError();                                               //p 是一个对象, 但不能是null if(Object.create)                   //如果Object.create()存在 return Object.create(p); //直接使用它  var t = typeof p; //否则进一步检测 if(t !==

JavaScript 如何从引用类型(Array 、 Object)创建一个新的对象

数组的增删改查 1.新增一项可以使用concat方法,它不会对原有数组进行改动,而是创建一个新数组 let a = [0, 1, 2] let b = a.concat([3]) console.log(a, b) 2.删除一项对于删除某一项的操作,splice也不能满足要求,因为该方法会改变原有数组,相应地我们应该使用slice,并结合es next 新特性. let array = [1,2,3] const removeIndex = (array, index) => { return

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var

Android 创建一个新的Activity

本文转载自:http://www.cnblogs.com/wuyudong/p/5658020.html 新建一个项目,创建一个java类,继承自Activity 新建一个Android.xml文件:activity_test.xml 这里需要在清单文件里面配置一下 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

Windows下C/C++创建一个新进程

本文翻译自:XQQ524148626的专栏,http://blog.csdn.net/xqq524148626/article/details/4960513 本文地址:http://blog.csdn.net/qingdujun/article/details/41808261 VC++6.0运行通过,示例: #include <iostream> #include <windows.h> using namespace std; int main() { STARTUPINFO

设计计算机类要求如下:属性:品牌、颜色、cpu型号,内存容量,硬盘大小,价格,工作状态;方法:打开,关闭,休眠;创建一个计算机对象,调用打开、关闭方法

代码如下: 1 //作者:realjanushu 2 //日期:17/9/28 3 /*功能: 4 设计计算机类要求如下: 5 6 属性:品牌.颜色.cpu型号,内存容量,硬盘大小,价格,工作状态: 7 8 方法:打开,关闭,休眠: 9 10 创建一个计算机对象,调用打开.关闭方法 11 */ 12 public class ComputerDemo{ 13 public static void main(String[] args){ 14 Computer c1 = new Computer

创建一个新的子元素视图并持有指向数据的游标cursor

android.widget.BaseExpandableListAdapterandroid.widget.CursorTreeAdapterandroid.widget.ResourceCursorTreeAdapter 直接子类SimpleCursorTreeAdapter 类概述一个简单的可扩展的ExpandableListAdapter,通过在XML文件来创建views.你可以指定一个定义了views外观的XML文件. 构造函数public ResourceCursorTreeAdap