第三章.操作符
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
booleanequals(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;
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
booleanequals(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;
相关文章推荐
- TIJ-第三章:操作符
- Thinking In Java 第三章 操作符
- java 编程思想的学习笔记 - 第三章 操作符 第四章 控制执行
- JAVA编程思想-第三章 操作符
- 第三章 php操作符与控制结构代码
- 《JAVA编程思想》学习笔记——第三章 操作符
- 《Java 编程思想》--第三章:操作符
- #Thinking in Java阅读笔记# 第三章 操作符
- 第三章 操作符
- 第三章.操作符
- 第三章 基本概念(第三部分:操作符)
- Java学习总结之第三章 操作符
- 第三章 基本的操作符
- Java编程思想笔记——第三章 操作符
- 第三章 操作符与表达式
- Java编程思想个人见解 第三章 操作符
- 操作符 Thinking in Java 第三章
- 再读thinking in Java -- 第三章 操作符 &amp; 第四章 控制执行流程
- 《java编程思想》第三章:操作符
- 第三章 操作符