Java不可变序列String和可变序列StringBuilderStringBuffer
Posted chiweiming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java不可变序列String和可变序列StringBuilderStringBuffer相关的知识,希望对你有一定的参考价值。
String
String变量是不可变的,源码里面用了final修饰。
private final char value[];
String str = "Hello"; System.out.println(Integer.toHexString(str.hashCode())); str = "World"; //字符串一旦变化就会重写生成一个对象 System.out.println(Integer.toHexString(str.hashCode()));
//输出 42628b2 4fe2b72
StringBuilder线程不安全,但效率高,常用。
StringBuffer线程安全,但效率低。
StringBuilder sb = new StringBuilder("Hello"); System.out.println(Integer.toHexString(sb.hashCode())); sb.append(" World"); //追加 System.out.println(sb); System.out.println(Integer.toHexString(sb.hashCode()));
//输出 45ee12a7 Hello World 45ee12a7
public class Test public static void main(String[] args) String str1 = ""; long num1 = Runtime.getRuntime().freeMemory(); long num2 = System.currentTimeMillis(); for (int i = 0; i < 5000; i++) str1 = str1 + i; long num3 = Runtime.getRuntime().freeMemory(); long num4 = System.currentTimeMillis(); System.out.println("消耗内存:"+(num3-num1)); System.out.println("消耗时间:"+(num4-num2)); StringBuilder str2 = new StringBuilder(""); long num5 = Runtime.getRuntime().freeMemory(); long num6 = System.currentTimeMillis(); for (int i = 0; i < 5000; i++) str2.append(i); long num7 = Runtime.getRuntime().freeMemory(); long num8 = System.currentTimeMillis(); System.out.println("消耗内存:"+(num7-num3)); System.out.println("消耗时间:"+(num8-num4));
//输出 消耗内存:-5895808 消耗时间:149 消耗内存:0 消耗时间:0
以上是关于Java不可变序列String和可变序列StringBuilderStringBuffer的主要内容,如果未能解决你的问题,请参考以下文章
Java的——String类StringBuffer和StringBuilder不可变和可变字符序列使用陷阱