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的一个对象
  • 所有的字符串对象都是一个常量(一旦初始化,就不可以被改变)