Java中​​String​​类详解

1.语法

1.1Char数组和String之间的转换
package liu.shen.test;
public class Demo {
//若成员变量用在static修饰的方法中,则成员变量必须使用static修饰
public static void main(String args[]) {
Demo de = new Demo();
de.test3();
//System.out.println(str);
}
public void test1() {
System.out.println("Function :Char arry convert to String");
char arr[] = {'a','b','c'};
String str = new String(arr);
System.out.println(str);
}
public void test2() {
System.out.println("Function :String convert to char");
String str = "my name is LittleLawson!";
char array[] = str.toCharArray();
System.out.println(array);
}
}
1.2.新创建的String对象的内存位置:
public void test3() {
/*方式一:创建的String对象,它会在常量池中查找是否有"abc"这个对象,
如果有,直接指向常量池中的对象[此时不创建对象],
如果没有,在常量池中创建一个对象,然后指向它。
*/
String str1 ="abc";//常量池

/*方式二:它会在常量池中查找是否有"abc"这个对象,
如果有这个对象就不创建,
如果没有就创建这个对象,在堆内存中分配空间,然后将str指向
堆内存中的地址。
*/
String str = new String("abc");//堆中

String str2=new String("abc");
String str3 = str2;
String str4 = new String("abc");
System.out.println("使用==比较字符串,比较的是对象是否相同");
System.out.println(str == str1);//false
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str3 == str4);

//String 类对equals方法进行了重写,比较的不是对象是否相等,而是比较内容是否相同。
System.out.println(str3 == str4);
System.out.println("使用equals()方法进行比较字符串");
System.out.println(str.equals(str1));
}

执行以下代码:

public void test1(){
String s1 = new String("上海");
String s2 = new String("上海");
System.out.println(s1==s2);// false
}

运行结果如下:

​false​

为什么是false呢?因为使用new的时候,两者都是去常量池中寻找"上海",结果发现常量池中并没有“上海”,于是在堆内存中重新分配内存存储“上海”。所以​​s1!=s2​

执行以下代码:

public void test1(){
String s1 = "上"+"海";//编译器优化
String s2 = "上海";
System.out.println(s1==s2);// false
}

运行结果如下:

​true​

1.3.String类的操作
package liu.shen.test;
public class Demo {
public static void main(String args[]) {
Demo de = new Demo();
de.test1();
de.test2();
de.test3();
de.test4();
de.test5();
}
public void test1() {
System.out.println("----------test1------------");
String str1 = "刘shen";//刘,s,h,e,n均占一位
System.out.println(str1.length());//字符串的长度为5
}
public void test2() {
System.out.println("----------test2------------");
String str = "aaa.bbb.ccc.ddd";
String s[] = str.split("\\.");//这里为什么是"\\."?而不是"."?见下注:
for(String a: s) {
System.out.println(a);
}
}

public void test3() {
System.out.println("----------test3------------");
String str = "this is a test";
String temp[] = str.split("s");
//这种简单的字符分割,就是直接在字符处切割即可。

System.out.println("temp.length = "+temp.length);
for(String s: temp) {
System.out.println(s);
}
}
public void test4() {
System.out.println("----------test4------------");
System.out.println("\"");
System.out.println("\\");
System.out.println("\t<--this is tab");
}
public void test5() {
System.out.println("----------test5------------");
String str = " My name is LittleLawson,I'm very happy to help you! ";
str.trim();//去首尾空格
System.out.println("str = "+str);//并非是在原字符串str上操作
System.out.println("str.trim() = "+str.trim());
}
}
1.4.StringBuffer比String效率高的原因【在追加很多字符的情况下】。

  • 1)因为String的量是不变的,所以String每次追加都会新建一个对象。之前的对象都会抛弃,等待垃圾回收。
  • 2)但是StringBuffer是每次都是在原有的字符串上追加,所以速度很快。

* package liu.shen.test;
public class Demo {
public static void main(String args[]) {
Demo de = new Demo();
de.test2();
}
public void test1() {
long begin = System.currentTimeMillis();
int i ;
String str="";
for(i =0;i< 100000;i++) {
str +=i;
}
long end = System.currentTimeMillis();
long lastTime = end - begin;
System.out.println("lastTime = "+lastTime);//30902
}

public void test2() {
long begin = System.currentTimeMillis();
int i;
StringBuffer str = new StringBuffer("");//字符串为空
for(i = 0;i< 100000;i++) {
str.append(i);
}
long end = System.currentTimeMillis();
int lastTime = (int) (end - begin);
System.out.println(lastTime);//23
}
}
1.5.如何使用​​String[]​​数组?
import java.util.ArrayList;
import java.util.List;

public class TestString {

public static void main(String[] args) {

}

public void test1(){
String filePath1 = new String("asd");//get a instance of String
String filePath2 = "anhuiNormalUniversity";//directly assignment

System.out.println(filePath1);
System.out.println(filePath2);
}

public void test2(){
/*
1.对于String[],无法使用“追加”操作,只能通过下标进行更改
2.只有以下种方式新建一个String数组
*/
String [] str = {"22","fsd","-2","+5","24"};//
String[] str1 = new String[10];//new一个数组

/*
1.如果需要使用add等操作,可以使用List<String>的方式,如下:
*/
List<String> age = new ArrayList<String>();
age.add("22");
age.add("fsd");
age.add("-2");
age.add("+5");
age.add("24");
}
}

注释:


  • 1.为什么​​split()​​​中的​​regex​​​参数是​​\\.​​​而不是​​\.​​​或者 ​​.​​​呢?因为​​split(String regex,int limit)​​​方法中的参数​​regex​​​是一个正则表达式,但是在正则表达式中,因为​​.​​​是一个特殊字符,所以使用​​\.​​​来表示​​.​​​,但是如果在java代码中直接写​​\.​​​会出现语法错误,所以我们需要再次使用​​\​​​将符号​​\​​​转义,所以得到的最后结果就是:​​\\.​
  • 2.个人理解是:​​split(String regex,int limit)​​方法中的regex参数是以正则表达式存在,即使你传进去的参数并不是正则表达式,内部解析时,也会按照正则表达式去接卸。

2.方法简介

  • isEmpty()
/*
Returns true if, and only if,length() is 0.
当且仅当字符串的length=0才返回true。否则返回false。

@return {@code true} if {@link #length()} is {@code 0}, otherwise
{@code false}

@since 1.6
*/
public boolean isEmpty() {
return value.length == 0;
}

3.面试考点


  • java中所有字符串都是String的一个对象
  • 所有的字符串对象都是一个常量(一旦初始化,就不可以被改变)