Java基础 | Java中引用与指针的关系

Posted Hdparm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础 | Java中引用与指针的关系相关的知识,希望对你有一定的参考价值。

前言:关键字包含#指针,java引用,空指针,地址访问,引用类型,在Java编程语言中,程序员不需要担心程序的内存使用。Java语言的自动垃圾收集器会不时地清理那些变成垃圾的对象。如果垃圾收集没有发生,垃圾对象将保留一个内存位置,直到程序执行结束。下面讲讲之前会怎么涉及引用的知识。

Java中引用因为存储的就是地址,所以实质上引用就是指针的另一种形式,只不过这种形式是安全形式的指针,因为引用是处于被动的存储地址的一个存在,是受控的,所以是安全的。所以java使用引用来代替了指针,他指向收引用的实体。

安全性体现:

  • 会检查空指针引用
  • 不存在使用指针运算*(p++)
  • 不能访问没有引用到的地址
  • 自动回收内存

C语言与Java指针的关系

Java基础

传地址与对象

引用类型:引用本身就相当于指针,所以可以用来修改对象的属性,调用对象的方法两大功能。

基本类型:

指针运算可以用数组代替,*(p+5)可以用args[5]代替

函数指针是在Java中使用接口,Lambda表达式,可以进行求积分,线程,回调函数,事件处理。指向结点的指针指的是Java中对象的引用Node next,实现链表中的结点,树结构中的结点。

使用JNI本地接口(Java Native Interface),他允许Java代码和其他语言的代码进行交互。

相等还是不相等区分:

基本类型是值相等,引用类型是引用的对象相同。

基本类型使用要注意的地方:

  • 数值类型:转换后比较相等
  • 浮点数:不要直接使用==
  • 注意Boolean类型不能与int比较
  • 注意Bouble.NAN==Double.NAN 结果为false

枚举类型:

  • 内部进行了唯一实例化,所以可以直接判断

引用对象类型:

  • 关注的是引用是否一样
  • 判断内容一样,使用equals方法失效
  • 所以要重新写equals的同时,记得修改hashCode()方法

String对象:

  • 判断相等,注意一定不要用==,使用equals方法
  • 注意字符串常量会进行内部化相等处理,唯一可以使用==

代码分析,可以看到得到结果是false,因为对象是两个,不是一个对象,所以是false

Integer i=new Integer(10);
Integer j=new Integer(10);
System.out.println(i==j);

下面两个整数是基本类型,并且因为有缓存的存在,m与n都表示同一个地方的数字10,所以true。

Integer m=10;
Integer n=10;
System.out.println(m==n)

下面两个之间的数字已经超过了127整数值,所以不会存在正确的赋值,所以被引用到两个不同的地方,所以两个整数的对象是两个,虽然值相等,但是结果是false。

Integer p=300;
integer q=300;
System.out.println(q==p);

String.intern()方法的需要和工作:

在Java中创建字符串时,它会占用堆中的内存。另外,我们知道String类是不可变的。因此,无论何时我们使用new关键字创建字符串,都会在堆中为相应的字符串分配新的内存,而与数组的内容无关。下面的代码片段得到两个对象的结果为False,因为不是字符串常量

String str = new String("Welcome to Java");   
String str1 = new String("Welcome to Java");
System.out.println(str1 == str);

在Java中创建对象是一项开销很大的操作。因此,为了节省时间,Java开发人员提出了字符串常量池(String Constant Pool, SCP)的概念。SCP是堆内存中的一个区域。它包含唯一的字符串。为了将字符串放入字符串池中,需要调用intern()方法。在字符串池中创建对象之前,JVM检查该字符串是否已经存在于池中。如果字符串存在,则返回它的引用。

下面结果前面对象引用不同,所以结果为Fasle,后面常量引用相同,所以True。

public class InternExample  
public static void main(String args[])
String s1=new String("hello");
String s2="hello";
String s3=s1.intern();
System.out.println(s1==s2);
System.out.println(s2==s3);

Java基础



参考链接:

1.https://www.javatpoint.com/java-string-intern

2.https://docs.oracle.com/javase/8/docs/api/java/lang/ref/Reference.html​​

3.https://java-programming.mooc.fi/part-5/4-objects-and-references


以上是关于Java基础 | Java中引用与指针的关系的主要内容,如果未能解决你的问题,请参考以下文章

java基础

Java基础学习:集合篇

Java面试准备之Java基础

String不是基本数据类型

Java引用类型与指针的前世今生

Java描述数据结构之链表的增删改查