笔记11:java_String类的特点

来源:互联网 发布:淘宝男士韩版鞋 编辑:程序博客网 时间:2024/05/22 05:26

记录:
(1)String类对象的两种实例化方式
(2)字符串的比较:“==”,“equals()”
(3)String常量为匿名对象
(4)两种实例化方式的区别
(5)字符串内容不可改变,如果需要改变就用StringBuffer & StringBuilder 类。
范例代码如下

public class Test{    public static void main(String[] args){        //实例化String对象的两种方法,一般使用实例化方法1        String str = "Hello World";//实例化对象方法1:直接赋值,这里不用new也可以        System.out.println(str);        String str01 = new String("Hello World");//实例化对象方法2:利用构造方法实例化        System.out.println(str01);        //字符串的比较        //"=="比较的是内存地址        //比较字符串的内容:使用=》字符串对象.equals(字符串对象)        String str02 = "Hello World";        String str03 = "Hello World";        String str04 = new String("Hello World");        System.out.println(str02 == str03);//true        System.out.println(str02 == str04);//false        System.out.println(str02.equals(str03));//true        System.out.println(str02.equals(str04));//true        //"==":是java提供的关系运算符,主要的功能是进行数值相等的判断的,如果用在了String对象上,表示的是地址数值的比较        //"equals":是有String提供的一个方法,此方法专门负责进行字符串内容的比较        //字符串常量就是String的匿名对象,但是匿名对象是系统直接生成的,不由用户创建        /*字符串不属于基本数据类型,它是字符串作为String类的匿名对象存在的。匿名对象是可以调用类的方法的*/        String str05 = "Hello World";        System.out.print("Hello World".equals(str05));//true        //那么所谓的直接赋值实际上就是相当于将一个匿名对象设置了一个名字而已        //小技巧:在以后的开发之中,如果要判断输入的内容是否是某一字符串,请一定要将字符串写在最前面:“字符串”.equals(字符串对象),避免出现null指针异常,因为equals已经对null进行了处理。        //两种实例化方式的区别        /*直接赋值=》内存分析=》共享设计模式:=》节约内存         * 在java的底层实际上会存在有一个对象池,不一定只是保持String对象,当代码之中使用直接赋值的方式定义了一个String类对象时,会将此字符串对象所使用的匿名对象入池保存,         * 如果后续还有字符串对象采用直直接赋值的方式,而且设置了同样的内容的时候,将不会开辟新的堆内存空间,而是使用已经有的对象进行引用的分配,而后继续使用。         * */        /*使用new实例化String对象:         * 构造方法如果要使用一定要用关键字new,一旦使用了关键字new,就一定会开辟新的内存空间         * 通过内存分析可以得出,会开辟两块堆内存空间,并且其中有一块堆内存空间会成为垃圾空间         * 除了内存的浪费之外,如果使用构造方法定义的String类对象,其内容不会保存在对象池之中         * 因为是使用了关键字new开辟的新内存。如果现在希望开辟的新内存数据也可以进行对象池的保存,那么         * 可以采用String类定义的手工入池的方法:public String intern():但是太麻烦         * */        String str06 = new String("Hello");             //以上分析得出:string对象的直接赋值好于new实例化赋值        //字符串内容不可改变        /*字符串一旦定义不可改变,建议不要频繁的修改,否则可能产生大量的垃圾         * */        String str07 = "heting";        str07 += " nihao";        System.out.println(str07);//字符串内容没有改变,对于字符串对象内容的改变,是利用了引用关系的变化而实现的,但是每一次的变化都会产生垃圾空间        /*总结         * String类对象的相等判断使用equals()方法完成         * 字符床内容一旦声明则不可改变,String类对象内容的改变是依靠引用关系的变更实现的         * String类由两种实例化方式,使用直接赋值可以不产生垃圾空间,并且可以自动入池,不要使用构造方法完成         * */    }}

下面给出老师上课3张内存分析截图
截图1:说明第一种实例化(直接赋值)方式的内存分析,这里涉及到内存池的概念
这里写图片描述
截图2:说明第二种实例化(构造函数)方式的缺点,会产生多余的内存垃圾
这里写图片描述
截图3:说明字符串内容不可改变
这里写图片描述

0 0
原创粉丝点击