文档章节

java中String对象和String变量

 什么是程序员
发布于 2015/08/12 14:27
字数 898
阅读 74
收藏 0

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. }  

  12.   

打印出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对象。

本文转载自:http://blog.sina.com.cn/s/blog_61af23120100xsrd.html

粉丝 6
博文 66
码字总数 4194
作品 0
南昌
程序员
私信 提问
黑马程序员---面向对象之String类创建对象的一点思考

-------------------------android培训、java培训、期待与您交流! ------------------------- 最近在上黑马论坛时经常有同学问到关于String类创建对象的问题,最多的就是诸如:String str ...

长平狐
2013/07/01
122
0
ThreadLocal的设计理念与作用

Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量...

whoisliang
2018/02/14
111
0
Java的字符类String、StringBuffer与StringBuilder异同对比分析

Java的字符类String、StringBuffer与StringBuilder异同对比分析 Java String是一个“不可变常量字符串”对象,final属性定义。之所以这么说,是从String内部在盛放字符串时候的容器char数组而...

开开心心过
2017/10/30
0
0
Java+内存分配及变量存储位置的区别

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般J...

郭二翔
2011/12/18
633
0
云妹总结了一些最最最常见的Java面试题供大家参考

云妹导读:String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性 String类中使用字符数组:private final cha...

阿里云科技快讯
2018/08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
10
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部