Java-String类

String字符串
*
* 1.String代表不可变的字符序列,不可变性
* 体现:①当对字符串重新赋值时,需要重写指定内存区域的值,不能使用原有的value进行赋值。
* ②当对现有的字符串进行连接字符串操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
* ③当调用String的replace()方法修改指定字符或者字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
* 1.String str1="abc";//字面量的定义方式
* * 通过字面量的方式(区别于new String()),给一个字符串赋值,此时的字符串声明在字符串常量池中
* * 字符串常量池中是不会存储相同内容的字符串的
*
*
* 2.String是一个final类,不可被继承
* 3.String是支持序列化的
* 4.String可以比较大小

public class StringTest {

    /**
     * String实例化的方式
     * 1.通过字面量定义的方式
     * 2.通过new+构造器的方式
     *
     *
     * 面试题:String s=new String("abc");方式创建对象,在内存中创建了几个对象?
     *        两个:一个是堆空间中的new结构,另一个是char[]对应的常量池中的数据“abc”
     *
     *
     */
    @Test
    public void test1()
    {
        //通过字面量定义的方式,此时s1、s2的数据javaEE声明在方法区中的字符串常量池中
        String s1="javaEE";
        String s2="javaEE";
        //通过new+构造器的方式,此时s3、s4保存的地址值,是数据在堆空间中开辟空间之后对应的地址值
        String s3=new String("javaEE");
        String s4=new String("javaEE");

        //true
        System.out.println(s1==s2);
        //false
        System.out.println(s1==s3);
        //false
        System.out.println(s1==s4);
        //false
        System.out.println(s3==s4);


    }

    @Test
    public void test2() {
        /**
         *
         * 1.String str1="abc";//字面量的定义方式
         * 通过字面量的方式(区别于new String()),给一个字符串赋值,此时的字符串声明在字符串常量池中
         * 字符串常量池中是不会存储相同内容的字符串的
         */
        String str1="abc";
        String str2="abc";
        //true
        System.out.println(str1==str2);

        str1="hello";
        System.out.println(str1);
        System.out.println(str2);

        String s3="abc";
        s3=s3+"def";

        System.out.println(s3);


        String s4="abc";
        String s5 = s4.replace('a', 'm');

        System.out.println(s4);
        System.out.println(s5);
    }


    /**
     * 字符串拼接
     * 1.常量与常量的拼接结果在常量池。
     * 2.只要有一个是变量,结果就在堆空间中。
     * 3.如果拼接的结果调用intern()方法,放回值就在常量池中
     */
    @Test
    public void test3()
    {
        String s1="javaEE";
        String s2="hadoop";

        String s3="javaEEhadoop";
        String s4="javaEE"+"hadoop";
        String s5=s1+"hadoop";
        String s6="javaEE"+s2;

        //true
        System.out.println(s3==s4);

        //false
        System.out.println(s3==s5);
        //false
        System.out.println(s3==s6);
        //false
        System.out.println(s5==s6);


        //返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”;
        //true
        String s8=s5.intern();
        System.out.println(s3==s8);

    }

    /**
     * 一道面试题
     */
    @Test
    public void test4()
    {
        String s1=new String("cat");
        change(s1);
        //cat
        System.out.println(s1);
    }

    public void change(String str)
    {
        str="tom";
    }


    /**
     * String常用方法
     * int length():返回字符串的长度
     * char charAt(int index):返回某索引处的字符
     * boolean isEmpty():判断是否是空字符串
     * String toLowerCase():将String中所有字符转为小写
     * String toUpperCase():将String中所有字符转为大写
     * String trim():返回字符串的副本,忽略前导空白和尾部空白
     * boolean equals(Object anObject):比较字符内容是否相同
     * boolean equalsIgnoreCase(String anotherString):忽略大小写,比较字符内容是否相同
     * String substring(int beginIndex):返回一个新的字符串,它是从beginIndex开始截取到最后一个
     * substring(int beginIndex, int endIndex) :返回一个新的字符串,它是从beginIndex开始截取到endIndex(不包含)
     * int compareTo(String anotherString):比较两个字符串大小
     */
    @Test
    public void test5()
    {
        String s1="hello";
        String s2="HELLO";
        System.out.println(s1.length());
        System.out.println(s1.charAt(0));
        System.out.println(s1.isEmpty());

        System.out.println(s2.toLowerCase());

        System.out.println(s1.toUpperCase());

        String s3="   he  ll o  ";
        String s4=s3.trim();
        System.out.println("------------"+s3+"------------");
        System.out.println("------------"+s4+"------------");

        String s5="helloworld";
        String s6="helloworld";
        String s7="Helloworld";

        System.out.println(s5.equals(s6));
        System.out.println(s5.equals(s7));

        System.out.println(s5.equalsIgnoreCase(s7));

        System.out.println(s5.substring(5));
        System.out.println(s5.substring(0, 5));

        String s8="abc";
        String s9="abe";
        System.out.println(s8.compareTo(s9));
    }

