String、StringBuffer、StringBuilder

String赋值的2种方式

  1. 直接用字面值赋值

    形如:String str = “ test1”

    系统会先去字符串常量池寻找,如果有“test1”直接使用,没有才创建

  2. 用String类的带参构造器赋值

    形如:String str = new String( “test1”)

1563341895257

这里用的是String类的构造器去创建,它会先去字符串常量池里开辟一个空间,还会在堆内存中开辟了对象,然后让方法栈中的str引用指向堆内存中。

String类常用方法

String str = "I love java";
		System.out.println(str.charAt(2));//返回指定索引处的字符
		System.out.println(str.codePointAt(2));//返回指定索引处的代码点(unicode的10进制序号)
		String str2 = " this is a Test.avi";
		System.out.println(str.compareTo(str2));//按字典比较其他字符串
		System.out.println(str.compareToIgnoreCase(str2));//按字典比较其他字符串(忽略大小写)
		System.out.println(str.concat("ye"));//string字符串拼接,返回一个string
		System.out.println(str);
		System.out.println(str.contains("ava"));//是否包含指定的字符串,返回boolean值
		System.out.println(str2.endsWith(".avi"));//是否以指定后缀结束
		System.out.println(str.indexOf('m'));//匹配时返回第一个字符的索引,否则返回-1
		System.out.println(str.indexOf("ja"));//匹配时返回字符串第一个字符的索引,否则返回-1
		System.out.println(str.indexOf('a', 9));//从指定索引处开始匹配
		System.out.println(str.lastIndexOf('a'));//返回最后一个匹配的字符的索引
		System.out.println(str.isEmpty());//是否为空
		System.out.println(str.intern());//返回字符串对象的规范表示,返回的string指向字符串常量池
		System.out.println("I love java".intern());
		System.out.println(str.length());//返回字符串的长度
		System.out.println(str.replace('a', 'p'));//替换所有字符
		System.out.println(str.startsWith("I"));//返回是否以xx前缀开头
		String[] strs = str.split(" ");//通过给定的字符换切割字符串,返回一个字符串数组
		for(String s:strs) {
			System.out.println(s);
		}
		System.out.println(str.substring(2));//从指定索引处截取后面的字符串
		System.out.println(str.substring(2,6));//从开始索引处截取后面的字符串到指定的结束索引前一位
		char[] chs = str.toCharArray();//将string返回一个字符数组
		for(char c:chs) {
			System.out.println(c);
		}
		System.out.println(str.toLowerCase());//返回字符串的小写
		System.out.println(str.toUpperCase());//返回字符串的大写
		System.out.println(str2.trim());//截取字符串的所有前导和后随的空格
		System.out.println(str2);
		System.out.println(String.copyValueOf(chs, 0, 6));//将字符数组从指定索引处截取指定位数返回一个字符串
		System.out.println(str.subSequence(2, 5));
		str.getChars(2, 6, chs, 6);
		System.out.println(chs);
		byte[] buf = str.getBytes();//返回字符串的字节数组
		for(byte b:buf) {
			System.out.println(b);
		}

String、StringBuilder、StringBuffer性能比较

public class Test4 {
	public static void main(String[] args) {
		t1();
		t2();
		t3();
		t4();
	}
	
	public static void t1() {
		long begin = System.currentTimeMillis();
		String str = "";
		for(int i=0;i<=10000;i++) {
			str.concat("a");
		}
		long end = System.currentTimeMillis();
		System.out.println("concat:"+(end-begin));
	}
	public static void t2() {
		long begin = System.currentTimeMillis();
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<=10000;i++) {
			sb.append("a");
		}
		long end = System.currentTimeMillis();
		System.out.println("StringBuilder:append:"+(end-begin));
	}
	public static void t3() {
		long begin = System.currentTimeMillis();
		StringBuffer sb =  new StringBuffer();
		for(int i=0;i<=10000;i++) {
			sb.append("a");
		}
		long end = System.currentTimeMillis();
		System.out.println("StringBuffer:append:"+(end-begin));
	}
	
	public static void t4() {
		long begin = System.currentTimeMillis();
		String str = "";
		for(int i=0;i<=10000;i++) {
			str = str+"a";
		}
		long end = System.currentTimeMillis();
		System.out.println("+:"+(end-begin));
	}
}

运行结果:

执行效率:
StringBuilder>StringBuffer>String 
append> concat > + 
如果+左右两边是字面值,则效率最高
总结
String是不可变串,底层是字符数组,调用方法会返回一个新的串,原串不变
StringBuilder和StringBuffer都继承了AbstractStringBuilder,是可变字符串
StringBuffer相比StringBuilder增加了锁机制,所以
StringBuffer效率低于StringBuilder 
StringBuffer安全性要高于StringBuilder 
一般情况下使用StringBuilder
jdk9之后 String中存储数据通过byte数组存储 + 变量 
jdk中对于String存储时的内容消耗极大降低 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值