一、初始化String的两种方式

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

第一种方式本质上是声明了一个String的匿名对象,然后str1指向该对象。该匿名对象保存在对象池中。

第二种方式分为两步:

1) 声明一个"hello"的String对象

2) new 关键字申请新的内存,将该内存分配String对象,并将值"hello"分配给该对象。步骤1中的对象废弃,等待GC回收。

开发中推荐使用方式1。

二、两种比较String的方式

通过“==” 或者String的equals方法可以比较两个String,但它们之间有本质区别。"=="比较的是两个对象的地址,而equals方法比较的是两个对象的内容。

public class TestJava
{
public static void main(String[] args)
{
String str1 = "hello";
String str2 = new String("hello"); System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true
}
}

三、String的不可改变性

String对象一旦声明那么它的内容就不可改变。

public class TestJava
{
public static void main(String[] args)
{
String str1 = "hello";
String str2 = "hello"; System.out.println(str1 == str2);//true
System.out.println(str1.equals(str2));//true str2 += " world";
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//false
}
}

一开始str1和str2指向同一个对象。然后对str2做+=操作,实际上是str2指向了生成的一个新的"hello world"字符串,所以str2指向的地址和内容都已经改变。而在这之前str2指向的字符串没有发生任何改变。

JAVA 中关于String的特性的更多相关文章

  1. Java中的String为什么是不可变的?

    转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那 ...

  2. Java中的String与常量池[转帖]

    string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...

  3. Java中的String与常量池

    string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...

  4. Java中的String为什么是不可变的? -- String源码分析

    众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是, ...

  5. Java中的String,StringBuilder,StringBuffer的区别

    这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > ...

  6. Java中的String和StringBuffer

    在任何编程语言中,字符串都是我们编写程序时不可避免要用到的常用的数据类型之一. 对于Java初学者而言,当谈到String和StringBuffer的区别时,通常都会有些困惑. 而要弄清楚两者之间的区 ...

  7. Java中的String为什么是不可变的? — String源码分析

    原文地址:http://www.importnew.com/16817.html 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为 ...

  8. java中面向对象的三大特性小结

    java中面向对象的三大特性:封装.继承.多态 封装 把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节.数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问. 1 ...

  9. 【翻译】为什么Java中的String不可变

    笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int.boolean等基础数据类型,是超越了一般Object引用类型的高端大气上档次的存在. 但是 ...

随机推荐

  1. 项目发布: error CS0103: 当前上下文中不存在名称“*****”

    项目发布,发布不出来,而且编译,发布过程中vs也不报错,也不提示错误.   在错误窗口忽闪一个错误提示之后,输出窗口有西边的提示: error CS0103: 当前上下文中不存在名称"Cur ...

  2. 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项

    Win7 64位 IIS未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项 未能加载文件或程序集"System.Data.SQLite&quo ...

  3. linux概念之/etc

    [Thu Apr 02 15:04:32 1028 /dev/pts/0 192.168.2.250 /etc]#ll |grep -v "^d"|wc -l99[Thu Apr ...

  4. C++流格式控制符的使用【来自网络】

    注意添加<iomanip>头文件. 使用控制符控制输出格式 控制符 作用 dec 设置整数的基数为10 hex 设置整数的基数为16 oct 设置整数的基数为8 setbase(n) 设置 ...

  5. javascript中href和replace比较

      在使用javascript的时候,有时候对于经常使用的方法太熟悉而忽略了他们之间原理的细微差别.举例如下:window.location.href,window.location.replace. ...

  6. 可视化SNV安装

    以前也安装过非图形化的SVN SERVER,但大多都需要比较复杂的配置,而且操作不太友好,所以其拥有可视化功能就比较重要了. 好了,开始干活吧. 说明:测试机为开发爬虫用的服务器,配置不高 准备工作: ...

  7. webform 页面传值的方法总结

    ASP.NET页面之间传递值的几种方式   页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有Quer ...

  8. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  9. FastReport使用二——二维码

    以下内容在FastReport Designer 中测试通过,如下图所示: 在使用FastReport Designer创建一维吗也就是一般普通的条码时,设置其Barcode属性为Code128 (建 ...

  10. 成功移植SQLite3到ARM Linux开发板

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 ...