常用类--String类概述及其构造方法

String类概述及其构造方法

程序示例

/*
    字符串:
        简单理解:
            就是由多个字符组成的数据,叫做字符串
            也可以看作是一个字符数组。

    观察API发现:
        1、String代表的是字符串,属于java.lang下面的,所以使用的时候不需要导包
        2、String类代表字符串。
            Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例(对象)。
        3、字符串不变; 它们的值在创建后不能被更改
            字符串是常量,一旦被赋值,就不能改变
        4、String是final修饰的类,是不可变的,所以是线程安全的。

    构造方法:
        public String()
        public String(byte[] bytes)
        public String(byte[] bytes,int offset,int length)
        public String(char[] value)
        public String(char[] value,int offset,int count)
        public String(String original)

   注意事项:
        1、String类重写了toString()方法

*/
public class StringDemo {
    public static void main(String[] args) {
      
      //public String()
      //初始化新创建的String对象,以使其表示空字符序列。 
        String s = new String();
      //输出:s:而不是地址值,说明String类重写了toString()方法
        System.out.println("s: " + s);
      
        //查看字符串的长度
        //public int length()返回此字符串的长度。
      //输出:字符串s的长度为:0 ,因为我创建的是一个空的字符串
        System.out.println("字符串s的长度为:" + s.length());

        System.out.println("***************************************");

      //public String(byte[] bytes) 将一个字节数组转成一个字符串
      //该方法会将输入的字节数组中的每个元素,通过ASCII码表
      //转换为对应的字符
        byte[] b = {97,98,99,100,101};
        String s2 = new String(b);
      //输出:s2:abcde
        System.out.println("s2: " + s2);
        //查看字符串的长度
        //public int length()返回此字符串的长度。
      //输出:字符串s2的长度为:5
        System.out.println("字符串s2的长度为:" + s2.length());

        System.out.println("***************************************");
      
        //public String(byte[] bytes,int index,int length)
        //将字节数组中的一部分截取出来变成一个字符串  
      //将数组b传入,从下标1开始截取,截取3位
        String s3 = new String(b, 1, 3);        
        System.out.println("s3: " + s3);//输出:bcd
        //查看字符串的长度
        //public int length()返回此字符串的长度。      
        System.out.println("字符串s3的长度为:" + s3.length());//输出:3

//        //那么问题来了,我想截取十位或者我想从下标为10开始截取了,这样会发生什么呢?
//        //StringIndexOutOfBoundsException--字符串索引越界异常
//        String s4 = new String(b, 1, 5);
//        System.out.println("s4: " + s4);
//        //查看字符串的长度
//        //public int length()返回此字符串的长度。
//        System.out.println("字符串s4的长度为:" + s4.length());

        System.out.println("***************************************");
        //public String(char[] value) 将一个字符数组转成一个字符串
        char[] c = {'a','b','c','d','我','爱','冯','提','莫'};
        String s5 = new String(c);
        System.out.println("s5: " + s5);//输出:abcde我爱冯提莫
        //查看字符串的长度
        //public int length()返回此字符串的长度。
        System.out.println("字符串s5的长度为:" + s5.length());//输出:9

        System.out.println("***************************************");
        //public String(char[] value,int offset,int count)
        //将字符数组中一部分截取出来变成一个字符串
      //输入字符数组c,从下标为4开始截取,截取5个
        String s6 = new String(c, 4, 5);
        System.out.println("s6: " + s6);//输出:我爱冯提莫
        //查看字符串的长度
        //public int length()返回此字符串的长度。
        System.out.println("字符串s6的长度为:" + s6.length());//输出:5

        System.out.println("***************************************");

        //public String(String original)
      //我创建了一个字符串常量s7,我没有new它所以它不在堆里,在常量池中
        String s7 = "你好";
      //我现在将s7传入该构造方法并new了一下,就相当与在堆内存中多了一个空间来引用
      //常量池中的“你好”,这样是没必要的。
        String s8 = new String(s7);
        System.out.println("s8: " + s8);//输出:你好
        //查看字符串的长度
        //public int length()返回此字符串的长度。
        System.out.println("字符串s8的长度为:" + s8.length());//输出:2
    }
}

 public String(String original)原理图

String类的特点及面试题 

/*
   面试题:
    字符串是常量,它的值在创建之后不能更改
    String s = “hello”;
    s += “world”;
    问s的结果是多少?
*/
public class StringDemo2 {
    public static void main(String[] args) {
        String s = "hello";
        s += "world";
        System.out.println(s);//输出:helloworld
      //那么问题来了,不是常量池中的常量是不可改变的吗?
      //为什么结果输出的值为helloworld,而不是报错呢?
    }
}

常量值的拼接图解

/*
 面试题:
    String s = new String(“hello”)和String s = “hello”;的区别?
    字符串比较之看程序写结果
    字符串拼接之看程序写结果

    1、==比较引用数据类型的时候,比较的是地址值
    2、String s1 = new String("hello");会在堆内存中创建对象
    3、String类中重写了Object的equals方法
    4、equals方法默认比较的是地址值,但是由于重写了,所以比较的是内容
*/
public class StringDemo3 {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = "hello";

        System.out.println(s1==s2); //false
        System.out.println(s1.equals(s2)); //true
    }
}
/*
        1、字符串如果是变量相加,是先开辟空间,然后再拼接
        2、字符串如果是常量相加,是先相加,然后去常量池中找,如果找到了,就返回
            如果找不到就创建。
*/
public class StringDemo5 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        String s4 = "hello"+"world";
        System.out.println(s3==s4); //true
        String s5 = s1+s2;
        System.out.println(s3==s1+s2); //false
        System.out.println(s3.equals(s1+s2)); //true

        //System类中
        //public static int identityHashCode(Object x)方法
        //返回给定对象的地址值,空引用哈希码值为0
        System.out.println(System.identityHashCode(s3));//1163157884
        System.out.println(System.identityHashCode(s4));//1163157884
        System.out.println(System.identityHashCode(s5));//1956725890
    }
}

 

posted @ 2021-12-14 20:23  赤兔胭脂小吕布  阅读(205)  评论(0)    收藏  举报