栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《Java的 String 深入了解》

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《Java的 String 深入了解》

一:String类的理解和创建对象

1)String 对象用于保存字符串,也就是一组字符序列。

2)字符串常量对象是用双引号括起的字符序列。例如:“你好”,“12.97”,“boy” 等

3)字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节。

4)String 类较常用构造器(其他看手册)

String s1 = new String( );

String s2 = new String(String original);

String s3 = new String(char[ ] a);

String s4 = new String(char[ ] a,int startIndex,int count);

 二:String 创建剖析:

 1、创建 String 对象的两种方式。

1)方式一 : 直接赋值 String s = “hsp”;

先从常量池查看是否有 “hsp” 的数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s 最终指向的是常量池的空间地址。

2)方式二: 调用构造器 String s2 = new String(“shp”);

先在堆中创建空间,里面维护了 value 属性,指向常量池的 hsp 空间。如果常量池中没有 “hsp”,重新创建,如果有,直接通过 value 指向。最终指向的是堆中的空间地址。

三:字符串的特性

说明:String是一个 final 类,代表不可变的字符序列。字符串是不可变的,一个字符串对象一旦被分配,其内容是不变的。

1、以下语句创建了几个对象?

  String s1 = "hello";
  s1 = "haha";

答案是:创建了两个对象,注意 s1 只是一个变量。

String a = "hello" + "abc"

答案是: 创建了一个对象。编译器很聪明,会自动优化,判断创建的常量池对象,是否有引用指向。String a = "hello" + "abc" ==> 优化等价 String a = "helloabc";

String a = "hello";
String b = "abc";
String c = a + b;

答案是:创建了三个对象。但是我们来深入分析 c = a + b;的底层逻辑,注意a,b都是String的一个名称,而不是字符串常量。 

步骤1:创建一个StringBuilder sb = StringBuiler();

步骤2:执行 sb.append("hello");

步骤3:  执行 sb.append("abc");

步骤4:  执行 String c = sb.toString.

总结:c 指向的堆中的对象(String)value[ ] -> 池中的  “helloabc”

String a = "hello";
String b = "abc";
String c = a + b;
String d = "helloabc";
System.out.println(c == d)

答案是 false

重要规则:String c = "ab" + "cd"; 常量相加,看的是池;String c = a + b; 变量相加,看的是堆。

巩固加深印象。 

下面程序输出什么结果?

 下面程序输出什么结果?

 注意:Java只有值传递,没有引用传递。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781033.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号