Java面试题基础

Java基础(不断更新)

大厂非常重视Java基础

Java 是值传递还是引用传递?有引用传递吗?

原文参考:https://juejin.im/post/5bce68226fb9a05ce46a0476

值传递和引用传递

  • 值传递:在方法被调用时,实参通过形参把它的内容副本传入方法内部,也就是方法内部操作的是实参值的一个拷贝副本,方法内对形参的任何操作不会影响到实参的原始内容。
  • 引用传递:在方法调用时,实参的地址通过方法调用传入形参,形参和实参指向同一个地址,对形参的操作会影响实参的内容。
    在Java中都是值传递,不存在引用传递,也就是说传递的都是一个副本。只不过在传递过程中:基本数据类型原始内容和副本都是存储实际值,并且在不同的栈中,因此形参的操作不会影响原始的内容。
    引用类型,如果形参和实参指向同一个对象地址,形参的操作会影响实参的实际内容;如果形参被改动指向的对象地址,形参的改变不会影响实参的内容。

形参和实参

  • 形参:方法被调用时需要传递的参数,它只有在方法被调用时才有意义,才会被分配内存。方法执行完成,就会被释放
  • 实参:方法被调用时传入的参数,它在方法被调用前已经初始化了。

JVM 内存分配

Java运行过程:通过java编译器将.Java文件编译为.class文件,JVM开辟一片内存空间(数据运行区域),通过类加载器加到书就运行区域来存储执行期间需要存储的数据和信息。

JVM 内存划分:

  • 虚拟机栈:是线程私有的,一个被调用的方法对于一个栈帧,每个栈帧中包含:局部变量表,操作数栈,指向运行时常量池的引用,方法返回地址。
  • 堆:一个JVM只有一个堆,堆是线程共享的。
  • 方法区:是一块线程内存共享的内存逻辑区域,在JVM中只有一个方法区,是线程共享的,也是线程安全的,方法区存储的内容包括:类的路径名,常量池,静态变量,类型引用等。
  • 本地方法栈:功能和虚拟机栈是基本一致的,并且也是线程私有的,它们的区别在于虚拟机栈是为执行Java方法服务的,而本地方法栈是为执行本地方法服务的。
  • 程序计数器:线程私有的。记录着当前线程所执行的字节码的行号指示器,在程序运行过程中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。

数据的存储:

  • 基本数据类型的局部变量(方法体内的定义的变量),变量名和值都直接存储在栈中,栈中的数据在当前线程下是共享的,基本数据类型的数据本身是不会改变的,当局部变量重新赋值时,并不是在内存中改变值的内容,而是在栈中寻找是否已存在需要赋值的数据,(如不存在重新开辟内存空间存储新的值),然后将基本数据类型的局部变量的引用指向新的地址。
  • 基本数据类型的成员变量:定义在类体内,变量名和值都存储在堆中,其生命周期和对象的是一致的。
  • 基本数据类型的静态变量:静态变量随类创建而创建,随类消失而消失,变量名和值都存放在方法区的常量池内。
  • 引用数据类型的存储:变量名存在栈中,变量值存放的是对象的地址。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章