Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 403|回复: 0

开发交流:Java中string的特性

[复制链接]

该用户从未签到

发表于 2011-10-24 10:09:32 | 显示全部楼层 |阅读模式
一、创建。
  好了,知道String是非可变类以后,我们可以进一步了解String的构造方式了。创建一个Stirng对象,主要就有以下两种方式:
  java 代码
  1.String str1 = new String("abc");
  2.Stirng str2 = "abc";
  虽然两个语句都是返回一个String对象的引用,但是JVM对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。看下面的例子:
  java 代码
  1.String str1 = new String("abc"); //jvm 在堆上创建一个String对象
  2.
  3.//jvm 在strings pool中找不到值为“abc”的字符串,因此
  4.//在堆上创建一个String对象,并将该对象的引用加入至strings pool中
  5.//此时堆上有两个String对象
  6.Stirng str2 = "abc";
  7.
  8.if(str1 == str2){
  9.         System.out.println("str1 == str2");
  10.}else{
  11.         System.out.println("str1 != str2");
  12.}
  13.  //打印结果是 str1 != str2,因为它们是堆上两个不同的对象
  14.
  15.  String str3 = "abc";
  16.//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
  17.//因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用
  18.  if(str2 == str3){
  19.         System.out.println("str2 == str3");
  20.  }else{
  21.         System.out.println("str2 != str3");
  22.  }
  23.//打印结果为 str2 == str3
  再看下面的例子:
  java 代码
  1.String str1 = new String("abc"); //jvm 在堆上创建一个String对象
  2.
  3.str1 = str1.intern();
  4.//程序显式将str1放到strings pool中,intern运行过程是这样的:首先查看strings pool
  5.//有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至
  6.//strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会
  7.//被GC收集。
  8.
  9.//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
  10.//因此直接返回str1指向的对象给str2,也就是说str2和str1引用着同一个对象,
  11.//此时,堆上的有效对象只有一个。
  12.Stirng str2 = "abc";
  13.
  14.if(str1 == str2){
  15.         System.out.println("str1 == str2");
  16.}else{
  17.         System.out.println("str1 != str2");
  18.}
  19.  //打印结果是 str1 == str2
  20.
  为什么jvm可以这样处理String对象呢?就是因为String的非可变性。既然所引用的对象一旦创建就永不更改,那么多个引用共用一个对象时互不影响。
  比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。是不是有所感悟了?对,String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和 String在这种情况下的表现是相同的
  所以如下程序输出 1234
  public class Test {
  public static void changeStr(String str){
  str="welcome";
  }
  public static void main(String[] args) {
  String str="1234";
  changeStr(str);
  System.out.println(str);
  }
  }
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 10:09:34 | 显示全部楼层

Re:开发交

这篇文档有问题,大家不要看了。过几天我认真测试下, 回来修改。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 01:23 , Processed in 0.314135 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表