八股面试3(自用)

devtools/2024/10/20 0:19:30/

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

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.ppmy.cn/devtools/127138.html

相关文章

MySQL-19.多表设计-一对多-外键

一.多表问题分析 二.添加外键 三.外键约束的问题

【Linux】Linux进程地址空间

1.程序地址空间分配回顾 在前⾯C语⾔以及C部分介绍过⼆者的内存分配如下图所示: 全局变量区和未初始化全局变量区也被称为数据区,数据区中除了有全局变 量,还有静态变量和常量 使⽤下⾯的代码演示不同的内容所处的地址: #includ…

c# 中 中文、英文、数字、空格、标点符号占的字符大小

在C#中,中文、英文、数字、空格和标点符号在不同编码下所占的字节大小是不一样的。常见的编码有UTF-8、UTF-16、GB2312等。以下是在不同编码下各种字符类型所占的字节大小: UTF-8: 中文字符:3个字节 英文字符:1个字…

【Docker】Dockerfile 镜像实战

目录 一、构建SSH镜像 二、构建Systemctl镜像 三、nginx镜像 四、tomcat 镜像 五、mysql镜像 一、构建SSH镜像 mkdir /opt/sshd cd /opt/sshdvim Dockerfile #第一行必须指明基于的基础镜像 FROM centos:7 #作者信息 MAINTAINER this is ssh image <hmj> #镜像的操…

uniapp-uniapp + vue3 + pinia 搭建uniapp模板

使用技术 ⚡️uni-app, Vue3, Vite, pnpm &#x1f4e6; 组件自动化引入 &#x1f34d; 使用 Pinia 的状态管理 &#x1f3a8; tailwindcss - 高性能且极具灵活性的即时原子化 CSS 引擎 &#x1f603; 各种图标集为你所用 &#x1f525; 使用 新的 <script setup> …

React之组件渲染性能优化

关键词&#xff1a; shouldComponentUpdate、PureComnent、React.memo、useMemo、useCallback shouldComponentUpdate 与 PureComnent shouldComponentUpdate 与 PureComnent 用于类组件。虽然官方推荐使用函数组件&#xff0c;但我们依然需要对类组件的渲染优化策略有所了解…

【Jenkins】windows安装步骤

【Jenkins】windows安装步骤 官网使用WAR包方式运行浏览器访问Jenkinswindows-installer安装安装过程问题解决This account either does not hava the privilege to logon as a service or the account was unable to be verified 安装成功修改jenkins.xml启动jenkins访问jenki…

《数字图像处理基础》学习02-BMP位图文件

目录 一&#xff0c;BMP文件组成 二&#xff0c;使用ultra edit软件查看图像结构 1&#xff0c;ultra edit软件的下载和安装 2&#xff0c;ultra edit打开图像 三&#xff0c;使用matlab显示RGB图像 在之前的文章学习到&#xff0c;计算机只能处理数字图像&#xff0c;因…