JavaSE——字符串常量池(StringTable)

简介: JavaSE——字符串常量池(StringTable)

 

文章目录

  1. 字符串常量池
  2. intern方法
  3. 面试题
  4. 字符串常量池(StringTable)

为了提升性能和减少内存开销,避免字符串的重复创建,JVM维护了一块特殊的内存空间,就是字符串常量池。字符串常量池由String类私有的维护

Java中有两种创建字符串对象的方式:

  1. 直接使用字符串常量进行赋值

public class Test {

public static void main(String[] args) {
    String s1 = "hello";
    String s2 = "hello";
    System.out.println(s1==s2);

}

}
//运行结果:true

  1. 通过new创建String类对象

public class Test {

public static void main(String[] args) {
    String s1 = "hello";
    String s2 = "hello";
    String s3 = new String("hello");
    String s4 = new String("hello");
    System.out.println(s3==s4);
    //运行结果:false
}

}

一道题:

//下面代码将输出什么内容:()

public class SystemUtil{

public static boolean isAdmin(String userId){
    return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
    System.out.println(isAdmin("Admin"));
}

}

  1. intern方法

该方法的作用是手动将创建的String对象添加到常量池中

public class Test {

public static void main(String[] args) {
    char[] chars = new char[]{'h','e','l','l','o'};
    String s1 = new String(chars);
    //s1.intern();
    String s2 = "hello";
    System.out.println(s1==s2);
}
//运行结果:false

}

因此输出:false

public class Test {

public static void main(String[] args) {
    char[] chars = new char[]{'h','e','l','l','o'};
    String s1 = new String(chars);
    s1.intern();
    String s2 = "hello";
    System.out.println(s1==s2);
}
//运行结果:true

}

  1. 面试题

请解释String类中两种对象实例化的区别(JDK1.8中)

String str = "hello"

只会开辟一块堆内存空间,保存在字符串常量池中,然后str共享常量池中的String对象

String str = new String("hello")

会开辟两块堆内存空间,字符串"hello"保存在字符串常量池中,然后用常量池中的String对象给新开辟的String对象赋值

String str = new String(new char[]{'h', 'e', 'l', 'l', 'o'})

现在堆上创建一个String对象,然后利用copyof将重新开辟数组空间,将参数字符串数组中内容拷贝到String对象中

相关文章
|
8月前
|
存储 设计模式 监控
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
64 0
|
Java 编译器 C++
JVM 常量池
JVM 常量池
126 0
|
存储 缓存 Java
JVM - 深入剖析字符串常量池
JVM - 深入剖析字符串常量池
166 0
|
Oracle Java 关系型数据库
JVM虚拟机-Class文件之常量池
JVM虚拟机-Class文件之常量池
180 0
JVM虚拟机-Class文件之常量池
|
存储
面试题:为什么不把基本数据类型放在堆中
面试题:为什么不把基本数据类型放在堆中
74 0
|
存储 Java 编译器
Java 中方法区与常量池
Java 中方法区与常量池
262 0
Java 中方法区与常量池
|
Java 编译器
JavaSE面试题04:成员变量与局部变量
JavaSE面试题04:成员变量与局部变量
93 0
|
存储 缓存 Java
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs(上)
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs(上)
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs(上)
|
存储 缓存 Java
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs(下)
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs(下)
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs(下)
|
存储 Java 编译器
JVM 三种常量池(中)
本文主要讲述三种常量池: Class 常量池、字符串常量池、还有基本类型常量池。 默认 jdk 版本:jdk 1.8
217 0
JVM 三种常量池(中)