深入String类

问题1:为什么String既可以当基本类型又可以当引用类型使用?

1、String是引用数据类型,不是基本数据类型。java除了8种常用的基本类型以外都是引用数据类型。
2、String str = “abc” 实际是将str引用指向常量池的字符串”abc”,String之所以可以看做基本类型是因为String是最简单的引用类型。实则String是引用类型
String str1=new String(“abc”) 引用类型的常用写法

JVM内存模型


1、存储的是对象,每个对象都包含一个与之对应的class
2、JVM只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
3、对象由垃圾回收器负责回收,因此大小和生命周期不需要确定

1、每个线程都包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)
2、每个栈中的数据(原始类型和对象引用)都是私有的
3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
4、数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会自动消失
方法区
静态区,跟堆一样,被所有的线程共享
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量

参考题

String str1 = "hello";
String str2 = "hello";
System.out.printl(str1 == str2);//true

String str1 = new String(“A” + “B”);会创建多少个对象
String str2 = new String(“ABC”) + “ABC”;会创建多少个对象
str1:
字符串常量池:A B AB 3个
堆:new String(“AB”) 1个
引用:str1:1个
总共:5个

str2:
字符串常量池:ABC 1个
堆:new String(“ABC”) 1个
引用:str2 1个
总共:3个

String.intern()

通过new操作符创建的字符串对象不指向字符串池中的任何对象,但是可以通过使用字符串的intern()方法来指向其中的某一个。java.lang.String.intern()返回一个保留池字符串,就是一个在全局字符串池中有了一个入口。如果以前没有在全局字符串池中,那么它就会被添加到里面

   // Create three strings in three different ways.
    String s1 = "Hello";
    String s2 = new StringBuffer("He").append("llo").toString();
    String s3 = s2.intern();

    // Determine which strings are equivalent using the ==
    // operator
    System.out.println("s1 == s2? " + (s1 == s2)); // false
    System.out.println("s1 == s3? " + (s1 == s3)); // true

猜你喜欢

转载自blog.csdn.net/wang123459/article/details/82378396