/**
* 没有指针的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),相同的两个字符串常量是可以用==来做比较的