Java中用字符串常量赋值和使用new构造String对象的区别

String str1 = "ABC";
String str2 = new String("ABC");

String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象(“ABC”),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝,Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。

String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”

String str1 = new String("ABC");
String str2 = new String("ABC");
str1 == str //false

String str3 = "ABC";
String str4 = "ABC";
String str5 =  "AB" + "C";
str3 == str4   //true
str3 == str5  // true

String a  = "ABC";
String b = "AB";
String c = b + "C";
System.out.println( a == c );//false

a、b在编译时就已经被确定了,而c是引用变量,不会在编译时就被确定。

应用的情况:建议在平时的使用中,尽量使用String = “abcd”;这种方式来创建字符串,而不是String = new String(“abcd”);这种形式,因为使用new构造器创建字符串对象一定会开辟一个新的heap空间,而双引号则是采用了String interning(字符串驻留)进行了优化,效率比构造器高。

参考:1.Java中String直接赋值和使用new的区别

   2.Java中String类通过new创建和直接赋值字符串的区别

时间: 2024-10-29 19:06:16

Java中用字符串常量赋值和使用new构造String对象的区别的相关文章

java中字符串常量,堆栈的区别和字符串函数intern()

转自:http://txy821.iteye.com/blog/760957 java.lang.String的intern()方法 "abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处.但实际上,它做了个小动作: 检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串:如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用. 我们做个测试: Ja

浅谈JAVA中字符串常量的储存位置

在讲述这些之前我们需要一些预备知识: java中的内存被分成以下部分: 1.栈区:由编译器自动分配释放,具体方法执行结束后,系统自动释放JVM内存资源. 其作用有保存局部变量的值,包括:1.用来保存基本数据类型的值:2.保存类的实例,即堆区对象的引用(指针).也可以用来保存加载方法时的帧. 2.堆区:一般由程序员分配释放,JVM不定时查看这个对象,如果没有引用指向这个对象就回收. 其作用为用来存放动态产生的数据,比如new出来的对象.注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法.

Java中字符串常量池的陷阱

public class TestCase { static String ab = "ab"; static String getA() { return "a"; } static String getAB() { return "ab"; } public static void main(String[] args) { // 1 String _ab = new String("ab"); System.out.pr

java两种创建String对象的区别

public class StringTest{     public static void main(String[] args){         String s1="abc";//只会在字符串常量池中创建一个"abc"字符串对象         String s2=new String("eieie");//会在字符串常量池中创建一个"hello"字符串对象,并且会在堆中再创建一个字符串对象     } } //第二

Java中的字符串常量池

最近做到一个题目: 问题:String str = new String("abc"),"abc"在内存中是怎么分配的?    答案是:堆,字符串常量区. 题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念."abc"为字面量对象,其存储在堆内存中.而字符串常量池则存储的是字符串对象的一个引用. Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid&qu

转载:Java中的字符串常量池详细介绍

引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池,需要的朋友可以参考下 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new Stri

深入Java源码剖析之字符串常量

字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键.那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个个的字符来组拼成字符串. Java中是如何实现字符串的 那其实在Java中,关于字符串的实现,其实用的也是char数组,这可以从源码中得到体现. /** * Initializes a newly created {@code String} object so that it represents

Java String类相关知识梳理(含字符串常量池(String Pool)知识)

目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(String Pool) 4. String类所用的连接符 5. String类的主要作用(简) 正文 1. String类是什么 1.1 定义 String类表示字符串.Java程序中的所有字符串都是这个String的实例,比如"abc".字符串为常数,它们的值在创建之后不能更改.因为字符

Java之字符串详解

字符串详解 package com.yuanzijian02; public class ObjectTest { public static void main(String[] args) { // TODO 自动生成的方法存根 Object object = new Object(); Object object2 = new Object(); System.out.println(object == object2);             System.out.println("-