String,StringBuffer,StringBuilder类

String类

String:字符串,使用一对""号表示

  1. String声明为final的,不可以被继承
  2. String实现了Serializable接口,表示String支持序列化
  3. Comparable接口,String可以比较大小
  4. String内部定义了final char value[]用于存储字符串数据
  5. String:代表不可变的字符序列,简称不可变性
  6. 通过字面量定义方式给一个字符串赋值,此时字符串值声明在字符串常量池中
  7. 字符串常量池中不会存储相同内容的字符串的
public class Test2 {
    public static void main(String[] args) {
        //字面式定义
        //体现:String时不可变性的三中方式
        //当对字符串重新赋值时,会创建新的内存地址指向新的内存地址,不会改变原来内存地址的值
        String s1="abc"; //字面量定义方式
        String s2="abc";
        s1="hello";
        System.out.println(s1);
        System.out.println(s2);
        //当对现有的字符串进行拼接操作时,会创建新的内存地址指向新的内存地址,不会改变原来内存地址的值
        String s3="abc";
        s3+="def";
        System.out.println(s3);
        //当对现有的今天替换,会创建新的内存地址指向新的内存地址,不会改变原来内存地址的值
        String s4="abc";
        String replace = s4.replace("a", "c");
        System.out.println(replace);
        System.out.println(s4);
    }
}
public class Test3 {
    public static void main(String[] args) {
        //new+构造器创建
        //字面式定义,声明在方法区常量池中
        String s1="hello";
        String s2="hello";
        //new+构造器定义是在堆中开辟空间以后对应的地址值
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s1 == s2);//true
        System.out.println(s1 == s3);//false
        System.out.println(s3 == s4);//false
        //面试题
        //String s3 = new String("hello");在内存中创建了几个对象
        //两个,一个是堆空间new结构,一个是char[] 常量池中的数据"abc"
    }
}

不同拼接操作的比较

public class Test4 {
    public static void main(String[] args) {
        String s1="javase";
        String s2="javaee";
        String s3="javasejavaee";
        String s4="javase"+"javaee";
        String s5=s1+"javaee";
        String s6="javase"+s2;
        String s7=s1+s2;
        //在比较是常量的时候,拼接的结果是相同的
        System.out.println(s3 == s4);//true
        //拼接的时候有变量,拼接的结果是不不相同的
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false
        //如果想要它在常量池中,就可以使用intern()方法,返回值放在常量池中
        String intern = s5.intern();
        System.out.println(intern==s3);
    }
}

String类的常用方法

  1. 查看字符串的长度

  2. 取出指定下标的字符

  3. 判断字符串是否为空

  4. 把字符串变成小写

  5. 把字符串变成大写

  6. 返回字符串的副本,忽略前导空白与尾部空白

  7. 比较字符串的内容是否相同

  8. 比较字符串的内容是否相同 忽略大小写

  9. 把s2的内容拼接到s1后面,等价于+

  10. 比较两个字符串的大小

  11. 字符串截取从哪个位置开始

  12. 字符串截取从哪个位置开始到哪个位置结束,不包括最后那个位置

  13. 测试字符串是否可以使用指定的前缀

  14. 测试字符串是否可以使用指定的后缀

  15. 测试字符串是否可以使用指定的前缀,从那个下标开始

  16. 判断字符串是否包含括号里的字符串

  17. 返回括号里第一次出现字符串的下标

  18. 下标从哪个位置开始,第一次出现的str字符串

  19. 返回指定字符串在最右边出现的下标

  20. 返回指定下标开始,从右往左,最后出现的字符串的下标

  21. indexOf()和lastIndexOf()找不到指定的字符串的下标会返回-1

  22. 把指定的字符串替换成新的字符串

  23. 把指定的字符替换成新的字符

  24. 根据正则表达式来替换字符串

  25. 先把数字替换成逗号,在把前缀逗号和后缀逗号替换成空字符

  26. 根据正则表达式判断字符串是否全是数字组

  27. 根据正则表达式判断字符串是否是一个杭州固定电话

