深入java字符串原理及其效率分析

  • java字符串类基本特点

  1. String类是final的,不可继承
  2. String类源码实现通过字符数组实现,长度不可改变
  3. 可以通过String str = "123"来创建一个String对象
  4. 通过+可以将两个String对象串联,生成新的字符串
  5. java运行时会维护一个字符串池,String池会保存程序运行中产生的各种字符串,这些字符串内容不能相同

  • 字符串创建的几种方式

  1. 使用new关键字创建  String str = new String("str");
  2. String str  = "a";
  3. String str = "a",String str2 = str + "bb";

  • 字符串创建的关键原理

  1. 通过任何方式创建的字符串都会在字符串池中查找该字符串是否存在,如果不存在则向字符串池中添加该字符串
  2. 通过new关键字创建的字符串,会在堆栈中创建一个新的对象
  3. 通过String str  = "aa"+"bb"; 方式创建创建字符串,java只会维护其在字符串池中是否存在
  4. 如果通过字符串拼接所创建的字符串中存在变量,那么java会在堆栈区中创建一个对象

      字符串的不同创建位置比较

 /**
  *
  * 几种字符串创建方式的比较
  *
  */
 public static void compare()
 {
  //指向对象池中的"abc",不在堆栈中创建对象
  String str1 = "abc";
  //指向对象池中的"abc",不在堆栈中创建对象
  String str2 = str1;
  //在堆栈中创建,指向对象
  String str3 = new String("abc");
  //指向对象池中的"abc",不在堆栈中创建对象
  String str4 = "a"+"bc";
  String a = "c";
  //在堆栈中创建对象,并指向该对象
  String str5 = "ab" + a;
  //在堆栈中创建对象,并指向该对象
  String str6 = "ab".concat(a);
  //在堆栈中创建对象,并指向该对象
  String str7 = "ab".concat("c");
 
  System.out.println(str1==str2);//true
  System.out.println(str1==str3);//false
  System.out.println(str1==str4);//true
  System.out.println(str1==str5);//false
  System.out.println(str1==str6);//false
  System.out.println(str1==str7);//false
  System.out.println(str3==str4);//false
  System.out.println(str3==str5);//false
  System.out.println(str3==str6);//false
  System.out.println(str3==str7);//false
 }

/**
  * 采用不同的方式创建空字符串
  */
 public static void compareEmpty()
 {
  String str1 = new String("");
  String str2 = "";
  String str3 = new String("");
  //intern()方法会判断字符串是否在字符串池中,如果存在直接返回引用即可
  String str4 = "".intern();
  String str5 = ""+"";
  //trim()方法会在堆栈中创建一个对象
  String str6 = " ".trim();
  String str7 = " ";
  String str8 = " ".trim();
  String str9 = "".concat("");
 
  System.out.println(str1==str2);//false
  System.out.println(str1==str3);//false
  System.out.println(str1==str4);//false
  System.out.println(str1==str5);//false
  System.out.println(str1==str6);//false
  System.out.println(str1==str7);//false
  System.out.println(str1==str8);//false
  System.out.println(str1==str9);//false
  System.out.println(str2==str3);//false
  System.out.println(str2==str6);//false
  System.out.println(str2==str8);//true
  System.out.println(str2==str9);//false
  System.out.println(str6==str8);//false**
 
 }

字符串操作中的效率问题

字符串的切分算法采用StringTokenizer的效率优于String的Split方法,字符串切分中StringToken的效率优于split方法
字符串的拼接中采用StringBuilder的效率高于字符串相加或者new String().concat()方法,因为字符串相加或者拼接的方式都会在对象池中查找字符串是否存在,如果不存在则创建,这样在拼接的过程中会产生大量中间过程的字符串,占用内存资源,StringBuilder效率优于StringBuffer,但是StringBuffer线程安全

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值