常用类(续)

91 阅读9分钟

常用类(续)

1、字符串的其他方法

1、字符串长度length()

int length()

// 判断长度
 @Test
 public void test1(){
String str = "阁下比我的两位故友阁下稍有逊色";
​
  System.out.println(str.length()); // 15
  }

2、判断字符串是否是空的

boolean isEmpty()

  // 字符串不为空
@Test
public void test2(){
 String str = "阁下比我的两位故友阁下稍有逊色";
​
 boolean b = str.isEmpty();
 System.out.println(b); // false
 }
// 字符串为空
 @Test
 public void test3(){
   String str = "";
  boolean b = str.isEmpty();
  System.out.println(b); // ture
 }

3、比较两个字符串是否相等

boolean equals(Object obj)

/*
严格区分大小写
*/
@Test
public void test4(){
 String str1="abcd";
 String str2="ABCD" ;
 System.out.println(str1.equals(str2)); // false
 System.out.println(str1==str2); // false
 String str3="abcd";
 String str4="abcd" ;
 System.out.println(str3.equals(str4)); // ture
 System.out.println(str3==str4); // ture
 }

boolean equalsIgnoreCase(String obj)

/*
不区分大小写
*/
@Test
 public void test5(){
  String str1="abcd";
  String str2="ABCD" ;
  System.out.println(str1.equalsIgnoreCase(str2)); // ture
  System.out.println(str1==str2); // false
  String str3="abcd";
  String str4="abcd" ;
  System.out.println(str3.equalsIgnoreCase(str4)); // ture
  System.out.println(str3==str4); // ture
 }

4、比较两个字符串的大小

int compareTo(String str)

int compareToIgnoreCase(String str)

 @Test
 public void test6(){
  String str1="abcd";
  String str2="ABCD" ;
  // 区分大小写
  System.out.println(str1.compareTo(str2)); // 32
  // 不区分大小写
  System.out.println(str1.compareToIgnoreCase(str2));// 0
  }

5、字符串拼接

String concat(String str)

 @Test
 public void test7() {
  String str1 = "abcd";
  String str2 = "ABCD";
  String str = str1.concat(str2);
  System.out.println(str); //abcdABCD
 }

6、把字符串存储到常量池

String intern()

@Test
public void test8(){
  String s1 = new String("hello");// "hello"是一个字符串对象,然后又new了一个字符串对象
                                         //"hello"已经在常量池中,new的不在常量池
  String s2 = s1.intern(); //把new处理的"hello"放到常量池中,但是先检查了一下,常量池中已经有一个"hello",新的这个没有放进去
                           //intern()得到的字符串地址是 原来"hello"的字符串地址,不是新new那个
 System.out.println(s1==s2); //false
 /*
  JDK8:false
  JDK6:false
  */
​
 }
 @Test
 public void test9(){
  String s1 = "he".concat("llo");//拼接的结果是新new"hello"
  String s2 = s1.intern();//把拼接的结果放入常量池
  //先检查了一下,常量池中没有"hello",Java8版本,
  // 就会把新new这个hello的地址值直接放到常量池
  System.out.println(s1 == s2);
        /*
        JDK8:true
        JDK6:false    JDK6版本的常量池在方法区中,和堆中字符串一定不会共享的,
         */
 }

7、字符串转大小写

(1)String toLowerCase():将字符串中大写字母转为小写

(2)String toUpperCase():将字符串中小写字母转为大写

 @Test
 public void test10(){
  System.out.println("A".toLowerCase()); // a
  System.out.println("a".toUpperCase()); // A
​
  }

8、判断字符串是否以xx开头或结尾

(1)boolean startsWith(xx):是否以xx开头

(2)boolean endsWith(xx):是否以xx结尾

@Test
public void test11(){
  String name = "张三";
 System.out.println(name.startsWith("张")); // ture
 System.out.println(name.startsWith("三")); // false
 System.out.println(name.endsWith("张"));  // false
 System.out.println(name.endsWith("三"));  // ture
 }
@Test
 public void test12() {
  String file = "Hello.txt";
  if (file.endsWith(".java")) {
   System.out.println("java源文件");
  } else if (file.endsWith(".clsss")) {
   System.out.println("java字节码文件");
  } else {
   System.out.println("其他文件");
  }
 }
​
输出结果:其他文件

9、去掉字符串前后空白符

(1)String trim():去掉字符串前后空白符

 @Test
    public void test13() {
        System.out.println("[" + "    hello world     ".trim() + "]");
    }
​
输出结果:[hello world]
    @Test
public void test14(){
 // 将用户输入的单词转为小写,如果用户没有输入单词,重新输入
    Scanner scanner = new Scanner(System.in);
    String s;
    while(true){
        System.out.println("请输入单词:");
        s = scanner.nextLine();
        if(s.trim().length()!=0){
            s=s.toLowerCase();
            break;
        }
    }
    System.out.println("你输入的单词是:"+ s);
    scanner.close();
}