public class Test4 {
    public static void main(String[] args) {
        String s1="HelloWorld";
        //查看字符串的长度
        System.out.println(s1.length());
        //取出指定下标的字符
        System.out.println(s1.charAt(0));
        //判断字符串是否为空
        System.out.println(s1.isEmpty());
        //把字符串变成小写
        System.out.println(s1.toLowerCase());
        //把字符串变成大写
        System.out.println(s1.toUpperCase());
        String s2="   Hello   World    ";
        //返回字符串的副本,忽略前导空白与尾部空白
        System.out.println(s2.trim());
        //比较字符串的内容是否相同
        System.out.println(s1.equals(s2));
        //比较字符串的内容是否相同 忽略大小写
        System.out.println(s1.equalsIgnoreCase(s2));
        //把s2的内容拼接到s1后面,等价于+
        System.out.println(s1.concat(s2));
        //比较两个字符串的大小
        System.out.println(s2.compareTo(s1));
        //字符串截取从哪个位置开始
        System.out.println(s1.substring(4));
        //字符串截取从哪个位置开始到哪个位置结束,不包括最后那个位置
        System.out.println(s1.substring(2, 5));
        String s3="helloworld";
        //测试字符串是否可以使用指定的前缀
        System.out.println(s3.startsWith("he"));
        //测试字符串是否可以使用指定的后缀
        System.out.println(s3.endsWith("ld"));
        //测试字符串是否可以使用指定的前缀,从那个下标开始
        System.out.println(s3.startsWith("wo", 5));
        //判断字符串是否包含括号里的字符串
        System.out.println(s3.contains("lo"));
        //返回括号里第一次出现字符串的下标
        System.out.println(s3.indexOf("ll"));
        //下标从哪个位置开始,第一次出现的str字符串
        System.out.println(s3.indexOf("wo", 4));
        //返回指定字符串在最右边出现的下标
        System.out.println(s3.lastIndexOf("ld"));
        //返回指定下标开始,从右往左,最后出现的字符串的下标
        //indexOf()和lastIndexOf()找不到指定的字符串的下标会返回-1
        System.out.println(s3.lastIndexOf("r", 8));
        String s4="好好学习,天天向上";
        //把指定的字符串替换成新的字符串
        System.out.println(s4.replace("好好", "认真"));
        //把指定的字符替换成新的字符
        System.out.println(s4.replace('学', '复'));
        String str ="12hello034world5java7891mysql456";
        //根据正则表达式来替换字符串
        //先把数字替换成逗号,在把前缀逗号和后缀逗号替换成空字符
        System.out.println(str.replaceAll("\\d+", ",").replaceAll("^,|,$",""));
        str="1234567";
        //根据正则表达式判断字符串是否全是数字组成
        System.out.println(str.matches("\\d+"));
        str="0571-4534289";
        //根据正则表达式判断字符串是否是一个杭州固定电话
        System.out.println(str.matches("0571-\\d{7,8}"));
    }
}

String类型的转换

 		String number="123456";
        //String-->基本数据类型,包装类通过parsexxx();
        int i = Integer.parseInt(number);
        System.out.println(i);
        //基本数据类型,包装类-->String通过String.valueOf()
        System.out.println(String.valueOf(i));

StringBuffer,StringBuilder常用方法

 //StringBuffer,StringBuilder的常用方法
        //1.append() 用于进行字符串的拼接
        //2.delete(int start,int end) 删除指定位置的内容,不包括end长度的字符
        //3.replace(int start,int end,String str) [start-end]位置中间替换成str
        //4.insert(int offset,xxx) 在指定位置插入xxx
        //5.reverse() 把当前的字符串序列逆转
        //6.indexOf(String str) 返回指定字符串的下标序列
        //7.substring(int start,int end) 返回从start位置开始到end结束的字符串,不包括end长度的字符
        //8.length() 获取字符串的长度
        //9.charAt(int n) 取出n的下标的字符
        //10.setCharAt(int n,char ch) 指定的n的下标字符替换成ch
        StringBuffer sb = new StringBuffer("abc123");
        sb.append("4");
        System.out.println(sb);
        sb.delete(6,7);
        System.out.println(sb);
        sb.replace(5,6,"4");
        System.out.println(sb);
        sb.insert(5,3);
        System.out.println(sb);
        System.out.println(sb.reverse());
        System.out.println(sb.indexOf("a"));
        System.out.println(sb.substring(4,7));
        System.out.println(sb.length());
        System.out.println(sb.charAt(6));
        sb.setCharAt(0,'d');
        System.out.println(sb);

String,StringBuffer,StringBuilder区别

区别及源码分析

//        String,StringBuffer,StringBuilder三者的异同
//        String:不可变的字符序列,底层都是使用char[]存储
//        StringBuffer:可变的字符序列,线程安全,效率低,底层都是使用char[]存储
//        StringBuilder:可变的字符序列,jdk5新增的,线程不安全,效率高,底层都是使用char[]存储
//        源码分析:
//        StringBuffer,StringBuilder使用构造方法创建对象时,底层会获取构造方法的字符长度加上16
//        当获取长度时,它的长度是有效字符,而不是16
//        当字符的长度过多时
//        扩容:扩容原来长度的两倍+2 同时将原有的数据添加到新的数组里里面
        StringBuffer stringBuffer = new StringBuffer("a");
        StringBuilder stringBuilder = new StringBuilder("b");
        stringBuffer.append('c');
        System.out.println(stringBuffer.length());

String,StringBuffer,StringBuilder的效率比较

		//String,StringBuffer,StringBuilder的效率区别
        //由慢到快:String>StringBuffer>StringBuilder
        long start=0L;
        long end=0L;
        String s="";
        StringBuffer stringBuffer1 = new StringBuffer();
        StringBuilder stringBuilder1 = new StringBuilder();
        start = System.currentTimeMillis();
        for (int i = 0; i <40000 ; i++) {
            s=s+i;
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
        start = System.currentTimeMillis();
        for (int i = 0; i <40000 ; i++) {
            stringBuffer1.append(String.valueOf(i));
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
        start = System.currentTimeMillis();
        for (int i = 0; i <40000 ; i++) {
            stringBuilder1.append(String.valueOf(i));
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
结果:
2597
6
4

posted @ 2021-01-06 09:23  博客帅帅  阅读(100)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css