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