Java中的String类、StringBuff和StringBuilderer

String类

1.String类的两种实例化方式

  • 直接赋值
 String str = "Hello,CSDN";
 System.out.println(str);
  • 构造方法(String本身是一个类,类中一定存在构造方法)
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
    }
}
  • String类的equals() 和 == 的区别

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

 

StringBuffer

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()处理

 

 

 

 

 

 

你可能感兴趣的:(java语言)