3

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

 2 years ago
source link: https://blog.51cto.com/u_15764755/5660037
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

安全性体现:

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

C语言与Java指针的关系

Java基础 | 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基础 | Java中引用与指针的关系_java_02

参考链接:

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK