当前位置: 首页 > article >正文

八股面试3(自用)

基本数据类型和引用数据类型区别

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语句)不适合做索引

concurrentmap


http://www.kler.cn/a/354803.html

相关文章:

  • Debian-linux运维-docker安装和配置
  • 写在2024的最后一天
  • 在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件
  • rm误删掉的文件夹/文件如何恢复
  • 常用的linux命令介绍
  • 通过无障碍服务(AccessibilityService)实现Android设备全局水印显示
  • 机器学习与神经网络:物理学的新边疆
  • docker 复制文件,清除不再使用数据导出以及导出文件系统
  • 搜维尔科技:力反馈遥操作解决方案,五指灵巧手遥操作解决方案
  • Java初学者的学习顺序
  • 网络基础知识:六大交换机关键知识解析
  • 无人机之遥感影像处理篇
  • 国产 HDMI 发送芯片,兼容 HDMI1.4b 及 HDMI 1.4b 下的视频 3D 传输格式。
  • JavaScript 第9章:面向对象编程
  • 虎牙Android面试题及参考答案
  • C++ 方法积累
  • 【优选算法】(第三十六篇)
  • 【实战案例】Nacos从安装到服务注册发现再到配置中心(附常见问题解决方案)
  • 前端开发设计模式——状态模式
  • 【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用
  • C# 将PDF文档转换为Markdown文档
  • Go语言Gin框架调用企业微信接口根据手机号获取userid
  • 滚雪球学Redis[7.3讲]:Redis在排行榜系统中的应用:高效构建与优化
  • 【C++刷题】力扣-#136-只出现一次的数字
  • FPGA基于SRIO Auraro 三速以太网 IIC SPI等多协议的高速传输处理项目
  • AOT漫谈专题(第三篇): 如何获取C#程序的CPU利用率