String.intern测试

简介:

场景

从文件中读取 100w行一样的字符串,加到list,评测时间和内存和gc。

场景一,普通模式

    List<TestBean> datas = Lists.newArrayList();
    Runtime runtime = Runtime.getRuntime();
    long memoryBefore = runtime.freeMemory();
    Stopwatch stopwatch = Stopwatch.createStarted();
    try (FileReader fileReader = new FileReader("data.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);) {
        String line = null;
        while ((line = bufferedReader.readLine())!=null) {
            TestBean testBean = new TestBean();
            testBean.name = line;
            datas.add(testBean);
        }
    }
    System.out.println("t:"+stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
    System.out.println("m:"+(memoryBefore - runtime.freeMemory()));
    System.out.println(datas.size());

场景二,String.intern

testBean.name = line.intern();

场景三,Guava的Interner

//声明一静态变量
static Interner<Object> objectInterner = Interners.newWeakInterner();
//修改
testBean.name = (String) objectInterner.intern(line);

测试结果

场景 参数 时间 内存 gc
场景一 -Xmx128m 224 65346296 2次minor gc
-Xmx32m oom
场景二 -Xmx128m 334 29105000 2次minor gc
-Xmx32m 1563 19714208 12次minor gc
场景三 -Xmx128m 222 29511112 2次minior gc
-Xmx32m 1751 24794176 12次minor gc

结论

  1. 在内存足够的情况下,可以是用guava Interner,或者String.intern,或者不用,三者区别不大
  2. 在内存有限的情况下,可以考虑 guava Interner,或者String.intern
  3. String.intern只能用在String对象,而guava Interner可以任何非空的object
  4. guava Interner的对象可以是弱引用或是强引用放在内存中,而String.intern存放在常量表中(7以后也放在堆中)
目录
相关文章
|
11月前
|
存储 安全 C#
C#中一些string方法
C#中一些string方法
67 0
|
10月前
|
安全 C语言
String的方法介绍以及实现
String的方法介绍以及实现
|
10月前
|
索引
关于String的常用方法
关于String的常用方法
67 0
|
存储 缓存 Java
String的实现方法简单介绍
String的实现方法简单介绍
89 0
「JDK」解析 String str=““与 new String()
一、基础概念 为了讲清楚他们的差异,这里先介绍几个概念。 1.1 常量池 所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。
|
开发框架 .NET Java
简单看看这两个类 String和StringBuilder
简单看看这两个类 String和StringBuilder
【Java基础】浅谈 toString()、String.valueOf、(String)强转?
【Java基础】浅谈 toString()、String.valueOf、(String)强转?
144 0
【Java基础】浅谈 toString()、String.valueOf、(String)强转?
|
Java 编译器 C++
从JVM理解String、StringBuffer
每一次字符串的创建在JVM中都发生了什么呢?
109 0
从JVM理解String、StringBuffer
|
存储 Java 对象存储
Java常用类、String的特性、String对象的创建、字符串的特性、String使用陷阱、符串相关的类:String常用方法如toLowerCase()、compareTo、substring
Java常用类、String的特性、String对象的创建、字符串的特性、String使用陷阱、符串相关的类:String常用方法如toLowerCase()、compareTo、substring
Java常用类、String的特性、String对象的创建、字符串的特性、String使用陷阱、符串相关的类:String常用方法如toLowerCase()、compareTo、substring
String 案例:拼接字符串
String 案例:拼接字符串
84 0