Java003-String字符串

1.这两种定义有什么区别

/***
     * 面试题:这两种定义方式有什么区别?
     * 如何证明?
     * @param args
     */
    public static void main(String[] args) {
        String str = "hello";//常量池

        String str1 = new String("hello");//在堆里开辟一块新的空间
    }

2.String 常用方法

   public static void test(){
        String str = "Hello World";//常量的特点是定义了,就不会变,除非重新赋值
        int len = str.length();//字符串的长度
        boolean eq = str.equals("33333");//判断两个字符的值是不是相等
        char charStr = str.charAt(2);//将字符串转换为char类型

        boolean contains = str.contains("hello");//判断字符串是否包含这个字符串
        boolean startWith = str.startsWith("H");//判断字符串是否以这个字符串开始
        boolean endWith = str.endsWith("ddd");//判断字符串是否以这个字符串结尾

        boolean empty = str.isEmpty();//判断这个字符串是否为空的字符串,是"",不是null

        boolean eqIgnore = str.equalsIgnoreCase("HELLO WORLD");//不区分大小写的相等
        //rep = Hello java; str = Hello World
        //如果没有找到匹配的,则不做替换
        String rep = str.replaceAll("World","java");//替换全部的
        String rep1 = str.replace("H","e");//替换一个,传值的变量都是char
        String rep2 = str.replace("He","eeeee");//替换一个,传值的变量都是char
        System.out.println(rep);
        System.out.println(str);
        System.out.println(rep1);
        System.out.println(rep2);


        String[] strs = str.split(" ");//分割,分割后是变成数组

        String sub = str.substring(1,5);//截取,下标是从0开始,1--是开始下标,5--是截止下标
        System.out.println(sub);

        String upStr = str.toUpperCase();//转大写
        String lowStr = str.toLowerCase();//转小写
    }

3.commons-lang3

dependencies {
    compile('org.apache.commons:commons-lang3:3.10')
}

小练习

public class Demo6 {
    //练习题:给定一个字符串,判断是否是一个回文(即正反都一样)
    //abcdefggfedcba
    public static void main(String[] args) {
        test1();
    }

    public static void test1(){
        String str = "abcdefgfedcba";
        String str1 = StringUtils.reverse(str);//将字符串反转
        System.out.println("str1 = " + str1);
        if (str.equals(str1)){
            System.out.println("该字符串时一个回文");
        }
    }
}

4.StringBuilder和StringBuffer

StringBuffer多了一个synchronized 关键字,线程安全锁

StringBuilder是线程不安全的

StringBuffer是线程安全的

但是一般情况下是在一个方法下使用,使用StringBuilder多点

如果出现多线程调用时,再用StringBuffer

//StringBuilder 的定义
@Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

 

//StringBuffer的定义
@Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
public static void test1(){
        String str = "a,b,c,d,e,f,g";
        String[] arr = str.split(",");
        String res = "";
        //这种情况是在不断的创建对象
        for (String key:arr){
            res += key + "*";
        }
        System.out.println("res = " + res);
    }

    public static void test2(){
        String str = "a,b,c,d,e,f,g";
        String[] arr = str.split(",");
        //StringBuilder相当于一个容器,不断的往容器里加内容
        StringBuilder res = new StringBuilder();
        for (String key:arr){
            res.append(key).append("*");
        }
        System.out.println("res = " + res);
    }

    public static void test3(){
        String str = "a,b,c,d,e,f,g";
        String[] arr = str.split(",");
        //StringBuffer多了一个synchronized 关键字,线程安全锁
        StringBuffer res = new StringBuffer();
        for (String key:arr){
            res.append(key).append("*");
        }
        System.out.println("res = " + res);
    }

 

posted @ 2021-07-11 09:57  cjxxl1213  阅读(39)  评论(0编辑  收藏  举报