22天学习java基础笔记之day14

Day14 String StringBuffer StringBuilder 封装类

一、String类常见方法的使用

字符串数据都是一个对象

   字符串数据一旦初始化就不可以被改变了

   字符串对象都存储于常量池中,字符串常量池。

   String str1 = "abc";

   String str2 = "abc";

   String str3 = new String("abc");

      为什么str1==str2结果为true呢?

   先会在内存里创建str1以及其指向的内容"abc",当再次创建str2时,会在常量池里找是否有"abc",

   有就不会再开辟内存空间,str2直接指向已有的"abc",也就是str2和str1指向了同一个对象。

      为什么str1==str3结果为false呢?

   ==比较的地址值,而new是重新开辟的。

      为什么str1.equals(str3)结果为true呢?

   String类复写了Object类的equals方法,比较的是字符串中的内容是否相同。

1、判断

A:equals(Object obj)字符串类重写了Object的方法,用于比较字符串的值是否相等

equalsIgnoreCase(String anotherString)用于比较字符串的值是否相等.不区分大小写

B:contains(String s)判断一个字符串中是否包含另一个字符串

C:startsWith(String prefix)测试此字符串是否以指定的前缀开始。                                 startsWith(String prefix, int toffset)测试此字符串从指定索引开始的子字符串是否以指定前缀开始。

      endsWith(String suffix)测试此字符串是否以指定的后缀结束。

D:isEmpty()判断字符串是否为空

2、获取

A:int length()获取字符串的长度

B:char charAt(int index)获取指定位置的字符

                把一个字符串转换成一个字符数组

                String s = "HelloWorld";

                //char[] ch = s.toCharArray();

                char[] ch = new char[s.length()];

                for(int x=0; x<ch.length; x++){

                        ch[x] = s.charAt(x);

                }

C:获取指定的字符或者字符串在给定的字符串中第一次出现的索引

      int indexOf(int ch)获取指定字符在字符中第一次出现的索引

    int indexOf(int ch, int fromIndex)返回在此字符串中第一次出现指定字符处的索引,从                                                            指定的索引开始搜索。

        int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。

        int indexOf(String str, int fromIndex)返回指定子字符串在此字符串中第一次出现处的                                                                 索引,从指定的索引开始。

D:获取指定的字符或者字符串在给定的字符串中最后一次出现的索引

        int lastIndexOf(int ch)返回指定字符在此字符串中最后一次出现处的索引。

        int lastIndexOf(int ch, int fromIndex)返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。

        int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引。

        int lastIndexOf(String str, int fromIndex)返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。

E:获取子串

        String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。

       String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个                                                                                 子字符串。 <含头不含尾>

3、转换

A:字符串和字节数组的转换

        从String到byte[]------>byte[] getBytes()

        从byte[]到String-------->new String(byte[] by)构造方法

B:字符串和字符数组的转换

        从String到char[]

                                ***char[] toCharArray()

                                ***length(),charAt(int index)结合

        从char[]到String

                                ***new String(char[] ch)

                                ***static copyValueOf(char[] data)

                                ***static String valueOf(char[] data, int offset, int count)

C:static String valueOf(xxx y) xxx基本数据类型

                举例:int x = 4;

                基本数据类型转换成字符串:String.valueOf(x);

D:static String valueOf(Object obj) 把对象转成字符串

                举例:

                        Demo d = new Demo();

                        sop(d);

                        sop(d.toString());

                        sop(String.valueOf(d));

E:String toUpperCase() 所有字符都转换为大写

String toLowerCase() 所有字符都转换为小写

F:字符串的连接  

                  字符串连接符:+

                  String concat(String str)  将指定字符串连接到此字符串的结尾。

                  String s = "aaa"          s.concat("bbb").concat("ccc").concat("ddd");

4、替换

String replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。

String replace(String oldString, String newString)返回一个新的字符串,它是通过用 newString 替换此字符串中出现的所有 oldString 得到的。

5、切割

        String[] split(String regex)根据给定的字符串把字符串分割.

 

                QQ加好友:     16-22

6、去除字符串的空格

        trim() 去除字符串的前后空格

7、按字典顺序比较两个字符串。

int compareTo(String anotherString)

               

二、字符串的练习

  1. 统计字符串中大写字母,小写字母,数字的个数

public class StringDemo5 {

    /**

     * @param args

     */

    public static void main(String[] args) {

        String str = "sime19374,d00384oJMSIWLksiMd";

        int upper_count = getCount(str)[0];

        int number_count = getCount(str)[1];

        int lower_count = getCount(str)[2];

        System.out.println("大写字母个数:"+upper_count+"   数字个数:"+number_count+" 小写字母个数:"+lower_count);

    }

    public static int[] getCount(String str) {

        int upper_count = 0;

        int lower_count = 0;

        int number_count = 0;

        int[] arr = new int[3];

        char[] chs = str.toCharArray();

        for (char c : chs) {

            if(c>64&&c<97){

                lower_count++;

            }else if(c>96&&c<123){

                upper_count++;

            }else if(c>47&&c<58){

                number_count++;

            }

        }

        arr[0]=lower_count;

        arr[1]=upper_count;

        arr[2]=number_count;

        return arr;

    }

}

  1. 把字符串数组自然排序

public class StringDemo3 {

    /**

     * @param args

     */

    public static void main(String[] args) {

        String[] str = {"cba","nba","qq","zz","abc","sb","nba"};

        sort(str);

    }

