当前位置: 首页 > news >正文

字符串常量池

1.创建对象的思考

下面两种创建字符串的方式一样吗?

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(s1 == s2);System.out.println(s3 == s4);System.out.println(s1 == s3);}

在Java程序中,类似于1,2,3,3.14,“hello"等字面类型的常量经常被频繁的使用,为了使程序更加的节省空间,运行速度更快,Java为8中基本数据类型和String类提供了常量池。

池是一种常见的,重要的提高效率的方式,当我们需要里面的资源时,我们不必重新创建,直接从池中取得相应的资源。

为了节省储存空间以及程序的运行效率,Java中引入了:

  1. Class文件常量池:每个.Java源文件编译后会生成.Class文件,文件中会保存当前类中的字面常量以及符号信息。

  1. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池

  1. 字符常量池

2.字符常量池(StirngTable)

字符常量池在JVM中是StringTable类,实际上是一个固定大小的HashTable,在不同的JDK版本下字符串常量池的位置以及默认的大小是不同的。

3.再谈String对象创建

不同的JDK版本对字符串常量池的处理方式是不同的,我们以Java8 HotSpot上分析

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

2.通过new创建String类对象

结论:只要是new的对象,都是唯一的。

通过上面的例子,我们发现通过常量字符串创建对象更加的高效。

3.intern方法

intern()是手动将创建的String对象添加到常量池中

//手动将字符串添加到常量池中public static void main(String[] args) {char[] ch = new char[]{'a', 'b', 'c'};String s1 = new String(ch);//这不会将字符串放到常量池里面s1.intern();//我们能手动将字符串放到常量池里面String s2 = "abc";System.out.println(s1 == s2);//此时我们发现它们引用的是同一个对象}

http://www.lryc.cn/news/1707.html

相关文章:

  • 让技术更有温度,腾讯Light 点亮公益之光
  • 电子采购一体化解决方案
  • SAP COPA 获利能力分析深度解析
  • Java学习记录day6
  • ubuntu 使用 adb 工具卸载鸿蒙系统预装软件
  • Jmeter in Linux - 在Linux系统使用Jmeter的坑
  • 什么是特权访问管理(PAM)
  • LeetCode题目笔记——1.两数之和
  • CSDN版的详细MarkDown的使用教程
  • Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器
  • Set集合的特点,HashSet去重的几个重要问题
  • 云计算|OpenStack|社区版OpenStack安装部署文档(十一--- 如何获取镜像---Rocky版)
  • UmiJS学习
  • Leetcode:322. 零钱兑换(C++)
  • C经典小游戏之扫雷
  • 第十节 使用设备树插件实现RGB 灯驱动
  • 【LeetCode】公交路线 [H](宽度优先遍历)
  • 报表生成器 FastReport .Net 用户指南 2023(十):Band的属性
  • DAMA数据管理知识体系指南之文档和内容管理
  • C++入门:数据结构
  • C语言实现烟花表白,内含源码!!
  • 虚拟机安装CentOS 7(带界面)
  • Java测试——selenium具体操作
  • 电子器件系列32:逻辑与门芯片74LS11
  • LeetCode-101. 对称二叉树
  • 使用intlinprog求解指派问题MATLAB代码分享
  • Spark On YARN时指定Python版本
  • [数据库]库的增删改查
  • Wine零知识学习1 —— 介绍
  • 设计模式--建造者模式 builder