String赋值的2种方式
-
直接用字面值赋值
形如:String str = “ test1”
系统会先去字符串常量池寻找,如果有“test1”直接使用,没有才创建
-
用String类的带参构造器赋值
形如:String str = new String( “test1”)
这里用的是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存储时的内容消耗极大降低