Java String理解

来源:互联网 发布:淘宝店铺页面怎么装修 编辑:程序博客网 时间:2024/06/10 02:14

String的创建

这里写图片描述
对于

String str1 =  "hello";//常量区String str2 =  "hello";//常量区String str3 = "he";//常量区String str4 = str3 + "llo";//通过StringBuffer的append在堆区新new了一个String,堆区

“hello”存储于常量区(JVM的方法区)
str1和str2分别指向常量区”hello”的地址,所以str1 == str2是true
如果是str3 = new String(“hello”);则会分配在堆区。
str1 == str3 是false

深入理解Java:String

String作为参数

public class Example {    String str = new String("good");    char[] ch = { 'a', 'b', 'c' };    public static void main(String args[]) {        Example ex = new Example();        ex.change(ex.str, ex.ch);        System.out.print(ex.str + " and ");        System.out.print(ex.ch);    }   public void change(String str, char ch[])         {        str = "test ok";        ch[0] = 'g';    }}

其实都是引用传递,只是因为String是个特殊的final类,所以每次对String的更改都会重新创建内存地址并存储(也可能是在字符串常量池中创建内存地址并存入对应的字符串内容),但是因为这里String是作为参数传递的,在方法体内会产生新的字符串而不会对方法体外的字符串产生影响。
基本类型传递的是值的副本,引用类型传递的是引用的值的副本。
注意,String是final类型的,不能修改不能被继承

String.intern()

String对象的实例调用intern方法后,JVM会检查常量池
如果没有实例的value属性对应的字符串序列比如”123”(注意是检查字符串序列而不是检查实例本身),就将本实例放入常量池
如果有当前实例的value属性对应的字符串序列”123”在常量池中存在,则返回常量池中”123”对应的实例的引用而不是当前实例的引用,即使当前实例的value也是”123”。

0 0
原创粉丝点击