/***
* 面试题:这两种定义方式有什么区别?
* 如何证明?
* @param args
*/
public static void main(String[] args) {
String str = "hello";//常量池
String str1 = new String("hello");//在堆里开辟一块新的空间
}
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();//转小写
}
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("该字符串时一个回文");
}
}
}
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);
}
原文:https://www.cnblogs.com/cjxxl1213/p/14997996.html