Java基础 | Java中引用与指针的关系
Posted Hdparm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础 | Java中引用与指针的关系相关的知识,希望对你有一定的参考价值。
前言:关键字包含#指针,java引用,空指针,地址访问,引用类型,在Java编程语言中,程序员不需要担心程序的内存使用。Java语言的自动垃圾收集器会不时地清理那些变成垃圾的对象。如果垃圾收集没有发生,垃圾对象将保留一个内存位置,直到程序执行结束。下面讲讲之前会怎么涉及引用的知识。
Java中引用因为存储的就是地址,所以实质上引用就是指针的另一种形式,只不过这种形式是安全形式的指针,因为引用是处于被动的存储地址的一个存在,是受控的,所以是安全的。所以java使用引用来代替了指针,他指向收引用的实体。
安全性体现:
- 会检查空指针引用
- 不存在使用指针运算*(p++)
- 不能访问没有引用到的地址
- 自动回收内存
C语言与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);
参考链接:
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中引用与指针的关系的主要内容,如果未能解决你的问题,请参考以下文章