前言:本次回顾Java基础中的常用类String的知识点,JDK版本为1.8,使用单元测试运行程序。
1.String的内存解析:
package com.yan.commonClass;
import org.junit.Test;
public class StringTest {
@Test
//验证String的不可变性
public void test(){
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true:此时s1和s2指向同一内存空间
s1 = "hello"; //重新开辟了内存空间
System.out.println(s1); //hello
System.out.println(s2); //abc
System.out.println("-------------");
String s3 = "abc";
s3 += "def"; //重新开辟了内存空间
System.out.println(s3); //abcdef
System.out.println(s2); //abc
System.out.println("-------------");
String s4 = "abc";
String s5 = s4.replace('a','m');
System.out.println(s4); //abc
System.out.println(s5); //mbc
}
@Test
public void test1(){
//通过字面量的方式:此时s1和s2的数据abc声明在方法区中的字符串常量池中
String s1 = "abc";
String s2 = "abc";
//通过new+构造器:此时的s3和s4保存的地址值,是数据在堆空间开辟空间以后对应的地址值
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s1 == s4); //false
System.out.println(s3 == s4); //false
System.out.println("-----------------");
Person p1 = new Person("Tom", 16);
Person p2 = new Person("Tom", 16);
//此时的equals()重写了
System.out.println(p1.name.equals(p2.name)); //true
//虽然p1和p2是在堆空间中;但p1.name和p2.name因为是字面量定义的
//所以它们是在常量池中,故指向同一个内存空间;
System.out.println(p1.name == p2.name); //true
p1.name = "Jerry"; //新开辟了一个内存空间
System.out.println(p2.name); //Tom
}
@Test
public void test2(){
String s1 = "abc";
String s2 = "def";
String s3 = "abcdef"; //常量池
String s4 = "abc"+ "def"; //常量池
String s5 = s1+ "def"; //堆空间
String s6 = "abc"+ s2; //堆空间
String s7 = s1 + s2; //堆空间
System.out.println(s3 == s4); //true
System.out.println(s3 == s5); //false
System.out.println(s3 == s6); //false
System.out.println(s5 == s6); //false
System.out.println(s5 == s7); //false
System.out.println(s6 == s7); //false
String s8 = s5.intern(); //返回得到的s8使用的常量池中已经存在的"abcdef"
System.out.println(s3 == s8); //true
}
}
2.String类的常用方法:
package com.yan.commonClass;
import org.junit.Test;
public class StringMethodTest {
@Test
public void test(){
String s1 = "helloWorld";
System.out.println(s1.length());
System.out.println(s1.charAt(0));
System.out.println(s1.isEmpty());
String s2 = s1.toLowerCase();
System.out.println(s1); //s1不可变的,为原来的字符串
System.out.println(s2); //改成小写以后的字符串
String s3 = " he llo World ";
String s4 = s3.trim();
System.out.println("---"+s3+"---");
System.out.println("---"+s4+"---");
String s5 = "HelloWorld";
String s6 = "helloworld";
System.out.println(s5.equals(s6)); //false
System.out.println(s5.equalsIgnoreCase(s6)); //true
String s7 = "Hello";
String s8 = s7.concat("World");
System.out.println(s8); //HelloWorld
String s9 = "abc";
String s10 = new String("abd");
System.out.println(s9.compareTo(s10)); // -1:表示小于
String s11 = "严以律己宽以待人";
String s12 = s11.substring(4);
System.out.println(s12); //宽以待人
String s13 = s11.substring(2, 7);
System.out.println(s13); //律己宽以待
}
@Test
public void test1(){
String s1 = "helloWorld";
boolean b1 = s1.startsWith("he"); //true
System.out.println(b1);
boolean b2 = s1.endsWith("ld"); //true
System.out.println(b2);
boolean b3 = s1.startsWith("ll", 2);
System.out.println(b3); //true
String s2 = "wor";
System.out.println(s1.contains(s2)); //false
System.out.println(s1.indexOf("lo")); //3
System.out.println(s1.indexOf("1o",5)); //-1
String s3 = "HelloWorld";
System.out.println(s3.lastIndexOf("or")); //6
System.out.println(s3.lastIndexOf("or", 6)); //6
//什么情况下,indexOf(str)和lastIndexOf(str)返回值相同?
//情况一:存在唯一的一个str;情况二:不存在str
}
@Test
public void test2(){
String s1 = "HelloWorldHello";
String s2 = s1.replace('H', 'h');
System.out.println(s1); //HelloWorldHello
System.out.println(s2); //helloWorldhello
String s3 = s1.replace("Hello", "My");
System.out.println(s3); //MyWorldMy
System.out.println("--------------------------------");
String s4 = "12hello34world56java78mysql910";
//将字符串中的数字替换成, ,如果结果中开头和结尾有, 的话去掉
//regex为正则表达式
String s5 = s4.replaceAll("\d+",",").replaceAll("^,|,$", "");
System.out.println(s5); //hello,world,java,mysql
String s6 = "123456";
//判断s6字符串中是否全部由数字组成,即有1-n个数字组成
boolean matches = s6.matches("\d+");
System.out.println(matches); //true
String s7 = "0972-1243412";
boolean matches1 = s7.matches("0972-\d{7,8}");
System.out.println(matches1); //true
System.out.println("--------------------------------");
String str = "Hello|World|Java|Se";
String[] s8 = str.split("\|");
for(String s : s8){
System.out.println(s); //Hello World Java Se
}
String str2 = "Hello.World.Java.Se";
String[] s9 = str2.split("\.");
for(String s : s9){
System.out.println(s); //Hello World Java Se
}
}
}
3.String类与其他结构之间的转换:
package com.yan.commonClass;
import org.junit.Test;
import java.util.Arrays;
public class StringConvertTest {
@Test
public void test(){
String str1 = "123";
int num = Integer.parseInt(str1);
System.out.println(num); //123
String str2 = String.valueOf(num);
System.out.println(str2); //123
}
@Test
public void test1(){
String s1 = "abc123";
char[] chars = s1.toCharArray();
for(char c:chars){
System.out.println(c);
}
char[] chars1 = {'h', 'e', 'l', 'l', 'o'};
String s = new String(chars1);
System.out.println(s);
}
@Test
public void test2() throws Exception{
String s1 = "abc123天下";
byte[] bytes = s1.getBytes(); //使用默认的字符集进行转换
System.out.println(Arrays.toString(bytes)); //[97, 98, 99, 49, 50, 51, -27, -92, -87, -28, -72, -117]
byte[] gbks = s1.getBytes("gbk"); //使用gbk字符集进行编码
System.out.println(Arrays.toString(gbks)); //[97, 98, 99, 49, 50, 51, -52, -20, -49, -62]
String s = new String(bytes); //使用默认的字符集,进行解码
System.out.println(s); //abc123天下
String s2 = new String(gbks); //使用gbk,进行解码
System.out.println(s2); //abc123���� 原因:编码集和解码集不一致!
}
}
4.StringBuffer和StringBuilder的使用(以StringBuffer为例):
package com.yan.commonClass;
import org.junit.Test;
public class StringBufferBuilderTest {
@Test
// StringBuffer的常用方法
public void test(){
StringBuffer s1 = new StringBuffer("abc");
s1.append(1);
s1.append("12");
System.out.println(s1); //abc112
// s1.delete(2,4);
// s1.replace(2,4,"hello");
// s1.insert(2, false);
// s1.reverse();
String s2 = s1.substring(1, 3);
System.out.println(s1); //abc112
System.out.println(s1.length()); //6
System.out.println(s2); //bc
}
}



