`

java中String new和直接赋值的区别

 
阅读更多

String str1="ABC"; 和String str2 = new String("ABC"); 有什么区别。

 

String str1="ABC" 可能创建一个对象或者不创建对象,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").如果已经存在,str1直接reference to 这个String池里的对象。

 

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

 

String 有一个intern() 方法,native,用来检测在String pool是否已经有这个String存在。

 

考虑下面的问题:

 

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

 

str1 == str2 的值是True 还是False呢? False.

 

String str3 = "ABC";
String str4 = "ABC";

 

String str5 = "A" + "BC";

 

str3 == str4 的值是True 还是False呢? True.

 

str3 == str5 的值是True 还是False呢? True.

 

在写代码的时候,一般不要 String str2 = new String("ABC");

 

String a = "ABC";
String b="AB";
String c=b+"C";
System.out.println(a==c); false
a和b都是字符串常量所以在编译期就被确定了!

 

而c中有个b是引用不是字符串常量所以不会在编译期确定。
而String是final的!所以在b+"c"的时候实际上是新创建了一个对象,然后在把新创建对象的引用传给c.

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kkdelta/archive/2009/03/02/3948725.aspx

 

分享到:
评论

相关推荐

    java中String类型变量的赋值问题介绍

    String str = new String(good); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); System....

    String a="hello" String b="hello" a==b 返回true的问题分析

    //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...

    跟我学Java-day13-String和StringBuilder.pdf

    //直接赋值的方式得到对象 String s3 = "abc"; String s4 = "abc"; //比较字符串对象地址是否相同 System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s3 == s4); System.out....

    Java实现HTML文件转PDF文件

    URL urls = new URL(url); String urlsource = getURLSource(urls); 2、从后台获取数据库内容,内容是JSon格式保存的,把先JSon格式内容转化成Map //获取Map值 Map<String, String> map = json2Map(); 3、通过...

    Java中BigInteger.docx

    java 中BigInteger应用import java.util.Scanner; import java.math.BigInteger; public class Main{ public static void main(String[]args){ Scanner in=new Scanner(System.in); while(in.hasNext()){//has....

    java用类实现异常的处理的实例

    import java.util.*; class MyException extends Exception{ String message; MyException(int age){ message=age+"年龄异常"; } public String getMessage(){ return message; } } class People{ ...

    java面试宝典

    187、JAVA SERVLET API中forward() 与redirect()的区别? 44 189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is ...

    java常用工具类的使用

    在Java程序设计过程中,对应日期和时间的格式化,还有一个简单的格式化方式,就是java.text.SimpleDateFormat,该类中用字符串指定日期和时间的格式,字符串中的字符称为模式字符,模式字符区分大小写。常见的模式...

    [java]读书笔记整理:一切都是对象

    [后续在说,在程序执行过程中,怎样传递和赋值对象引用]。 事实证明,由new创建的对象,只要你需要,就会一直保留下去。这样。许多C++编程问题在java中就完全消失了,在C++中,最难的问题似乎在于:程序员并不能从...

    兼容C# VB.net的TripleDES加解密的java源码

    同理,DotNET的unicode字节数组转换到JAVA字符串前,要调换高地位字节,之后带Unicode参数转为String,如new String(调换后的字节数组,"Unicode") Java小白琢磨了两天,总算搞出来了,下载的朋友有不懂的可以私信我...

    java常见的语法错误

    错误提示:Abc.java:9: i is already defined in main(java.lang.String[]) int i = 2; 中文说明:变量重复定义了 例子说明: int i = 1; int i = 2; 3. 找不到符号: Test6.java:26: cannot find symbol symbol...

    java经典面试2010集锦100题(不看你后悔)

    B) 在Java中布尔类型不能和数字之间不能来回转换,即false和true不对应任何零或非零的值。 C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在...

    java变量交换代码

    public static void main(String[] args) { System.out.print("输入整数a:"); //得到输入的值,保存到变量a //Scanner是jdk类库中的类 //保存在java.util包下 int a = new Scanner(System.in).nextInt(); ...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    好啊好啊 抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下这部分的笔记. 1. final关键字 在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记...

    浅谈Java中的StringBuilder

     在《浅谈Java String内幕(1)》 中,字符串变量(非final修饰)通过 “+” 进行拼接,在编译过程中会转化为StringBuilder对象的append操作,注意是编译过程,而不是在JVM中。  public class StringTest {  ...

    Java 2实用教程(第三版)实验指导与习题解答

    //在Java Applet中绘制一行文字:“这是一个Java Applet 程序” g.setColor(Color.red); g.setFont(new Font("宋体",Font.BOLD,36)); g.drawString("我改变了字体",20,50);//在Java Applet中绘制一行文字:“我...

    《Java程序设计》课程实验指导书程序代码(答案)(实验五)

    3.自定义类Sanj,其中有成员 x,y,z,作为三边长,构造方法Sanj(a,b,c)分别给x,y,z赋值,方法求面积getArea和显示三角形信息(三个边长)showInfo,这2个方法中当三条边不能构成一个三角形时要抛出自定义异常...

    达内 coreJava 习题答案

    其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int howMany; //定义最后的一项有多少个数字 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    \java超强笔记(超级经典)

    指定泛型后,取出数据时不需要进行强制类型转换,可以直接赋值给相应类型。 可以限定集合中的元素类型,保证集合中的元素是按照要求放入的。 可以增强多态(继承多个接口而无需写继承类)。 保证参数有效...

Global site tag (gtag.js) - Google Analytics