2019独角兽企业重金招聘Python工程师标准>>>

java中String对象和String变量

(2011-12-27 20:40:27)

转载

标签:

it

最近在论坛上看到关于String s = new String("XYZ") + new String("XYZ");到底创建几个对象的讨论,觉得比较有意思,在此总结一下。

在JAVA中除了8种基本类型之外,其他的都是类对象及其引用。所以 "XYZ"在JAVA中是一个String对象,对于String类对象来说它的对象值是不能修改的,也就是具有不变性。

但是在下面一段程序中:

view plainprint?

  1. public class TestString {

  2. public static void main(String args[]) {

  3. String s = "Hello";

  4. s = "Java";

  5. String s1 = "Java";

  6. String s2 = new String("Java");

  7. System.out.println(s);

  8. System.out.println(s == s1);

  9. System.out.println(s == s2);

  10. }

  11. }

打印出s的结果是"Java",看起来s所引用的String变量好像是被修改了,但是如果你了解JVM(Java虚拟机)处理String变量时的机制,你就会知道事实并非如此。

在JVM的工作过程中,会创建一片的内存空间专门存入String对象,我们把这片内存空间叫做String池。

对于语句String s= "Hello";,当JVM看到"Hello"时,会在String池创建String对象存储它,并将它的引用返回给String变量s。

语句s = "Java";,当JVM看到"Java"时,会在String池创建新的String对象存储它,再把新建的String对象的引用返回给String变量s。而原先的String对象"Hello"仍然在String池内,并没有消失,它是不能被修改的。

所以我们仅仅是改变了变量s的引用,而没有改变它所引用的对象,因为String对象的值是不能被修改的。

String s1 = "Java";,JVM首先在String池里面看能否找到字符串"Java",如果找到则返回它的引用给s1,否则创建新的String对象,放到String池里。这里由于有s = "Java",所以对象已经被引用,所以依据规则s和s1都是引用同一个对象。所以s==s1返回true。(注: 比较运算符==,对于非基本类型,是比较两引用是否引用内存中的同一个对象)。

String s2 = new String( "Java");,JVM首先还是在String池里面看能否找到字符串 "Java",如果找到,不做任何事情;否则创建新的String对象,放到String池里面。由于遇到了new关键字,还会在内存上(不是String池里面)创建String对象存储 "Java",并将内存上的(不是String池里面的)String对象返回给s2。所以s==s2将返回false,因为它们引用的不是同一个对象。

所以对于语句String s = new String("XYZ") + new String("XYZ");

JVM先在String池中创建一个String对象存储"XYZ",然后由于遇到new关键字,再在内存上创建一个String对象存储"XYZ";

接着由于String池中已经有了"XYZ"的对象,所以第二个new语句不会在String池中创建对象,而只会在内存上创建一个String对象;

最后两个字符串相加会在String池中创建一个String对象"XYZXYZ",并将其引用传给s。

所以总共会创建4个String对象。



注意:“最后两个字符串相加会在String池中创建一个String对象"XYZXYZ",并将其引用传给s。”最后这句话可能有问题!

public static void main(String[] args) {
String xyzxyzOne = "xyzxyz";
String xyzOne = new String("xyz");
String xyzTwo = new String("xyz");
String xyzxyzTwo = xyzOne + xyzTwo;
System.out.println("(xyzxyzOne == xyzxyzTwo):"
+ (xyzxyzOne == xyzxyzTwo));
}
输出为:(xyzxyzOne == xyzxyzTwo):false
所以应该是在内存中创建的String对象。

转载于:https://my.oschina.net/u/2377060/blog/491209

java中String对象和String变量相关推荐

  1. java中集合对象与string互转的几种方式

    准备数据: UserInfo.java @Data @AllArgsConstructor public class UserInfo {private Long id;private String ...

  2. JAVA基础(12.Java中的常用类String)

    目录 1.前言 2.日期(时间)相关类 2.1 日期类的应用场景 2.1.1Java中的日期相关的几个类 3. Java中的常用类学习方式 3.1 什么是常用类?为什么要学习? 3.2 怎么使用Jav ...

  3. Java中,那些关于String和字符串常量池你不得不知道的东西

    老套的笔试题 在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true. String s1 = new String("xy ...

  4. Java中collection.toArray(new String[0])、resultSet.toArray(new Integer[0])、Set.toArray()new 数组的性能比较

    一.在调用Set的toArray()方法的时候 在使用HashMap的时候,它的keySet()方法将返回一个Set集合 且Set是继承自Collection的,在使用toArray()的时候其实转换 ...

  5. jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧

    json:JavaScript 对象表示法(javascript Object Notation),其实JSON就是一个javaScript的对象(Object)而已. 如有不清楚JSON,可以去w3 ...

  6. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别

    起因:取一个list给另一个list赋值,然后在另一个list中取出进行修改.list其中类型为对象时,String时,基本数据类型时. [java中的对象类型与基本数据类型的区别] #声明和实例化 ...

  7. Java中的对象类型像引用还是指针,谁是谁非?

    Java中的对象类型像引用还是指针,谁是谁非? 作者:海枫 地址:http://blog.csdn.net/linyt 作为一名程序员,我们应该对新知识和新技术刨根问底,而不应泛泛而谈.我未曾接触到J ...

  8. 10.Java中的对象

    java中的对象         我们要处理当前类与其他类之间的关系,需要使用对象. 1.什么是对象? 对象是通过java类创建的能够被使用的具体元素.         例如:类就相当于是创造事务的图 ...

  9. Java中的对象和类

    一. OOP中的基本概念     Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计 ...

最新文章

  1. Ajax[Mount]
  2. JavaScriptjQuery.document对象属性和方法
  3. 中国航天将与人工智能技术携手 未来可期
  4. SQL Server 2005参考:PIVOT
  5. java 上传 进度,关于 javaweb的文件上传实时显示进度
  6. 数字图像处理(五)——形态学
  7. 【leetcode】Remove Duplicates from Sorted Array
  8. 基于机器视觉的线圈检测
  9. 解决serv-u中文乱码的问题
  10. Linux学习笔记2 - 字符界面
  11. python培训还是自学
  12. matlab 第二版 赵元哲 下载,基于MATLAB的黑盒电路仿真设计及应用
  13. dialog第三方框架,material-dialogs的使用
  14. Failed to create Anaconda Menus
  15. C/C++关于string.h头文件和string类
  16. 【Opencv】Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)
  17. C语言编程>第十八周 ⑧ 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。
  18. python读数据库的通信协议是_Python以太坊区块链交互将数据存入数据库
  19. matlab tic toc 分段计时,Python模仿matlab的tic/toc计时
  20. 对话魏杰:第三次造富时代来了 富翁进入洗牌期 未来十年机会最多

热门文章

  1. 11、集合--Set接口
  2. python下载指定的版本包
  3. [转]Android NDK几点回调方式
  4. 一步一步写算法(检查表)
  5. linux下yum的搭建(redhat5)
  6. vue-cli3集成typescript,sass variables,多页打包
  7. 外媒:英国索尔兹伯里事件中受伤警察已重返工作
  8. 【gin-04】 GIN-快速开始
  9. Centos DNS服务(二)-bind主从配置与基于TSIG加密的动态更新
  10. Excel万年历的制作