String及其他

   String

   以下例开始讲解String

public class StringDemo {

    public static void main(String[] args) {
//      String s = new String();
//      String s1 = "";
        
        String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象
                          //字符串最大的特点:一旦被初始化就不可以被改变。
        String s2 = new String("abc");
        //面试题:s1和s2有什么区别//s1在内存中有一个对象,s2在内存中有两个对象
        
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));//String类复写了Object类中的equals(),
                                          //该方法用于判断字符串是否相同
//      s1 = "kk";
//      System.out.println(s1);
        
    }

}

   String类是用于描述字符串事物的。那么它就提供了多个方法对字符串进行操作。

   常见的操作有哪些?

   1、获取

  1.1、字符串中包含的字符数,也就是字符串的长度

    int length();----获取长度

  1.2、根据位置获取位置上某个字符

    char charAt(int index);

  1.3、根据字符获取该字符在字符串中的位置

    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在字符串中出现的位置

    int lastIndexOf(int ch);---反向索引一个字符出现的位置

   2、判断

  2.1、字符串中是否包含某一个子串

    boolean contains(str);

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

    if(str.indexOf("aa") != -1)

  2.2、字符串是否有内容

    boolean isEmpty();----原理就是判断长度是否为0

  2.3、字符串是否是以指定内容开头

    boolean startWith(str);

  2.4、字符串是否是以指定内容结尾

    boolean endWith(str);

  2.5、判断字符串的内容是否相同,复写了Object类中的equals()

    boolean equals(str);

  2.6、判断内容是否相同,并忽略大小写

    boolean equalsIgnoreCase(str);

   3、转换

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

    构造函数:String(char[])

           String(char[], offset, count);将字符数组中的一部分转成字符串 ,count是个数

    静态方法:static String copyValueOf(char[]);

           static String copyValueOf(char[] data, int offset, int count);

           static String valueOf(char[]);

  3.2、将字符串转成字符数组(**)

    char[] toCharArray();

  3.3、将字节数组转成字符串

    String(byte[])

    String(byte[], offset, count);将字节数组中的一部分转成字符串

  3.4、将字符串转成字节数组

    byte[] getBytes();

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

    static String valueOf(int);

    static String valueOf(double);

    //3+"";//String.valueOf(3);  int--->String

    特殊:字符串和字节数组在转换过程中,是可以指定编码表的

   4、替换

  String replace(oldchar, newchar);

   5、切割

  String[] split(regex);

   6、子串。获取字符串中的一部分

  String substring(begin);

  String substring(begin, end);

   7、转换,去除空格,比较

  7.1、将字符串转成大写或小写

    String toUpperCase();

    String toLowerCase();

  7.2、将两个字符串两端的多个空格去除

    String trim();

  7.3、对两个字符串进行自然顺序的比较

    int compareTo(String);

   举例说明以上方法:

public class StringMethodDemo {
    
    public static void method_7() {
        String s = "    Hello Java   ";
        sop(s.toUpperCase());
        sop(s.toLowerCase());
        sop(s.trim());
        
        String s1 = "a1c";
        String s2 = "aaa";
        
        sop(s1.compareTo(s2));
        
    }
    
    public static void method_sub() {
        String s = "abcdef";
        sop(s.substring(2));//从指定位置开始到结尾,如果角标不存在,会出现字符串角标越界异常
        sop(s.substring(2, 4));//包含头,不包含尾。s.substring(0, s.length());
    }
    
    public static void method_split() {
        String s = "zhangsan,lisi,wangwu";
        
        String[] arr = s.split(",");
        for(int x = 0; x < arr.length; x++) {
            sop(arr[x]);
        }
    }
    
    public static void method_replace() {
        String s = "hello java";
        
//        String s1 = s.replace('q', 'n');//如果要替换的字符不存在,返回的还是原串
        
        String s1 = s.replace("java", "world");
        sop("s="+s);
        sop("s1="+s1);
        
        
    }
    
