当前位置:首页 > 数码 >

怎么解决字符常量中的字符过多(字符常量合法的条件)

来源:原点资讯(m.360kss.com)时间:2024-04-26 12:29:31作者:YD166手机阅读>>

/** * ① String s = new String("1") * 创建了两个对象 * 堆空间中一个new对象 * 字符串常量池中一个字符串常量"1"(注意:此时字符串常量池中已有"1") * ② s.intern()由于字符串常量池中已存在"1" * * s 指向的是堆空间中的对象地址 * s2 指向的是堆空间中常量池中"1"的地址 * 所以不相等 */ String s = new String("1"); s.intern(); String s2 = "1"; System.out.println(s==s2); // jdk1.6 false jdk7/8 false /* * ① String s3 = new String("1") new String("1") * 等价于new String("11"),但是,常量池中并不生成字符串"11"; * * ② s3.intern() * 由于此时常量池中并无"11",所以把s3中记录的对象的地址存入常量池 * 所以s3 和 s4 指向的都是一个地址 */ String s3 = new String("1") new String("1"); s3.intern(); String s4 = "11"; System.out.println(s3==s4); //jdk1.6 false jdk7/8 true

String的intern()的使用总结

JDK1.6中,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址;如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址 JDK1.7起,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址;如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址

举例如下:

JDK6中

怎么解决字符常量中的字符过多,字符常量合法的条件(5)

JDK7及以上

怎么解决字符常量中的字符过多,字符常量合法的条件(6)

JDK6/7/8中

怎么解决字符常量中的字符过多,字符常量合法的条件(7)

4.2、intern的效率测试:空间角度

public class StringIntern2 { static final int MAX_COUNT = 1000 * 10000; static final String[] arr = new String[MAX_COUNT]; public static void main(String[] args) { Integer [] data = new Integer[]{1,2,3,4,5,6,7,8,9,10}; long start = System.currentTimeMillis(); for (int i = 0; i < MAX_COUNT; i ) { // arr[i] = new String(String.valueOf(data[i?ta.length])); arr[i] = new String(String.valueOf(data[i?ta.length])).intern(); } long end = System.currentTimeMillis(); System.out.println("花费的时间为:" (end - start)); try { Thread.sleep(1000000); } catch (Exception e) { e.getStackTrace(); } } } // 运行结果 不使用intern:7256ms 使用intern:1395ms

对于程序中大量使用存在的字符串时,尤其存在很多已经重复的字符串时,使用intern()方法能够节省内存空间。大的网站平台,需要内存中存储大量的字符串。比如社交网站,很多人都存储:北京市、海淀区等信息。这时候如果字符串都调用intern()方法,就会很明显降低内存的大小。

五、G1中的String去重操作5.1、背景

对许多Java应用(有大的也有小的)做的测试得出以下结果:

  • 堆存活数据集合里面string对象占了25%
  • 堆存活数据集合里面重复的string对象有13.5%
  • string对象的平均长度是45

官方动机描述:https://openjdk.org/jeps/192

Motivation

Many large-scale Java applications are currently bottlenecked on memory. Measurements have shown that roughly 25% of the Java heap live data set in these types of applications is consumed by String objects. Further, roughly half of those String objects are duplicates, where duplicates means string1.equals(string2) is true. Having duplicate String objects on the heap is, essentially, just a waste of memory. This project will implement automatic and continuous String deduplication in the G1 garbage collector to avoid wasting memory and reduce the memory footprint.

目前,许多大规模的Java应用程序在内存上遇到了瓶颈。测量表明,在这些类型的应用程序中,大约25%的Java堆实时数据集被String'对象所消耗。此外,这些 "String "对象中大约有一半是重复的,其中重复意味着 "string1.equals(string2) "是真的。在堆上有重复的String'对象,从本质上讲是一种内存的浪费。这个项目将在G1垃圾收集器中实现自动和持续的`String'重复数据删除,以避免浪费内存,减少内存占用。

注意这里说的重复,指的是在堆中的数据,而不是常量池中的,因为常量池中的本身就不会重复

5.2、实现
  • 当垃圾收集器工作的时候,会访问堆上存活的对象。对每一个访问的对象都会检查是否是候选的要去重的String对象
  • 如果是,把这个对象的一个引用插入到队列中等待后续的处理。一个去重的线程在后台运行,处理这个队列。处理队列的一个元素意味着从队列删除这个元素,然后尝试去重它引用的string对象。
  • 使用一个hashtable来记录所有的被String对象使用的不重复的char数组。当去重的时候,会查这个hashtable,来看堆上是否已经存在一个一模一样的char数组。
  • 如果存在,String对象会被调整引用那个数组,释放对原来的数组的引用,最终会被垃圾收集器回收掉。
  • 如果查找失败,char数组会被插入到hashtable,这样以后的时候就可以共享这个数组了。
5.3 命令

开启String去重,默认是不开启的,需要手动开启。

UseStringDeduplication(bool)

打印详细的去重统计信息

PrintStringDeduplicationStatistics(bool)

达到这个年龄的String对象被认为是去重的候选对象

StringpeDuplicationAgeThreshold(uintx)

,
上一页12末页

栏目热文

怎样正确判断字符常量(字符型常量怎样算合法)

怎样正确判断字符常量(字符型常量怎样算合法)

本文我们将分享介绍一道关于java的“字符串面试题~代码实现题”,主要实现的功能“查找特定的字符串单词word在一个长长...

2024-04-26 12:49:28查看全文 >>

四级成绩查询共多长时间(四级成绩查询时间有截止日期吗)

四级成绩查询共多长时间(四级成绩查询时间有截止日期吗)

2023年下半年全国大学英语四、六级考试(CET)成绩查询服务将于2024年2月27日上午6时开通。来“中国教育发布”客...

2024-04-26 12:36:29查看全文 >>

四级成绩用什么查询(四级怎么查询成绩最新)

四级成绩用什么查询(四级怎么查询成绩最新)

四六级成绩查询。12月份第一次考四级的同学,成绩通常会比估计的高个几十分。今天教你们一下不需要准考证号去查询四六级成绩的...

2024-04-26 12:45:47查看全文 >>

四级怎么查以前的成绩(四级怎么查历史成绩)

四级怎么查以前的成绩(四级怎么查历史成绩)

四六级成绩会被覆盖吗?四六级成绩这次比上次更低了怎么办?听说点赞的同学不管怎样都能过级。四六级成绩会被覆盖吗?按最新还是...

2024-04-26 12:30:26查看全文 >>

四级怎么查询之前的成绩(四级成绩查询简单方法)

四级怎么查询之前的成绩(四级成绩查询简单方法)

今天,2023年下半年全国大学英语四、六级考试(CET)成绩查询服务开通。查询网址→https://cjcx.neea....

2024-04-26 12:17:51查看全文 >>

常量字符串为什么不能修改(字符型常量和字符串常量如何使用)

常量字符串为什么不能修改(字符型常量和字符串常量如何使用)

哈喽,我是子牙,一个很卷的硬核男人深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那...

2024-04-26 12:23:53查看全文 >>

常量中有换行符解决方法(c语言常量中有换行符怎么解决)

常量中有换行符解决方法(c语言常量中有换行符怎么解决)

【分享成果,随喜正能量】千淘万漉虽辛苦,吹尽狂沙始到金。无人问津的日子里,定心,静心,做好自己的事,一切烦躁焦虑都烟消云...

2024-04-26 12:04:03查看全文 >>

整型常量要用逗号隔开吗(长整型常量后面要跟什么字母)

整型常量要用逗号隔开吗(长整型常量后面要跟什么字母)

1、#define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定...

2024-04-26 12:02:21查看全文 >>

字符常量过多怎么解决(常见的字符常量怎么判断)

字符常量过多怎么解决(常见的字符常量怎么判断)

作为一个面向对象的编程语言,Java提供了自动的内存管理机制,这也成为了很多面试官最喜欢问的问题。从内存管理的角度来谈谈...

2024-04-26 12:49:02查看全文 >>

为什么不能用符型常量(字符型常量与符号常量区别)

为什么不能用符型常量(字符型常量与符号常量区别)

先初步了解引用、指针的一些注意事项。引用并非对象引用必须初始化引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果...

2024-04-26 12:15:46查看全文 >>

文档排行