关闭

Java创建字符串是用“”还是用构造器?

标签: java
1274人阅读 评论(0) 收藏 举报
分类:

原文:Create Java String Using ”” or Constructor?
翻译:get-set

Java中,创建字符串有两种方式:

String a = "abc";
String b = new String("abc");

这两种方式有什么区别呢?

1. 双引号 vs. 构造方法

这个问题可以由两个例子来说明。
例1:

String a = "abcd";
String b = "abcd";
System.out.println(a == b); //True
System.out.println(a.equals(b));    //True

a == b是true,因为ab指向的都是位于方法区的同一个字符串,也就是他们的引用是一样的。

==是进行值的比较,对于原始类型来说,就是比较它们的值,对于引用类型来说,就是检查它们引用的是不是同一个对象。

当同样的字符串再次被创建的时候,便不再创建新的字符串,这叫做“String interning”,编译期的字符串常量是自动interned的(就是会维护一个常量池,如果池中有这个字符串,那么直接引用之,否则再创建)。

例2:

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  //False
System.out.println(c.equals(d)); //True

c == d是false,因为c和d指向的不是一个引用,构造方法创建的字符串对象位于堆内存中,每次new都是创建不同的对象,因此cd的引用自然就不一致了。
下边的两幅图用以说明:
两种创建方式的区别

2. 运行时String Interning

当运行时,仍然可以实现String Interning,即使是使用构造方法创建的字符串:

String e = new String("abcd").intern();
String f = new String("abcd").intern();
System.out.println(e == f); // True
System.out.println(e.equals(f)); // True

执行s.intern()方法的时候,会将共享池中的字符串与外部的字符串(s)进行比较,如果共享池中有与之相等的字符串,则不会将外部的字符串放到共享池中的,返回的只是共享池中的字符串,如果不同则将外部字符串放入共享池中,并返回其字符串的句柄(引用)– 这样做的好处就是能够节约空间。

3. 用哪个呢?

如无特别原因,尽量使用双引号“”来创建字符串,当必须创建一个新的字符串或需要在堆内存中创建字符串的时候,才需要使用到构造方法。

2
0
查看评论

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

方式一:String a = “aaa” ;方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优。 因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。 一:常量池中已经有字符串常量”aaa” 通过方式一创建对象,程...
  • a986410589
  • a986410589
  • 2016-09-06 22:39
  • 4010

Java 创建字符串String的各种方法以及区别

Java中创建字符串的方法: 1.单独使用“”引号创建的字符串都是常量,编译期就已经确定存储到String Pool中; 2.使用new String(“”)创建的对象会存储在heap中,是运行期新创建的; 3.使用只包含常量的字符串连接“abc”+"def"创建的也是常量,编译...
  • tongnuxie
  • tongnuxie
  • 2015-12-21 15:37
  • 710

JAVA中创建字符串的两种方式的区别

JAVA中创建字符串的两种方式的区别,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建。建议在平时的应用中,应尽量使用String x = "abcd"这种方式来创建字符串,而不是String x = new String("abcd&q...
  • hu1991die
  • hu1991die
  • 2014-12-17 18:52
  • 2825

String构造函数 拷贝构造函数 析构函数 赋值构造函数的实现

标题:String函数的实现-->主要实现构造函数,拷贝构造函数,析构函数,赋值构造函数。这几个函数是字符串函数最基本的函数,今天也总结一下 #include using namespace std; #include class MyString { private: char *st...
  • zhou753099943
  • zhou753099943
  • 2015-10-21 21:30
  • 1174

创建字符串对象的时候,使用字面值和使用new String()构造器这两种方式有什么不同?

当我们使用new String构造器来创建字符串的时候,字符串的值会在堆中创建,而不会加入JVM的字符串池中。相反,使用字面值创建的String对象会被放入堆的PermGen段中。例如: String str=new String(“Test”); 这句代码创建的对象str...
  • syc434432458
  • syc434432458
  • 2016-02-16 14:24
  • 854

Java创建字符串是用“”还是用构造器?

原文:Create Java String Using ”” or Constructor? 翻译:get-set 如无特别原因,尽量使用双引号“”来创建字符串,当必须创建一个新的字符串或需要在堆内存中创建字符串的时候,才需要使用到构造方法。
  • get_set
  • get_set
  • 2015-11-17 21:25
  • 1274

java构造字符串

java 关键字,使用stringbuffer动态添加string字符串
  • jie1031066280
  • jie1031066280
  • 2014-02-25 21:27
  • 1353

浮点数类型计算问题,bigDecimal对象构造函数尽量使用字符串参数

最近查看rebate数据时,发现一个bug,主要现象是,当扣款支付宝的账号款项时,返回的是数字的金额为元,而数据库把金额存储为分,这中间要做元与分的转化,这个转化规则很简单,就是*100的,所以一开始代码很简单,如下。 [java] view plain ...
  • libraryhu
  • libraryhu
  • 2017-05-19 18:33
  • 454

从头认识java-4.3 默认构造器

这一章节我们来讨论一些默认构造器与this的注意点。1.默认构造器当你不设置任何构造器的时候,系统默认会建立一个。package com.ray.ch01; public class Test { } 上面的代码其实里面默认包含了一个无参的构造器,这个时候可以使用new Test()来创建对象。...
  • raylee2007
  • raylee2007
  • 2015-10-26 09:00
  • 2123

java学习笔记-String,构造器

字符串String str = new String("java");上面这行代码可以用下面来表示String str1 = "java"; Stirng str2 = new String(str2);String 还有一个intern()方法,可以让你把字...
  • u014738387
  • u014738387
  • 2015-12-20 16:54
  • 550
    个人资料
    • 访问:164920次
    • 积分:1464
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:3篇
    • 译文:3篇
    • 评论:5条
    最新评论