    public static void method_trans() {
        char[] arr = {'a', 'b', 'c', 'd', 'e', 'f'};
        String s = new String(arr, 1, 3);
        sop("s="+s);
        
        String s1 = "zxcvbnm";
        char[] chs = s1.toCharArray();
        
        for(int x = 0; x < chs.length; x++) {
            sop("ch="+chs[x]);
        }
    }
    
    public static void method_is() {
        String str = "ArrayDemo.java";
        //判断文件名称是否是以Array单词开头
        sop(str.startsWith("Array"));
        //判断文件名称是否是.java文件
        sop(str.endsWith(".java"));
        //判断文件名称是否包含Demo
        sop(str.contains("Demo"));
        
    }
    
    public static void method_get() {
        String str = "abcdeakpf";
        
        //长度
        sop(str.length());
        
        //根据索引获取字符
        sop(str.charAt(4));//当访问到字符串中不存在的角标时,会发生StringIndexOutOfBoundsException。
        //根据字符获取索引
        sop(str.indexOf('m', 3));//如果没有找到返回-1
        
        //反向索引一个字符出现的位置
        sop(str.lastIndexOf('a'));
        
    }
    public static void main(String[] args) {
        /*
        String s1 = "abc";
        String s2 = new String("abc");
        String s3 = "abc";
        
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);
        */
//      method_get();
//      method_is();
//      method_trans();
//      method_replace();
//      method_split();
//      method_sub();
        method_7();
        
    }
    
    public static void sop(Object obj) {
        System.out.println(obj);
    }

}

   练习1、模拟一个trim()方法,去除字符串两端的空格。

   示例代码如下:

/*
1、模拟一个trim()方法,去除字符串两端的空格。

思路:
    1、判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。结尾处判断空格也是如此
    2、当开始和结尾都判断到不是空格时,就是要获取的字符串
 */

public class StringTest {
    
    public static void sop(String str) {
        System.out.println(str);
    }
    
    public static String myTrim(String str) {
        
        int start = 0, end = str.length()-1;
        while(start <= end && str.charAt(start) == ' ')
            start++;
        while(start <= end && str.charAt(end) == ' ')
            end--;
        return str.substring(start, end+1);
        
    }
    public static void main(String[] args) {
        String s = "            ab cd            ";
        sop("("+s+")");
        s = myTrim(s);
        sop("("+s+")");
    }

}

   练习2、将一个字符串进行反转。将字符串中指定的部分进行反转,"abcdefg"--->"abfedcg"

   示例代码如下:

public class StringTest1 {
    
    public static void sop(String str) {
        System.out.println(str);
    }
    
    public static String reverseString(String s, int start, int end) {
        
        char[] chs = s.toCharArray();
        
        reverse(chs, start, end);
        
        return new String(chs);
    }
    //将字符串反转
    public static String reverseString(String s) {
        /*
        char[] chs = s.toCharArray();
        
        reverse(chs);
        
        return new String(chs);
        */
        return reverseString(s, 0, s.length());
    }
    private static void reverse(char[] arr) {
        for(int start = 0, end = arr.length - 1; start < end; start++, end--) {
            swap(arr, start, end);
        }
    }
    private static void reverse(char[] arr, int x, int y) {
        for(int start = x, end = y-1; start < end; start++, end--) {
            swap(arr, start, end);
        }
    }
    private static void swap(char[] arr, int x, int y) {
        char temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
    
    public static void main(String[] args) {
        String s = "ab cd   ";
        sop("("+s+")");
        sop("("+reverseString(s)+")");
        sop("("+reverseString(s, 0, 3)+")");
    }

}

   练习3、获取一个字符串在另一个字符串中出现的次数。"abkkcdkkefkkskk"

   示例代码如下:

/*
3、获取一个字符串在另一个字符串中出现的次数。"abkkcdkkefkkskk"

思路:
    1、定义一个计数器
    2、获取kk第一次出现的位置
    3、从第一次出现的位置后剩余的字符串中继续获取kk出现的位置,每获取一次就计数一次
    4、当获取不到时,计数完成

 */
public class StringTest2 {
    
