黑马程序员_String类

------ android培训、java培训、期待与您交流! ----------


一、String类(字符串类)概述:

    1、是编程中常用的数据类型,它不是简单的基本数据类型,而是复合数据类型。
    2、它最大的特点是创建之后不能再修改和变动的字符串常量。
    3、不用import导入就可以使用,并且这个类不需要扩展,定义为final类(最终类)不能被其他类继承。
    4、String类实际是使用字符数组存储的(实际上源代码就是使用char类型的 )


二、String类的两种创建方式:

String s1 = new String("java01");
String s2 = "java01";

上面是创建String的两种方式,效果上是一样的,只是一般用第二种方式比较简单。


三、String类两种创建方式的区别:

    1、s1在内存中有两个对象(一个是new 一个是字符串对象在堆内存中,然后会存储到常量池中)

    2、s2在内存中只有一个对象(该字符对象存在字符串常量池中,会先查看常量池中有没有这个字符串常量,如果有就直接指向不用再创建了,如果没有常量池中会创建)
    3、s2是一个类类型变量,指向对象,"java01"是一个对象。字符串是一个特殊的对象也是一个常量,初始化后不能改变,被双引号里面的都是对象(存在常量池中)

String s1 = "java01";
s1 = "java02";
System.out.println(s2);

最后的结果是java02,但不是java01这个对象变化了,而是s1的指向变成了指向java02这个对象,java01这个对象在内存中还是存在的。


四、比较两个字符串是否相等(两种比较方式):

String s1 = new String("java01");
String s2 = new String("java01");
System.out.println(s1==s2);//结果是false,因为s1和s2都是用new关键字创建的对象,这是不属于同一个对象(内存地址值不一样),所以当然是不相等
System.out.println(s1.equals(s2));//结果为true,因为String类复写了Object类中的equals方法,定义了自己的比较方式,只要String的参数相同则为true否则为false。

==和equals这两种比较方式都是比较的对象的内存地址值,但是equals这个方法被String类复写了,定义了自己的比较方式而已

String s1 = "java01";
String s2 = new String("java01");
String s3 = "java01";
System.out.println(s1==s2);//flase
System.out.println(s1==s3);//结果为true,是因为s1已经创建了字符串"java01",s3就不会再创建该字符串了,这样可以节省空间,这代表着s1和s3指向同一个对象"java01"。


五、String类的使用:

1、获取字符串的长度(注意是方法,不是跟数组的属性一样的) 

    int length();

public static void getLength(){
     String s = "java01";
     int len = s.length();
     System.out.println(len);
}


2、根据位置,获取该位置的那一个字符(只能是单个字符)   

    char charAt(int index);

//根据指定位置获取对应的那个字符,只能是一个字符不能是字符串
public static void getChar(){
     String s1 = "java01";
     char ch = s1.charAt(3);
     System.out.println(ch);
    //s1.charAt(45);当访问到字符串中不存在的角标是会发生StringIndexOutOfBoundsException,即字符串角标越界异常
}

3、根据字符或字符串获取索引,即根据字符或字符串获取该字符或字符串在整个字符串中的位置,如果字符串中没有该字符或字符串会返回-1

    int indexOf(int ch):返回的是ch在字符串中第一次出现的位置

    int indexOf(int ch,int fromIndex):从fromIndex指定位置开始查找,获取ch在字符串中出现的位置

    int indexOf(String str):返回的是str在字符串中第一次出现的位置

    int indexOf(String str,int fromIndex):从fromIndex指定位置开始查找,获取str在字符串中出现的位置

public static void getIndexOf(){
    String s = "javascript";
    int x1 = s.indexOf('s');
    int x2 = s.indexOf('a',2);
    int x3 = s.indexOf("script");
    int x4 = s.indexOf("script",2);
    System.out.println("x1="+x1+",x2="+x2+",x3="+x3+",x4="+x4);
}


4、反向索引一个字符或字符串出现的位置 

    public int lastIndexOf(int ch) 从字符串的最后向前查找,指定的字符是否存在,如果存在则返回位置,如果不存在则返回-1

    public int lastIndexOf(int ch,int fromIndex) 从字符串的指定的末尾向前查找,指定的字符是否存在,如果存在则返回位置,如果不存在则返回-1

public static void getLastIndexOf() {
    String s = "javascript";
    int x = s.lastIndexOf('a');
    System.out.println("x="+x);
}


5、获取字符串中的一部分,即获取子串     

    String substring(begin);//从指定位置开始到结尾包含头    

    String substring(begin,end);//,指定开始和结尾 包含头不包含尾

public static void getSubstring(){
    String s1 = "javascript";
    String s2 = s1.substring(4);
    String s3 = s1.substring(0,5);
    System.out.println("s2="+s2+",s3="+s3);
}


六、字符串转换:

1、将字符数组转成字符串

    构造函数:

        String(char[])
        Stirng(char[],fffset,count):将字符数组中的一部分转换字符串

    静态方法:(直接用String类名调用,如:String s = String.copyValueOf())
        static String copyValueOf(char[]);
        static String copyValueOf(char[] ,int offset, int count);(offset表示起始位,count表示个数.如果超过了字符数组的长度,也发生字符串角标越界)
        static String valueOf(char[]);
        static String valueOf(char[] data, int offset, int count)

