1.这两种定义有什么区别
/*** * 面试题:这两种定义方式有什么区别? * 如何证明? * @param args */ public static void main(String[] args) { String str = "hello";//常量池 String str1 = new String("hello");//在堆里开辟一块新的空间 }
2.String 常用方法
public static void test(){ String str = "Hello World";//常量的特点是定义了,就不会变,除非重新赋值 int len = str.length();//字符串的长度 boolean eq = str.equals("33333");//判断两个字符的值是不是相等 char charStr = str.charAt(2);//将字符串转换为char类型 boolean contains = str.contains("hello");//判断字符串是否包含这个字符串 boolean startWith = str.startsWith("H");//判断字符串是否以这个字符串开始 boolean endWith = str.endsWith("ddd");//判断字符串是否以这个字符串结尾 boolean empty = str.isEmpty();//判断这个字符串是否为空的字符串,是"",不是null boolean eqIgnore = str.equalsIgnoreCase("HELLO WORLD");//不区分大小写的相等 //rep = Hello java; str = Hello World //如果没有找到匹配的,则不做替换 String rep = str.replaceAll("World","java");//替换全部的 String rep1 = str.replace("H","e");//替换一个,传值的变量都是char String rep2 = str.replace("He","eeeee");//替换一个,传值的变量都是char System.out.println(rep); System.out.println(str); System.out.println(rep1); System.out.println(rep2); String[] strs = str.split(" ");//分割,分割后是变成数组 String sub = str.substring(1,5);//截取,下标是从0开始,1--是开始下标,5--是截止下标 System.out.println(sub); String upStr = str.toUpperCase();//转大写 String lowStr = str.toLowerCase();//转小写 }
3.commons-lang3
dependencies { compile('org.apache.commons:commons-lang3:3.10') }
小练习
public class Demo6 { //练习题:给定一个字符串,判断是否是一个回文(即正反都一样) //abcdefggfedcba public static void main(String[] args) { test1(); } public static void test1(){ String str = "abcdefgfedcba"; String str1 = StringUtils.reverse(str);//将字符串反转 System.out.println("str1 = " + str1); if (str.equals(str1)){ System.out.println("该字符串时一个回文"); } } }
4.StringBuilder和StringBuffer
StringBuffer多了一个synchronized 关键字,线程安全锁
StringBuilder是线程不安全的
StringBuffer是线程安全的
但是一般情况下是在一个方法下使用,使用StringBuilder多点
如果出现多线程调用时,再用StringBuffer
//StringBuilder 的定义 @Override public StringBuilder append(String str) { super.append(str); return this; }
//StringBuffer的定义 @Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
public static void test1(){ String str = "a,b,c,d,e,f,g"; String[] arr = str.split(","); String res = ""; //这种情况是在不断的创建对象 for (String key:arr){ res += key + "*"; } System.out.println("res = " + res); } public static void test2(){ String str = "a,b,c,d,e,f,g"; String[] arr = str.split(","); //StringBuilder相当于一个容器,不断的往容器里加内容 StringBuilder res = new StringBuilder(); for (String key:arr){ res.append(key).append("*"); } System.out.println("res = " + res); } public static void test3(){ String str = "a,b,c,d,e,f,g"; String[] arr = str.split(","); //StringBuffer多了一个synchronized 关键字,线程安全锁 StringBuffer res = new StringBuffer(); for (String key:arr){ res.append(key).append("*"); } System.out.println("res = " + res); }