没有指针的Java语言

引用与指针

  • 引用(reference)实质就是指针(pointer)
  • 但它是受控的,安全的,如
    • 会检查空指针
    • 没有指针运算: *(p+5),因为很容易造成内存的错误访问
    • 不能访问没有引用到的内存
    • 自动回收垃圾

C语言指针在Java中的体现

  1. C: 传地址 -> Java: 对象
    • 引用类型,引用本身就相当于指针
      • 可以用来修改对象的属性、调用对象的方法
    • 基本类型:没用对应的应用
      • 如交换两个整数,不用C中的指针就没法达到交换的目标,一种变通的方法是:传出一个有两个分量x,y的对象
  2. 指针运行 -> 数组
    • *(p+5) 怎可以用 args[5]
  3. 函数指针 -> 接口(本质上是一个安全的约定)、Lambda表达式
    • 例如:求积分,线程,回调函数,事件处理
  4. 指向结点的指针 -> 对象的引用

    class Node{
        Object data;
        Node next;
    }
  5. 使用JNI

    • Java Native Interface(JNI)
    • 它允许Java代码和其他语言写的代码进行交互,可以调用其它语言代码,如C语言中的头文件等。Java在最底层要调用操作系统的api,用的就是JNI。

相等还是不等

  • ==
  • 简单地说,基本类型是值相等,引用类型是引用相等,即是否引用到同一个对象。

基本类型的相等

  • 数值类型:转换后比较
  • 浮点数,最好不直接用==,因为浮点数很多情况下存在误差
  • Double.NAN == Double.NAN结果是false,他们是“不是数的数”
  • boolean型无法与int比较
Integer i = new Integer(10);    // 将10包装成引用
Integer j = new Integer(10);
System.out.println(i == j);     // false,因为比较的是两个不同的对象

// 此时本质上是使用valueof函数,该函数有一个-128~127的对象的缓存
Integer m = 10;                 
Integer n = 10;
System.out.println(i == j);     // true,因为对象有缓存

Integer p = 200;
Integer q = 200;
System.out.println(i == j);     // false,因为比较的是两个不同的对象

枚举、引用对象是否相等

  • 枚举类型
    • 内部进行了唯一实例化,所以可以直接判断
  • 引用对象
    • 是直接看两个引用是否一样
    • 如果要判断内容是否一样,则要重写equals方法
    • 如果要重写此方法,则最好重写hashCode()方法

String对象的特殊

  • 判断相等,一定不用要==,而是要用equals
  • 但是字符串常量(String literal)及字符串常量会进行内部化(interned),相同的字符串常量是可以用==
public class TestStringEquals{
    public static void main(String[] args) {
        String hello = "Hello", lo = "lo";

        // 凡是相同的字符串常量Hello被合并到一个相同的字符串中
        // 即指向相同的地方
        System.out.println(hello == "Hello");
        System.out.println(Other.hello == hello);

        // ("Hel" + "lo")在编译时,已经被合并成字符串Hello了
        System.out.println(hello == ("Hel" + "lo"));
        // ("Hel" + lo)是变量加常量,并不会将其合并成一个字符串常量
        System.out.println(hello == ("Hel" + lo));

        // new 重新创建一个对象,和原先的字符串常量“Hello”没有关系
        System.out.println(hello == new String("Hello"));
        // intern求得内部的字符串常量
        System.out.println(hello == ("Hel" + lo).intern());
    }
}

class Other{
    static String hello = "Hello";
}
-----------OUTPUT-----------  
true
true
true
false
false
true
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值