10、在该字符串内搜索查找

(1)boolean contains(xx):是否包含xx

@Test
public void test15(){
 String str = "abcdefg";
    boolean c = str.contains("c");
    System.out.println(c); // ture
 }

(2)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1

  @Test
    public void test16() {
        String str = "HelloWorld";
        int s = str.indexOf("l");
        System.out.println(s); // 2
    }

(3)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1

 @Test
    public void test17() {
        String str = "HelloWord";
        int s = str.lastIndexOf("l");
        System.out.println(s); // 3
    }

11、截取字符串

(1)String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个字符串。

@Test
public void test18() {
    String str = "java,HelloWorld,liu";
    String s = str.substring(5);
    String s2 = str.substring(7);
    System.out.println(s);
    System.out.println(s2);
}
输出结果:HelloWorld,liu
        lloWorld,liu

(2)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

@Test
public void test19() {
    String str = "java,HelloWorld,liu";
    String s = str.substring(5,7);
    String s2 = str.substring(7,16);
    System.out.println(s);
    System.out.println(s2);
}
输出结果:He
        lloWorld,

12、获取char和char[]

(1)char charAt(index):返回[index]位置的字符

@Test
public void test23(){
        String str = "阁下虽然很强,但是比起我那两位敌友阁下还是稍显逊色 ";
    char c = str.charAt(20);
    System.out.println(c); //是

(2)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回

 @Test
    public void test24() {
        String str = "阁下虽然很强,但是比起我那两位敌友阁下还是稍显逊色 ";
        char[] c = str.toCharArray();
        System.out.println(c); // 阁下虽然很强,但是比起我那两位敌友阁下还是稍显逊色
        System.out.println(Arrays.toString(c)); //[阁, 下, 虽, 然, 很, 强, ,, 但, 是, 比, 起, 我, 那, 两, 位, 敌, 友, 阁, 下, 还, 是, 稍, 显, 逊, 色,  ]
    }
}

将字符数组转为String对象,可以使用之前介绍过的构造器和静态方法valueOf或copyValueOf等

  • String(char[] value):返回指定数组中表示该字符序列的 String。
  • String(char[] value, int offset, int count):返回指定数组中表示该字符序列的 String。
  • static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
  • static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String
  • static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
  • static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
@Test
    public void test20(){
        //将字符串中的字符按照大小顺序排列
        String str = "helloworldjavaatguigu";
        char[] array = str.toCharArray();
        Arrays.sort(array);
        str = new String(array);
        System.out.println(str);//aaadegghijllloortuuvw
    }
​
    @Test
    public void test21(){
        //将首字母转为大写
        String str = "jack";
        str = Character.toUpperCase(str.charAt(0))+str.substring(1);
        System.out.println(str); // Jack
    }
​

13、字符串编码解码

(1)byte[] getBytes():编码,把字符串变为字节数组,按照平台默认的字符编码方式进行编码

byte[] getBytes(字符编码方式):按照指定的编码方式进行编码

(2)new String(byte[] ) 或 new String(byte[], int, int):解码,按照平台默认的字符编码进行解码

new String(byte[],字符编码方式 ) 或 new String(byte[], int, int,字符编码方式):解码,按照指定的编码方式进行解码

==(编码方式见附录10.7.1)==

