基本数据类型和引用数据类型区别
java中数据类型分为基本数据类型和引用数据类型
8大基本数据类型
1.整数:int,long,short,byte
2.浮点类型:float,double
3.字符类型:char
4.布尔类型:boolean
引用数据类型(除了8大基本数据类型就是引用类型)
类,接口类型,数组类型,枚举类型,注解类型,字符串String型
区别:
1.存储位置
基本数据类型存在栈中,引用数据类型存在堆中。
2.值传递与引用传递
对于基本数据类型,传递的是值本身,即当函数参数传递时,实际上是值的一个副本。函数内部的修改不会影响到原始变量。
对于引用数据类型,传递的是引用(即内存地址)。这意味着函数内部对引用数据的修改会影响到原始数据。
3.生命周期
基本数据类型的生命周期与它们所在的代码块或作用域相关。一旦超出其作用域,其值将被销毁。
引用数据类型的生命周期由垃圾回收器管理。即使引用变量超出了作用域,只要堆内存中的对象仍然被引用,它们就不会被销毁。
final修饰的引用数据类型,值可以在构造器中二次修改吗
在Java中,final
关键字不能修饰一个类,只能修饰方法或变量。虽然类也是引用数据类型,final可以修饰引用数据类型,但是不能修饰类。
final修饰的引用数据类型,值可以在构造器中二次修改
例如,当final
修饰的是引用数据类型(如对象或数组)时,它意味着这个引用本身不能被改变,也就是说你不能让final
引用指向另一个对象。但是,这并不妨碍你修改这个对象的内容。
public class Test {private final User user;public Test(User user) {this.user = user;// 这里你不能让user指向另一个User对象// this.user = anotherUser; // 这行代码会导致编译错误// 但是你可以修改user的内容user.setName("New Name");}
}class User {private String name;public User(String name) {this.name = name;}public void setName(String name) {this.name = name;}public String getName() {return name;}
}
jvm内存结构
1.堆区:这是Java虚拟机所管理的最大一块内存区域,几乎所有的对象实例和数组都将在这里分配内存。堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。从Java 8开始,字符串常量池也移动到了堆中。
2.栈区:每个线程在创建时都会创建一个虚拟机栈,其生命周期与线程相同。每一个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
3.方法区:也被称为非堆(Non-Heap),用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但它有一个别名叫做Non-Heap,目的是与Java堆区分开来。
4.程序计数器(就是写代码旁边显示的多少行):当前线程所执行的字节码的行号指示器。
5.本地栈
jvm堆栈区别
堆(Heap)
- 堆是JVM中最大的内存区域,主要用于存储对象实例和数组。
- 堆是垃圾收集器(GC)的主要管理区域。当对象不再被引用时,垃圾收集器会回收这部分内存。
- 堆中的内存分配是动态的,即程序在运行时可以动态地创建和销毁对象。
栈(Stack)
- 栈是线程私有的,每个线程都有一个自己的栈。
- 栈用于存储方法的执行信息,包括局部变量表、操作数栈、动态链接等。
- 栈的大小是固定的,每个线程的栈深度由JVM决定。
- 栈的生命周期与线程相同,当线程结束时,栈也会销毁。
set能不能存null
首先先明确,hashSet是基于hashMap实现的,又要明确hashMap和hashTable的区别
hashMap线程不安全,hashTable线程安全,其实现方法里面都添加了synchronized关键字来确保线程同步。
hashMap可以使用null作为key,hashTable不允许null作为key,因此结合上述hashSet是基于hashMap实现的,所以,hashSet可以使用null作为key
索引过多对操作有什么影响
索引:提高检索效率,降低排序成本,索引对应的字段有自动排序的功能,默认升序
缺点:
1.创建和维护索引需要耗时,并且随着数据量的增加而增加
2.索引需要占用物理空间,随数据量增加而增加
3.降低表的增删改的效率,每次增删改索引都需要进行动态维护
索引的适用场景:较为频繁的作为查询条件的字段
不适用的场景:
1.字段值的唯一性太差不适合做索引,即该字段的数据太多重复就不适合做索引
2.更新非常频繁的字段
3.不会作为查询条件(不会出现在where语句)不适合做索引