1.String类的两种实例化方式
String str = "Hello,CSDN";
System.out.println(str);
String str = new String("Hello,CSDN");
System.out.println(str);
String str1 = "hello";
String str2 = "hello";
String str3 = "hello"; //三个str都指向同一块内存空间
原因:在JVM底层自动维护一个字符串对象池(对象数组)
如果采用直接赋值的方式进行String类对象的实例化操作,此对象将自动保存到对象池中,如果下次继续采用直接赋值的模式声明String类对象,先去对象池中找是否有指定内容,如果有,直接引用,如果没有,开辟新的空间而后将其保存到对象池中以供下次引用。
String str1 = new String("CSDN"); //产生两块空间,一块堆内存为垃圾空间,并且不会保存到对象池中。
字符串的手工入池操作
String str1 = new String("CSDN").intern();
2.字符串的相等比较
观察如下关于==比较的代码,可以看到,==在进行数值比较时,得到的结果是true,但是在进行对象的比较时,比较的是另个对象所保存的内存地址而非内容,所以得到的结果为false
public class Test {
public static void main(String[] args) {
// 数值的==比较
int a=1;
int b=1;
System.out.println(a==b); //true
// String类对象的==比较
String str1 = "Hello,CSDN";
String str2 = new String("Hello,CSDN");
System.out.println(str1==str2); //false
}
}
那么如何对两个字符串进行内容上的比较呢,我们采用String类提供的equals方法
public class Test {
public static void main(String[] args) {
// String类对象的equals比较
String str1 = "Hello,CSDN";
String str2 = new String("Hello,CSDN");
System.out.println(str1.equals(str2)); //true
}
}
a."==" 进行数值比较比较的是两个数的值,进行字符串比较比较的是两个字符串对象的内存地址
b."equals()"可以对字符串内容进行比较
3.字符串常量是String类的匿名对象
字符串常量:"hello"就是一个String类中没有名字的对象。
任何的字符串常量都是String类的匿名对象,所以该对象永远不会为null
public class Test {
public static void main(String[] args) {
String str = null;
System.out.println(str.equals("hello")); //NullPointerException
System.out.println("hello".equals(str)); //false
}
}
tips:在进行指定内容比较时,将指定字符串常量写在前面,以免发生空指针异常。
4.字符串常量不可变更
public class Test {
public static void main(String[] args) {
String str = "hello"; //1.创建一块空间保存"hello"; 2.str对象指向"hello"所在的空间
str += " CSDN"; //1.创建一块空间保存"CSDN"; 2.进行+=操作创建一块空间保存"hello CSDN"; 3.str对象指向"hello CSDN"所在的空间
str += " !";//1.创建一块空间保存"!"; 2.进行+=操作创建一块空间保存"hello CSDN !"; 3.str对象指向"hello CSDN !"所在的空间
System.out.println(str);
}
}
可以看到,以上操作改变的只是字符串对象的引用,字符串并不会发生变化,而且还会产生大量的垃圾空间。
5.字符(char[]) 与字符串(String)
5.1字符转字符串
char[] data = {'1','个','a','p','p','l','e'};
String str = new String(data); //str =1个apple;
5.2字符串转字符
String str = "1个apple";
char[] data = str.toCharArray();
5.3获取字符串某个位置的字符
String str = "1个apple";
char index_value = str.charAt(1); //index_value = 个;
5.4从键盘接受一个字符串,判断这个字符串是否由数字组成
import java.util.Scanner;
public class Test {
public void judgeIsNumber(String str){
char[] data = str.toCharArray();
int i =0;
for( i=0;i'9')){
System.out.println("这不是一个数字");
break;
}
}
if(i==data.length){
System.out.println("这是一个数字"+str);
}
}
public static void main(String[] args) {
System.out.println("请输入......");
Scanner scanner = new Scanner(System.in );
String str = scanner.next();
new Test().judgeIsNumber(str);
}
}
6.字节(byte[])与字符串(String)
6.1字节转字符串
byte[] data = {'a',' ','i','s',' ','b'};
String str = new String(data);
6.2字符串转字节
String str = "a is b";
byte[] data = str.getBytes();
7.字符串比较
比较两个字符串第一个字符,谁大则哪个字符串大,如果第一个相等,比较第二个,以此类推。如果前面N个都相等,那么谁长谁就大。
7.1不区分大小写的相等比较
String str1= "Hello";
String str2= "hello";
System.out.println(str1.equals(str2)); //区分大小写:false
System.out.println(str1.equalsIgnoreCase(str2)); //不区分大小写:true
7.2比较两个字符串的大小关系
String str1= "Hello";
String str2= "hello";
String str3= "hello";
System.out.println(str1.compareTo(str2));//-32 <0,本字符串小于目标字符串
System.out.println(str2.compareTo(str1));//32 >0,本字符串大于目标字符串
System.out.println(str2.compareTo(str3));//0 =0本字符串等于目标字符串
8.字符串查找
String str1= "hello,CSDN";
String str2= "hello";
System.out.println(str1.contains(str2)); //ture 判断指定字符串是否存在
System.out.println(str1.startsWith(str2)); //true 判断是否以指定字符串开头
System.out.println(str1.endsWith(str2)); //false 判断是否以指定字符串结尾
9.字符串替换
String str1= "hello,CSDN";
String str2= "Bye bye";
System.out.println(str1.replaceAll("hello",str2)); //Bye bye,CSDN
System.out.println(str1.replaceAll("l","e")); //heeeo,CSDN
10.字符串拆分
//按照","拆分字符串str
String str1= "hello,CSDN";
String[] result = str1.split(",");
for(String temp :result){
System.out.print(temp+"_______"); //hello_______CSDN_______
}
}
tips:按照特殊字符拆分需要用到转义字符"\\"
11.字符串截取
String str1 = "hello CSDN";
System.out.println(str1.substring(0,1)); //h -从下标为0的字符开始截取一个字符
12.去除字符串的左右空格,并且保留中间空格
String str1 = " hello CSDN ";
System.out.println(str1.trim());
13.字符串转大小写
String str1 = " hello CSDN ";
System.out.println(str1.toUpperCase()); //变大写 HELLO CSDN
System.out.println(str1.toLowerCase()); //变小写 hello csdn
14.判断字符串是否为空字符串
String str1 = "";
String str2 = " ";
String str3 = null;
System.out.println(str1.isEmpty()); //true
System.out.println(str2.isEmpty()); //false
System.out.println(str3.isEmpty()); //NullPointerException isEmpty()不判断null
1.字符串拼接方法(append(),能拼接各种类型)
StringBuffer sb1 = new StringBuffer("12");
System.out.println(sb1.append(3)); //123
System.out.println(sb1.append("三")); //123三
System.out.println(sb1.append("3")); //123三3
2.StringBuffer和String类的相互转换
2.1 String -> StringBuffer
String str = "hello";
StringBuffer sb = new StringBuffer(str);
2.2 StringBuffer ->String
StringBuffer sb = new StringBuffer("hello");
String str = sb.toString();
3.字符串反转
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.reverse()); //olleh
4.删除指定范围内的数据
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.delete(0,3)); //lo -从下标为0的元素开始,删除三个字符
5.向指定位置插入数据
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.insert(0,"CSDN ")); //CSDN hello -从下标为0的字符开始,插入CSDN ;
1.String的内容不可变,但是StringBuffer和StringBuilder的内容可变
2.StringBuffer(JDK1.0),采用同步处理,线程安全,效率较低
3.StringBuilder(JDK1.5),采用异步处理,线程不安全,效率较高
4.当在进行String对象"+"操作时,编译时会将String类变为StringBuilder进行append()处理