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

首页 > 数码 > 作者:YD1662024-04-26 12:29:31

/** * ① 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应用(有大的也有小的)做的测试得出以下结果:

官方动机描述: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、实现5.3 命令

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

UseStringDeduplication(bool)

打印详细的去重统计信息

PrintStringDeduplicationStatistics(bool)

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

StringpeDuplicationAgeThreshold(uintx)

,
上一页12末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.