    /**
     * 常用方法之二
     *
     * boolean endsWith(String suffix) :测试此字符串是否以指定的后缀结束
     * boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
     * boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定的前缀开始
     * boolean contains(CharSequence s):当且仅当此字符串包含指定char值序列时,返回true(判断是否包含子字符串)
     * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引
     * int indexOf(String str, int fromIndex):返回指定字符串在此字符串中第一次出现处的索引,从fromIndex处开始
     * int lastIndexOf(String str):返回指定字符串在此字符串中最后一次出现处的索引
     * int lastIndexOf(String str, int fromIndex):返回指定字符串在此字符串中最后一次出现处的索引,fromIndex处开始
     * 注:indexOf和lastIndexOf方法如果没有找到都是返回-1
     *
     *
     */
    @Test
    public void test6()
    {
        String s1="hellotxt";
        System.out.println(s1.endsWith("txt"));
        System.out.println(s1.startsWith("hello"));
        System.out.println(s1.startsWith("ll", 2));

        System.out.println(s1.contains("hello"));

        System.out.println(s1.indexOf("llo"));
        System.out.println(s1.indexOf("ll", 1));

        String s2="hello123hello";
        System.out.println(s2.lastIndexOf("hello"));
        System.out.println(s2.lastIndexOf("hello",5));
    }


    /**
     * 常用方法之三
     * String replace(char oldChar, char newChar):返回一个新的字符串,它是通过newChar替换oldChar得来
     * String replace(CharSequence target, CharSequence replacement):返回一个新的字符串,它是通过newString替换oldString得来
     *
     *
     */
    @Test
    public void test7()
    {
        String s1="我爱天安门";
        System.out.println(s1.replace('天', '南'));
        System.out.println(s1.replace("我爱", "他爱"));
    }
}
public class StringTest2 {

    /**
     * String与基本数据类型、包装类之间的转换
     * String  -->   基本数据类型、包装类  :调用包装类的parseXXX(str)
     * 基本数据类型、包装类  --->String   :调用String重载的valueOf(xxx)
     */
    @Test
    public void test1()
    {
        String str1="123";
        int i = Integer.parseInt(str1);
        System.out.println(i);

        int j=100;
        String str2=String.valueOf(j);
        System.out.println(str2);
    }


    /**
     * String 与char[]之间的转换。
     * String -->  char[]:String.toCharArray()
     * char[] -->  String:调用String构造器
     */
    @Test
    public void test2()
    {
        String str1="abc123";
        char [] charArrays=str1.toCharArray();
        for(char a:charArrays)
        {
            System.out.println(a);
        }

        char [] chars=new char[]{'a','b','c','d','e','f'};
        String s1=new String(chars);
        System.out.println(s1);
    }


    /**
     * String与字节数组byte[]转换
     * (编码)String -->byte[]:调用String的getBytes()方法 或 byte[] getBytes(String charsetName)
     * (解码)byte[] -->String:调用String构造器  String(byte[] bytes) 、String(byte bytes[], String charsetName)
     * 说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。
     */
    @Test
    public void test3()
    {
        String s1="hello中国";
        //使用默认的字符集进行转换
        byte [] bytes=s1.getBytes();
        System.out.println(Arrays.toString(bytes));

        //使用特定的字符集进行转换
        try {
          byte[] bytes2=s1.getBytes("gbk");
            System.out.println(Arrays.toString(bytes2));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


        byte [] bytes1=new byte[]{110,111,101};
        String s2=new String(bytes1);


        //
        byte [] bytes2=new byte[]{104, 101, 108, 108, 111, -42, -48, -71, -6};
        String s3 = null;
        try {
            s3 = new String(bytes2,"gbk");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(s3);
    }
}

 

posted @ 2020-08-09 11:29  orz江小鱼  阅读(157)  评论(0编辑  收藏  举报