    public static void sop(String str) {
        System.out.println(str);
    }
    
    public static int getSubCount(String str, String key) {
        int count = 0;
        int index = 0;
        
        while((index = str.indexOf(key)) != -1 ) {
            sop("str = " + str);
            str = str.substring(index+key.length());
            
            count++;
        }
        return count;
    }
    /*
     * 方式二
     */
    public static int getSubCount_1(String str, String key) {
        int count = 0;
        int index = 0;
        
        while((index = str.indexOf(key, index)) != -1) {
            sop("index="+index);
            index = index + key.length();
            count++;
        }
        return count;
    }
    public static void main(String[] args) {
        String str = "kkabkkcdkkefkks";
        sop("count======"+str.split("kk").length);//不建议使用
        sop("count="+getSubCount_1(str, "kk"));
    }
}

   练习4、获取两个字符串中最大相同子串。

   示例代码如下:

/*
4、获取两个字符串中最大相同子串。第一个动作,将短的那个串进行长度一次递减的子串打印。
  "abcwerthelloyuiodef"
  "cvhellobnm"
    思路:
    1、将短的那个子串按照长度递减的方式获取到
    2、将每获取到的子串去长串中判断是否包含,如果包含,已经找到
 */
public class StringTest3 {
    
    public static void sop(String str) {
        System.out.println(str);
    }
    
    public static String getMaxSubString(String s1, String s2) {
        String max = "", min = "";
        max = (s1.length() > s2.length())?s1:s2;
        min = (max == s1)?s2:s1;
//      sop("max="+max+"....min="+min);
        for(int x = 0; x < min.length(); x++) {
            for(int y =0, z = min.length() - x; z != s2.length()+1; y++, z++) {
                String temp = min.substring(y, z);
//              sop(temp);
                if(max.contains(temp)) {
                    return temp;
                }
            }
        }
        return "";
    }
    public static void main(String[] args) {
        String s1 = "abcwerthelloyuiodef";
        String s2 = "cvhellobnm";
        sop(getMaxSubString(s1, s2));
    }

}

 

   StringBuffer

   StringBuffer是字符串缓冲区,是一个容器。

   特点:

  1. 长度可变化
  2. 可以直接操作多个数据类型
  3. 最终会通过toString()变成字符串

   C(create)U(update)R(read)D(delete)

  1、存储

    StringBuffer append();---将指定的数据作为参数添加到已有数据的结尾处

    StringBuffer insert(index, data);---可以将数据插入到指定index位置

  2、删除

    StringBuffer delete(start, end);---删除缓冲区中的数据,包含start,不包含end

    StringBuffer deleteCharAt(index);---删除指定位置的字符

  3、获取

    char charAt(int index);

    int indexOf(String str);

    int lastIndexOf(String str);

    int length();

    String substring(int start, int end);

  4、修改

    StringBuffer replace(start, end, string);

    void setCharAt(int index, char ch);

  5、反转

    StringBuffer reverse();

  6、将缓冲区中的指定数据存储到指定字符数组中

    void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);

   以下示例说明StringBuffer 

public class StringBufferDemo {

    public static void main(String[] args) {
        
//      method_delete();
//      method_update();
        
//      StringBuffer sb = new StringBuffer("abcdef");
        StringBuilder sb = new StringBuilder("abcdef");
        char[] chs = new char[6];
        
        sb.getChars(1, 4, chs, 1);
        
        for(int x = 0; x < chs.length; x++) {
            sop("chs["+x+"]="+chs[x]+";");
        }
    }
    
