wordpress Shell脚本 sorting dtel语言 matlab向上取整 Avalon vue开发 jq获取第一个子元素 jquery删除子元素 ab软启动器 docker查看所有容器 nfc卡片 mysql分区表优劣分析 python学习网站 python基础知识 java学习手册 java操作mysql java的正则表达式 java安装 javascript源代码 图吧导航怎么样 kms神龙 ps选择反向快捷键 只狼脚本 linux端口映射 mac版matlab 脚本学习 ps反向选择的快捷键 facetime要钱吗 jquery下载 qq浏览器手机版 枪林弹雨辅助 dnf风神加点 华为杂志锁屏怎么设置 华为工具箱 显卡怎么设置 fla文件用什么打开 唯品会客服在哪 wps表头每页都显示 CST软件
当前位置: 首页 > 学习教程  > 编程语言

JAVA高级编程之String类

2021/2/13 20:22:41 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

String类 测试一:字面量定义 /*String :字符串,使用一对""引起来表示1.String声明为final的,不可被继承2.String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比…

String类

测试一:字面量定义

 /*
        String :字符串,使用一对""引起来表示
        1.String声明为final的,不可被继承
        2.String实现了Serializable接口:表示字符串是支持序列化的。
                实现了Comparable接口:表示String可以比较大小
        3.String内部定义了final char[] value 用于存储字符串数据
        4.String:代表不可变的字符序列。简称:不可变性。
          体现:1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
               2.当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
               3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
        5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
        6.字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。
         */
    @Test
    public void test1() {
        String s1 = "abc";//字面量的定义方式
        String s2 = "abc";
        System.out.println(s1 == s2);//true 表示指向同一地址
        s1 = "hello";
        System.out.println(s1 == s2);//此时常量池会新增加一段内存,存储hello,此时不指向同一内存,为false
        System.out.println("**********************");

        String s3 = "abc";//此时指向s2所指向的abc
        s3 += "def";
        System.out.println(s3);//注意此时新造一片内存来表示abcdef而不是在原来s2的基础上加上def
        System.out.println(s2);//没变,仍为abc
        System.out.println("**********************");

        String s4 = "abc";
        String s5 = s4.replace('a', 'm');//将 a 改为 m
        System.out.println(s4);//abc
        System.out.println(s5);//mbc   注意此时的mbc并没有在原来的基础上改变,而是新造出来的
        System.out.println(s4 == s5);//false
        System.out.println("以上均为证明字符串的不可变性(即定义后内容不再改变)");


    }

上述图解
在这里插入图片描述

测试二:使用构造器
①首先初步了解各构造器
在这里插入图片描述
②通过不同的声明在底层的存储结构
在这里插入图片描述
在这里插入图片描述
③字面量定义与构造器的区别
在这里插入图片描述
代码说明:

 /*
     String 的实例化方式:
     方式一:通过字面量定义的方式
     方式二:通过new + 构造器的方式

     面试题:String  s = new String("abc"); 方式创建对象,在内存中创建了几个对象?
            两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
     */
    @Test
    public void test2() {
        //通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
        String s1 = "javaEE";
        String s2 = "javaEE";

        //通过new + 构造器的方式: 此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
        String s3 = new String("javaEE");
        String s4 = new String("javaEE");

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

        System.out.println("***************************");
        Person p1 = new Person("Tom", 12);
        Person p2 = new Person("Tom", 12);
        System.out.println(p1.equals(p2));//true
        System.out.println(p1.name == p2.name);//true    这里为什么是true看下面图解

        p1.name = "jeek";
        System.out.println(p2.name); //Tom   因为常量池的不可变性
    }

在这里插入图片描述
在这里插入图片描述
通过以下来进一步熟练掌握
在这里插入图片描述

测试三:

/*
    结论:
    1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
    2.只要其中有一个是变量,结果就在堆空间中。
     */
    @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;
        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
        System.out.println(s5 == s6);//false
        System.out.println(s5 == s7);//false
        System.out.println(s6 == s7);//false

        String s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”    注意其中的s6声明在堆空间中
        System.out.println(s3 == s8);//true
    }

总结:
 String s1 = “a”;
说明:在字符串常量池中创建了一个字面量为"a"的字符串。

 s1 = s1 + “b”;
说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。

 String s2 = “ab”;
说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。

 String s3 = “a” + “b”;
说明:s3指向字符串常量池中已经创建的"ab"的字符串。

String s4 = s1.intern();
说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串赋值给s4。

最后用一道例题供大家联系掌握:

public class StringTest {
    String str = new String("good");
    char[] ch = {'t', 'e', 's', 't'};

    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'b';
    }

    public static void main(String[] args) {
        StringTest ex = new StringTest();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str);//good
        System.out.println(ex.ch);//best
    }
}

例题注解:两个str需要区分开哦,因为常量池不会在原来基础上改,会新增一片存储地址,所以以前那个地址保持不变,为char型是在堆空间中直接进行操作。

就到这里啦,谢谢大家❥(^_-)


本文链接: http://www.dtmao.cc/news_show_700470.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?