@Test
public void test22() throws UnsupportedEncodingException {
  String str = "中国";
    System.out.println(str.getBytes("ISO8859-1").length); // 2

14、判断字符串是否满足xx规则的方法(判断是否满足设置好的正则表达式)

(1)boolean matches(正则表达式):判断当前字符串是否匹配某个正则表达式。==(正则表达式详细见附录)==

  @Test
    public void test25(){
        //简单判断是否全部是数字,这个数字可以是1~n位
        String str = "12a345";
​
        //正则不是Java的语法,它是独立与Java的规则
        //在正则中\是表示转义,
        //同时在Java中\也是转义
        boolean flag = str.matches("\d+");
        System.out.println(flag); // false
    }
​
    @Test
    public void test26(){
        String str = "123456789";
​
        //判断它是否全部由数字组成,并且第1位不能是0,长度为9位
        //第一位不能是0,那么数字[1-9]
        //接下来8位的数字,那么[0-9]{8}+
        boolean flag = str.matches("[1-9][0-9]{8}+");
        System.out.println(flag);
    }

15、字符串内容的替换

(1)String replace(xx,xx):不支持正则

(2)String replaceFirst(正则,value):替换第一个匹配部分

(3)String replaceAll(正则, value):替换所有匹配部分

@Test
public void test27(){
    String str = "hello244world.java;887";
​
    String s1 = str.replace("244","");
    System.out.println("s1 = " + s1);
​
    String s2 = str.replaceFirst("\d+","");
    System.out.println("s2 = " + s2);
​
​
    //把其中的非字母去掉
    String s3 = str.replaceAll("[^a-zA-Z]", "");
    System.out.println("s3 = " + s3);
}

16、字符串拆分

(1)String[] split(正则):按照某种规则进行拆分

@Test
public void test28(){
    String str = "Hello World java liu ";
    String[] s = str.split(" ");
    for (int i = 0; i < s.length; i++) {
        System.out.println(s[i]);
​
    }
​
 }
输出结果:
Hello
World
java
liu    
​
@Test
public void test29(){
    String str = "1Hello2World3java4liu";
    str = str.replaceFirst("\d", "");
    System.out.println(str);
​
    String[] all = str.split("\d");
    for (int i = 0; i < all.length; i++) {
        System.out.println(all[i]);
​
    }
    str = str.replaceAll("\d+"," ");
    System.out.println(str);
}
输出结果:
Hello2World3java4liu
Hello
World
java
liu
Hello World java liu
​

2 可变字符序列

1、 String与可变字符序列的区别

因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低。因此,JDK又在java.lang包提供了可变字符序列StringBuilder和StringBuffer类型。

StringBuffer:老的,线程安全的(因为它的方法有synchronized修饰)

StringBuilder:线程不安全的

2、StringBuilder、StringBuffer的API

常用的API,StringBuilder、StringBuffer的API是完全一致的

(1)StringBuffer append(xx):拼接,追加

(2)StringBuffer insert(int index, xx):在[index]位置插入xx

(3)StringBuffer delete(int start, int end):删除[start,end)之间字符

(3)StringBuffer deleteCharAt(int index):删除[index]位置字符

(5)void setCharAt(int index, xx):替换[index]位置字符

(6)StringBuffer reverse():反转

(7)void setLength(int newLength) :设置当前字符序列长度为newLength

(8)StringBuffer replace(int start, int end, String str):替换[start,end)范围的字符序列为str

(9)int indexOf(String str):在当前字符序列中查询str的第一次出现下标

int indexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的第一次出现下标

(10)int lastIndexOf(String str):在当前字符序列中查询str的最后一次出现下标

int lastIndexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的最后一次出现下标

(11)String substring(int start):截取当前字符序列[start,最后]

String substring(int start, int end):截取当前字符序列[start,end)

(12)String toString():返回此序列中数据的字符串表示形式

(13)void trimToSize():尝试减少用于字符序列的存储空间。如果缓冲区大于保存当前字符序列所需的存储空间,则将重新调整其大小,以便更好地利用存储空间。

    @Test
    public void test6(){
        StringBuilder s = new StringBuilder("helloworld");
        s.setLength(30);
        System.out.println(s);
    }
    @Test
    public void test5(){
        StringBuilder s = new StringBuilder("helloworld");
        s.setCharAt(2, 'a');
        System.out.println(s);
    }
    
    
    @Test
    public void test4(){
        StringBuilder s = new StringBuilder("helloworld");
        s.reverse();
        System.out.println(s);
    }
    
    @Test
    public void test3(){
        StringBuilder s = new StringBuilder("helloworld");
        s.delete(1, 3);
        s.deleteCharAt(4);
        System.out.println(s);
    }
    
    
    @Test
    public void test2(){
        StringBuilder s = new StringBuilder("helloworld");
        s.insert(5, "java");
        s.insert(5, "chailinyan");
        System.out.println(s);
    }
    
    @Test
    public void test1(){
        StringBuilder s = new StringBuilder();
        s.append("hello").append(true).append('a').append(12).append("atguigu");
        System.out.println(s);
        System.out.println(s.length());
    }

3、 效率测试

package com.atguigu.stringbuffer;
​
import org.junit.Test;
​
public class TestTime {
​
    @Test
    public void testString(){
        long start = System.currentTimeMillis();
        String s = new String("0");
        for(int i=1;i<=10000;i++){
            s += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("String拼接+用时:"+(end-start));//367
​
        long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("String拼接+memory占用内存: " + memory);//473081920字节
    }
​
    @Test
    public void testStringBuilder(){
        long start = System.currentTimeMillis();
        StringBuilder s = new StringBuilder("0");
        for(int i=1;i<=10000;i++){
            s.append(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("StringBuilder拼接+用时:"+(end-start));//5
        long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("StringBuilder拼接+memory占用内存: " + memory);//13435032
    }
​
    @Test
    public void testStringBuffer(){
        long start = System.currentTimeMillis();
        StringBuffer s = new StringBuffer("0");
        for(int i=1;i<=10000;i++){
            s.append(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("StringBuffer拼接+用时:"+(end-start));//5
        long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("StringBuffer拼接+memory占用内存: " + memory);//13435032
    }
}