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对象中

相关文章
|
缓存 负载均衡 测试技术
‌API开发的基础概念和作用‌
API(Application Programming Interface)是一组定义了软件组件之间交互规则的接口。它提供了一种标准化的方式,让不同的软件组件之间可以进行通信和交互。
420 2
|
JavaScript
js 保留2位小数
js 保留2位小数
275 124
|
消息中间件 分布式计算 大数据
大数据Spark实时搜索日志实时分析
大数据Spark实时搜索日志实时分析
348 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的校园网上店铺的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的校园网上店铺的详细设计和实现
114 0
基于SpringBoot+Vue+uniapp微信小程序的校园网上店铺的详细设计和实现
|
Ubuntu Shell 计算机视觉
Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)
Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)
Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)
|
安全 机器人 物联网
【年终特辑】看见科技创新力量 洞见时代创业精神—交通物流—福迩斯基:打造节水智能洗车品牌
【年终特辑】看见科技创新力量 洞见时代创业精神—交通物流—福迩斯基:打造节水智能洗车品牌
413 0
|
编译器 C语言 C++
【C语言】C语言标准头文件
【C语言】C语言标准头文件
250 0
|
缓存 负载均衡 监控
Apache Flume-高阶-负载均衡功能|学习笔记
快速学习 Apache Flume-高阶-负载均衡功能
Apache Flume-高阶-负载均衡功能|学习笔记
|
Android开发 索引
【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
576 0
【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
|
Java NoSQL Redis
35个面试详解,170道挑战题,1460个精彩问答 | 最全Java工程师面试宝典
想要面试Java工程师看这里!这是一份你从没见过的“船新版本”Java工程师面试宝典!涵盖了35道经典面试题和解析,170道挑战题等你来答,更有1460个Java热门问答和华山版阿里巴巴《Java开发者手册》等你下载!还在等什么呢,不收藏了先?!
33204 0