public static void CharsToString(){
    char[] arr ={'j','a','v','a','s','c','r','i','p','t'};
    //通过String类的构造函数将字符数组转成字符串(可以将字符数组的一部分转成字符串)
    String s1 = new String(arr);
    String s2 = new String(arr,2,7);
    System.out.println("s1="+s1+",s2="+s2);
    
  //通过String类中的静态方法将字符数组转成字符串(可以将字符数组的一部分转成字符串)
    String s3 = String.copyValueOf(arr);
    String s4 = String.copyValueOf(arr, 2, 7);
    System.out.println("s3="+s3+", s4="+s4);
}

2、将字符串转成字符数组  

    char[] toCharArray();

public static void StringToChar(){
    String s = "javascript";
    char[] arr = s.toCharArray();
    for(char arrs : arr){
        System.out.println(arrs);
    }
}

3、将字节数组转成字符串(只能用构造函数)

    String(byte[])
    Stirng(byte[],fffset,count):将字节数组中的一部分转

    Stirng(byte[],String charsetName)(通过使用指定的charset解码制定的byte数组,构造一个新的String)

String info = "小白是一个无节操,无干爹,无底线的三无少年";
        
        //把字符串转换成字节数组
        byte[] bytes = info.getBytes();
        for(int i = 0;i<bytes.length; i++){
            System.out.print(bytes[i]+",");
        }
        System.out.println();
        
        //把字节数组转换成字符串
        String s1 = new String(bytes);
        System.out.println("转换后的字符串为:"+s1);
        
        String s2 = new String(bytes,0,16);//结果是:小白是一个无节操,因为一个汉字是两个字节,如果是15的话最后一个汉字打印的是一个?  因为找不到
        System.out.println("s2="+s2);
        
        
        String s3 = new String(bytes,"gbk");//系统是gbk编码,如果这里用了utf-8会变成乱码
        System.out.println(s3);

4、将字符串转成字节数组(字符串和字节数组在转换过程中,是可以指定编码表的。)     

    byte[] getBytes();

public static void StringToBytes(){
    String s1 = "javascript";
    byte[] arr = s1.getBytes();
    for(byte arrs : arr){
        System.out.println((char)arrs);
    }
}

String info = "小白是一个无节操,无干爹,无底线的三无少年";
        
        //把字符串转换成字节数组
        byte[] bytes = info.getBytes();
        for(int i = 0;i<bytes.length; i++){
            System.out.print(bytes[i]+",");
        }

5、将基本的数据类型转成字符串

    static String valueOf(int)        

    static String valueOf(double)

    3+"";     String.valueOf(3);//这是一样的

 

6、将字符串转成大写或者小写          

    String toUpperCase();           

    String toLowerCase();

public static void ToUpper_Lower(){
    String s1 = "javascript";
    String s2 = s1.toUpperCase();//转成大写
    String s3 = s2.toLowerCase();//转成小写
    System.out.println("s2="+s2+",s3="+s3);    
}


七、字符串判断:

1、字符串中是否含某一个子串(不能判断是否包含某一个字符,只能是字符串)  

    boolean contains(String str);        //返回一个字符串是否存在,存在返回true 不存在返回false

     特殊之处:indexOf(str)可以索引str第一次出现位置,如果返回-1,表示该str不在字符串中存在  所以也可以用于对指定判断是否包含 该方法既可以判断又可以获取出现的位置
     只用于判断时用contains,既要判断又要获取位置用indexOf

public static void containsDemo() {
    String s = "javascript";
    boolean b = s.contains("java");
    System.out.println(b);
}

2、字符中是否有内容  

    boolean isEmpty();       //就是判断长度是否为0

public static void isEmptyDemo() {
    String s = " ";//空格也是一个字符
    boolean b = s.isEmpty();
    System.out.println(b);
}

3、字符串是否以指定的内容开头与字符是否是以指定内容结尾(接受的是字符串)

    boolean startsWith(str);

    boolean startsWith(str,int toffset);//从指定的位置开始判断是否以指定的内容开头

    boolean endsWith(str);

public static void startsWith_endsWith() {
    String s = "Array.java";
    boolean b1 = s.startsWith("Array");//开发中可以用于判断该文件名称是否是Array单词开头
    boolean b2 =s.endsWith(".java");//开发中可以用于判断该文件名的后缀是否是.java文件
    System.out.println("b1="+b1+",b2="+b2);        
}

4、判断字符串内容是否相同

    (复写了Object类中的equals方法,定义了自己的比较方式,比较字符串内容是否相同,相同为true,不相同为false)  boolean equals(str);

public static void equalsDemo() {
    String s1 = "javascript";
    String s2 = "javascript";
    String s3 = "html+CSS";
    boolean b1 = s1.equals(s2);
    boolean b2 = s1.equals(s3);
    System.out.println("b1="+b1+",b2="+b2);
}

判断内容是否相同,并忽略大小写    boolean equalsIgnoreCase();


5、对两个字符串进行自然顺序的比较(该方法能比较出谁大谁小,而equals只是比较两个对象是否相等)  

    int compareTo(string);

     对象之间的比较用的是compareTo方法,基本数据类型数据之间的比较用的是大于号,小于号,等于号这些运算符

public static void compareToDemo() {
    String s1 = "javascript";
    String s2 = "javascript";
    String s3 = "java";
    int b1 = s1.compareTo(s2);
    int b2 = s1.compareTo(s3);
    int b3 = s3.compareTo(s1);
    System.out.println("b1="+b1+",b2="+b2+",b3="+b3);
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章