    public static void sort(String[] str){

        for (int i = 0; i < str.length-1; i++) {

            for (int j = i+1; j < str.length; j++) {

                if (str[i].compareTo(str[j])>0) {

                    swap(str,i,j);

                }

            }

        }

        printArray(str);

    }

    //两个数组元素位置互换

    public static void swap(String[] str, int i, int j) {

        String temp = str[i];

        str[i]= str[j];

        str[j]= temp;

    }

    //打印数组

    public static void printArray(String[] str){

        StringBuilder sb = new StringBuilder();

        sb.append("{"");

        for (int i = 0; i < str.length; i++) {

            if (i!=str.length-1) {

                sb.append(str[i]+"","");

            }else{

                sb.append(str[i]+""}");            

            }

        }

        System.out.println(sb);

    }

}

  1. 查找子串在大串出现的次数

public static void main(String[] args) {

        String str = "nbamiknbaxxykinsajwrenbamsonba";

        String s = "nba";

        int count = getCount(str,s);

        System.out.println(count);

    }

    public static int getCount(String str,String s){

        int count = 0;

        int index = 0;

        while((index = str.indexOf(s, index))!=-1) {

            index = index + s.length();

            count++;

        }

        return count;

    }

  1. 查找两个字符串中最大的子串(正三角)

public class StringDemo4 {

    /**

     * @param args

     */

    public static void main(String[] args) {

        String s1 = "kjiwmiancctv8mihw";

        String s2 = "wminicctv8sime";

        String str = getMaxSubstring(s1, s2);

        System.out.println(str);

    }

    //求两个字符串的最大相同子串!

    public static String getMaxSubstring(String s1,String s2){

        String max;

        String min;

        max = s1.length()>s2.length()?s1:s2;

        min = max.length()>s1.length()?s1:s2;

        for (int i = 0; i < max.length(); i++) {

            for (int j = 0,z =min.length()-i; z!=min.length()+1; j++,z++) {

                String temp = min.substring(j, z);

                if(max.contains(temp)){

                    return temp;

                }

            }

        }

        return null;

    }

}

  1. 对字符串中的数据进行排序

public class StringDemo6 {

    /**

     * @param args

     */

    public static void main(String[] args) {

        String str = "34 -7 15 39 67 25";

        String s = sort(str);

        System.out.println(s);

    }

    public static String sort(String str){

        String[] ss = str.split(" ");

        int[] arr = new int[ss.length];

        for (int i = 0; i < ss.length; i++) {

            arr[i]=Integer.parseInt(ss[i]);

        }

        for (int i = 0; i < arr.length-1; i++) {

            for (int j = i+1; j < arr.length; j++) {

                if(arr[i]>(arr[j])){

                    swap(arr,i,j);

                }

            }

        }

        StringBuilder sb = new StringBuilder();

        for (int i : arr) {

            sb.append(i).append(" ");

        }

        return sb.toString();

    }

    private static void swap(int[] arr, int i, int j) {

        int temp = arr[i];

        arr[i]= arr[j];

        arr[j]= temp;

    }

 

}

三、StringBuffer&StringBuilder

1、字符串String是定长的,StringBuffer是变长的.

        String s = "Hello";

        s = s + "World"; //"HelloWorld"

 

        StringBuffer buffer = new StringBuffer("Hello");

        buffer.append("World"); 

2append(元素)追加

        insert(索引,元素)

        reverse();反转

        capacity();容量 它可以存储的元素个数

        length();长度 它实际存储的元素个数

        String substring(索引,);

        把StringBuffer中的一部分复制,然后把复制的这部分内容赋给了一个String.

3StringBuffer,StringBuilder区别

        StringBuffer 线程安全的,效率低(同步)

        StringBuilder 线程不安全的,效率高(不同步)

四、封装类

基本数据类型和引用类型之间能转换吗?不能

        int x = 20;

        String s = x;

"10-20" 我们可以使用split方法进行切割,切割后生成了一个字符串数组 String[] strArray = {"10","20"}

        int startAge = strArray[0];

        int endAge = strArray[1];

为了使我们的基本数据类型和字符串能够相互转换(字符串必须是能够转换的):

我们就对基本数据类型进行了封装,使每一个基本数据类型都有一个对应的封装类,这个时候,我们就可以使用封装类中的方法进行转换.

        byte                 Byte

        Short                Short

        int                   Integer

        long                 Long

        float                Float

        double             Double

        char                 Character

        boolean           Boolean

1、基本类型到封装类的转换

JDK1.5以后的新特性  

Integer i = new Integer(5)

        Integer ii = 5; //装箱 Integer i = new Integer(int)

        Integer iii = ii + 20; //先把ii拆箱变成一个int类型的数据,然后在和20做加法,

                                   //最后在把结果装箱成一个Integer类型的数据.

        ii.intValue();

2、基本类型到字符串的转换

        String toString(); Integer类型

        static String toString(int x);

3、字符串到基本类型的转换

        static int parseInt(String s)

                int startAge = Integer.parseInt(strArray[0]);

                int endAge = Integer.parseInt(strArray[1]);

        static Integer valueOf(String s)

他们都实现了Comparable接口,具备了compareTo方法,用于比较,结果只有整数、零和负数。

基本数据类型用比较运算符进行比较,引用数据类型用compareTo进行比较。

原文地址:https://www.cnblogs.com/aohongzhu/p/12938751.html