您的位置:首页 > 其它

第三章.操作符

2017-12-15 00:19 134 查看
操作符的一些基础知识在这不再补充;这一章有点少。

1.赋值

别名现象:在java中,当创建一个对象时使用new来创建,值得注意的时,我们意思上的“创建了一个对象”,实际上是在内存区开辟了一块可以保存该对象的物理存储区,而我们所说的对象实际上只是对于这个物理存储区的引用,它是对该物理存储区的状态的说明。在此基础上对象的赋值也有了新的解读方式,比如:

            ArrayList<String>arrayList1 = new ArrayList<String>();

           ArrayList<String> arrayList2 =new ArrayList<String>();

           arrayList1.add("111");

           arrayList2.add("222");

           System.out.println("第一次第一个List的输出:"+arrayList1.get(0));

           System.out.println("第一次第二个List的输出:"+arrayList2.get(0));

           arrayList1=arrayList2;

           System.out.println("第二次第一个List的输出:"+arrayList1.get(0));

           System.out.println("第二次第二个List的输出:"+arrayList2.get(0));

第一次第一个List的输出:111

第一次第二个List的输出:222

第二次第一个List的输出:222

第二次第二个List的输出:222

如代码所示,在刚开始创建了两个Arraylist的对象,它们分别指向了唯一的物理存储区,然后分别对两个list进行了add操作,sysout出的结果如图所示。然后进行的将arraylist2赋值给arraylist1,之后显示的结果也证实了对象之间的赋值其实是引用之间的传递,arraylist2将自己引向的物理存储区传给了arraylist1,arraylist在接受之后“放弃”了原来自己指向的物理存储区(该区将在一段时间后经垃圾回收器处理回收,释放内存)。

      基础类型的赋值是存储了实际的数值,并非指向一个对象的引用,不同于对象之间的赋值。例如:int   I = 3; int b =I; 这时不论对b或i进行修改,都不会影响到其他的值。

      方法也存在别名问题,经常利用这一点,对象执行方法的同时对对象的数据进行修改。

2.测试对象的等价性

      在此间出场的主人公有两位:==,equals()

      ==(及!=)比较的是对象的引用,但基本类型值的等价性可以直接由==或!=比较。

    之前提过,==与!=比较的是对象的引用,那么如何比较对象的实际内容呢?这时可以用到equals(),但是equals()方法也不是随便用的,equals()方法经常需要经过自己重写才能实现自己想要的效果,目前来说,在对string内容的比较时,可以直接使用equals()方法进行比较;可以观察String类中写好的equals方法为我们自定义equals()方法提供灵感:

public
boolean
equals(Object anObject) {

        if (this ==
anObject) {

            return
true
;

        }

        if (anObject
instanceofString) {

            String anotherString =(String)anObject;

            int
n = value.length;

            if (n ==
anotherString.value.length) {

                char
v1[] = value;

                char
v2[] = anotherString.value;

                int
i = 0;

                while (n-- !=0) {

                    if (v1[i] !=
v2[i])

                        return
false
;

                    i++;

                }

                return
true
;

            }

        }

        return
false
;

    }

如源码所示,比如String类型的A对象在与其他对象比较时,如果比较的对象B与A对象指向的是同一物理存储区,将直接返回true。之后的逻辑表明:如果B的类型为String再进行深入比较否则直接返回false,比较时根据B的长度逐字节的比较,若有不相等的返回false,只有当全相等的时候返回true;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: