【学习笔记】 唐大仕—Java程序设计 第5讲 深入理解Java语言之5.8 没有指针的Java语言
/**
* 没有指针的Java语言 学习笔记
* @author cnRicky
* @date 2018.11.11
*/
没有指针的Java语言
引用与指针
- 引用(reference)实质就是指针(pointer)
- 但是它是受控的、安全的
- 比如
- 会检查指针是否为空
- 没有指针运算*(p+5);
- 不能访问没有引用到的内存
- 自动垃圾回收
C语言指针在Java中的体现
-
(1)传地址(C) -> 对象(Java)
- 引用类型,引用本身就相当于指针
- 可以用来修改对象的属性、调用对象的方法
- 基本类型(primitive type):没有对应的
- 如交换两个整数
- void swap(int x, int y){ int t = x; x = y; y = t; }
- int a = 8, b = 9; swap(a, b);
- 一种变通的办法,传出一个有两个分量x,y的对象
- 引用类型,引用本身就相当于指针
-
(2)指针运算(C) -> 数组(Java)
- *(p+5) 则可以用args[5]
-
(3)函数指针 -> 接口、Lambda表达式
-
(4)指向结点的指针 -> 对象的引用
class Node{
Object date;
Node next;
}
- 使用JNI
- Java Native Interface(JNI)
- 它允许Java代码和其他语言写的代码进行交互
相等还是不等
- ==
- 简单地说,基本类型是值相等,引用类型是引用相等(两个引用是否引用到了同一个对象实体上)
- 但有不少具体情况需要具体分析
基本类型的相等
- 基本类型
- 数值类型:转换后比较
- 浮点数,最好不直接用==
- Double.NAN == Double.NAN 结果为false
- 请参见JDK的API文档
- boolean型无法与int相比较
思考实例
Integer i = new Integer(10);
Integer j = new Integer(10);
System.out.println(i==j);//false,因为对象是两个
Integer m = 10;
Integer n = 10;
System.out.println(m==n);//true,因为对象有缓存
Integer p = 200;
Integer q = 200;
System.out.println(p==q);//false,因为对象是两个
- 注意缓存这种机制
枚举、引用对象是否相等
-
枚举类型
- 内部进行了唯一实例化,所以可以直接判断
-
引用对象
- 是直接看两个引用是否一样
- 如果要判断内容是否相等,则要写equals方法
- 如果重写equals方法,则最好重写hasCode()方法
String对象的特殊性
- String对象
- 判断相等,一等不要用==,要用equals
- 但是字符串常量(String literal)及字符串常量会进行内部化(interned),相同的两个字符串常量是可以用==来做比较的