    public static void method_add() {
        StringBuffer sb = new StringBuffer();
        sb.append("abc").append(true).append(34);//方法调用链
        sb.insert(1, "qq");
        sop(sb.toString());//abctrue34
        
//      StringBuffer sb1 = sb.append(34); 
//      sop("(sb==sb1):"+(sb==sb1));//true
//      sop(sb.toString());
//      sop(sb1.toString());
    }
    public static void method_delete() {
        StringBuffer sb = new StringBuffer("abcde");
//      sb.delete(1, 3);
        //清空缓冲区
//      sb = new StringBuffer();
//      sb.delete(0, sb.length());
        
//      sb.delete(2, 3);
        sb.deleteCharAt(2);
        sop(sb.toString());
    }
    
    public static void method_update() {
        StringBuffer sb = new StringBuffer("abcde");
//      sb.replace(1, 4, "java");
        sb.setCharAt(2, 'k');
        sop(sb.toString());
    }
    
    public static void sop(String str) {
        System.out.println(str);
    }

}

   

   StringBuilder

   JDK1.5版本之后,出现了StringBuilder。

   StringBuffer与StringBuilder的区别:

  1. StringBuffer是线程同步的
  2. StringBuilder是线程不同步的

   将StringBuilder的实例用于多个线程时是不安全的。如果需要这样的同步,则建议使用StringBuffer。

   注意:以后开发,建议使用StringBuilder。

   升级三个因素:

  1. 提高效率
  2. 简化书写
  3. 提高安全

 

   基本数据类型对象包装类

byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character

   基本数据类型包装类的最常见作用:就是用于基本数据类型和字符串类型之间做转换。

   基本数据类型转成字符串:

  基本数据类型+"";

  专业做法:基本数据类型的包装类.toString(基本数据类型值)

  如:Integer.toString(34);//将整数34变成字符串"34";

   字符串转成基本数据类型:

  应用:文本框获取的数据都是字符串

  xxx a = Xxx.parseXxx(String);

  例如:

  int a = Integer.parseInt("123");

  double b = Double.parseDouble("12.23");

  boolean b = Boolean.parseBoolean("true");

  

  Integer i = new Integer("123");

  int num = i.intValue();

   十进制转成其他进制

  toBinaryString();

  toHexString();

  toOctalString();

   其他进制转成十进制

  parseInt(String, radix);

   示例代码:

public class IntegerDemo {

    public static void sop(String str) {
        System.out.println(str);
    }
    public static void main(String[] args) {
        //整数类型的最大值
//      sop("int max : "+Integer.MAX_VALUE);
        //将一个字符串转成整数
//      int num = Integer.parseInt("123");//NumberFormatException,必须传入数字格式的字符串。
//      long x = Long.parseLong("123");
//      sop("num="+(num+4));
        
//      sop(Integer.toBinaryString(6));
//      sop(Integer.toBinaryString(-6));
//      sop(Integer.toHexString(60));
        
        int x = Integer.parseInt("3c", 16);
        sop("x="+x);
    }
    
}

   JDK1.5版本以后出现的新特性——装箱与拆箱

   示例代码:

public class IntegerDemo1 {
    public static void sop(String str) {
        System.out.println(str);
    }
    public static void method() {
        Integer x = new Integer("123");
        
        Integer y = new Integer(123);
        
        sop("x==y:"+(x==y));
        sop("x.equals(y):"+x.equals(y));
    }
    public static void main(String[] args) {
//      Integer x = new Integer(4);
        
        Integer x = 4;//自动装箱   === new Integer(4);  Integer x = null;
        
        
        x = x /*x.intValue()*/ + 2;//x+2:x进行了自动拆箱,变成了int类型,和2进行加法运算
                                   //再将和进行装箱赋给x
        
        Integer m = 128;
        Integer n = 128;
        sop("m==n:"+(m==n));//false
        
        Integer a = 127;
        Integer b = 127;
        sop("a==b:"+(a==b));//结果为true。因为a和b指向了同一个Integer对象
                            //因为当数值在byte范围内时,对于新特性,如果该数值已经存在则不会再开辟新的空间
        
    }

}

 

 

 

posted @ 2016-03-01 09:11  叶十一少  阅读(245)  评论(0编辑  收藏  举报