JAVA基础知识-字符串相关的类-1

294 阅读4分钟

1.Sting类的含义

Sring类:代表字符串。是一个final类,代表不可变的字符序列。字符串是常量,用双引号引起来表示。值在创建后不能更改。String对象的字符串内容是存储在一个字符数组value[]中的。

2.String类的一些特点

String:字符串,使用一对“”引起来表示

  1. String声明为final的,不可被继承

  2. String实现了Serializable接口:表示字符串是支持序列化的。

    String实现了Comparable接口:表示String可以比较

  3. Sring内部定义了final char[] value用于存储字符串数据

  4. String:代表不可变的字符序列。简称:不可变性。

     体现:
     1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。 
     2.当对现有字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 
     3.当调用String的replace()方法修改指定的字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 
    
  5. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

  6. 字符串常量池是不会存储相同内容的字符串。

3.String对象的实例化方式

字面量定义的方式

String str=“hello”;

通过构造器

String s1=new String();

String ss2=new String(String original);

String s3=new String(char[] a);

String s4=new String(char[] a,int startIndex,int count);

字面量定义的数据在方法区中的字符串常量池中, 即相同字符串共用一个地址值。

new构造器声明的数据,存储在堆空间中。

使用类实例化传入String的值,如图所示,带参构造器使用的字面量赋值的方式,两个String类型的name地址值一致

image.png

String s=new String"abc");方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构域,另一个是char[]对应的常量池中的数据:“abc”

注意点

Sring s1=“hello”; String s2=“he”; String s3=s2+“llo”;

此时,s3在堆中开辟地址。
String s4=s3.intern();//intern方法强制s3在常量池中声明 
此时s4与s1地址一致
final声明的字符串类型在常量池中开辟空间,无论其以何种方式赋值

4.常用方法

        //小写
        String s2=s1.toLowerCase(Locale.ROOT);
        System.out.println(s2);
        System.out.println(s1);

        //大写
        s2=s1.toUpperCase(Locale.ROOT);
        System.out.println(s2);
        System.out.println(s1);

        //去掉首尾空格
        String s3="  hello  world  ";
        String s4=s3.trim();
        System.out.println("-----"+s3+"-----");
        System.out.println("-----"+s4+"-----");

        //忽略大小写比较字符是否相等
        System.out.println(s2.equalsIgnoreCase(s1));

        //连接
        System.out.println("-------------------------");
        s3="abc";
        s4=s3.concat("def").concat(" ").concat("aaa");
        System.out.println(s4);

        //比较字符串大小
        //小于0,当前小
        String s5="abc";
        String s6="abe";
        System.out.println(s5.compareTo(s6));//涉及字符串排序

        //取字符串子串
        String s7="abcdef";
        System.out.println(s7.substring(2));
        System.out.println(s7.substring(2,5));//左闭右开

        //测试字符串是否以指定的后缀结束、以指定的前缀开始
        s1="adasdaddsd";
        boolean b1=s1.endsWith("dsd");
        System.out.println(b1);
        System.out.println(s1.startsWith("a"));
        System.out.println(s1.startsWith("as",2));//从第二位开始以指定前缀开始

        //判定一个字符串是否包含另一个字符串
        System.out.println(s1.contains("sdad"));

        //返回出现查找字符串的第一个索引值
        System.out.println(s1.indexOf("dad"));//没找到时返回-1
        System.out.println(s1.indexOf("dad",3));//从3开始往后找
        System.out.println(s1.lastIndexOf("sd"));//从后向前找,返回索引以前是从前向后,找的为右边第一个

        //替换字符串中的指定字符或指定字符串替换为新的字符或字符串
        s1="helloworld,world";
        s2=s1.replace("l","r");//替换字符
        System.out.println(s1);
        System.out.println(s2);
        s2=s1.replace("world","java");//替换字符串
        System.out.println(s2);
        s2=s1.replaceFirst("world","java");
        System.out.println(s2);
        //把字符串中的数字换成","
        s1="1hello2world3";
        s2 = s1.replaceAll("\\d+", ",");
        System.out.println(s2);
        //删除开头和结尾的逗号
        s2=s1.replaceAll("\\d+", ",").replaceAll("^,|,$","");
        System.out.println(s2);
        //正则表达式

        //匹配
        //匹配给定的正则表达式
        s1="12345";
        System.out.println(s1.matches("\\d+"));
        //判断字符是否符合格式
        s2="0571-4534289";
        System.out.println(s2.matches("0571-\\d{7,8}"));

        //切片
        //以指定字符切割字符串到字符串数组中
        s1="hello|world|java";
        String[] s1s=s1.split("\\|");
        System.out.println(s1);
        for (String s:s1s){
            System.out.print(s+" ");
        }
        System.out.println();
        s2="hello.world.java";
        System.out.println(s2);
        String[] s2s=s2.split("\\.");
        for (String s:s2s){
            System.out.print(s+" ");
        }

5.String与char型数组和byte型的数组相互转换

与char[]的转换:调用方法toCharArray()

与byte[]的转换:调用方法getBytes()