Java八股文学习笔记day01

news2025/1/21 15:36:49

01.==和equals区别

对于字符串变量来说,使用"=="和"equals"比较字符串时,其比较方法不同。"=="比较两个变量本身的值,即两个对象在内存中的首地址,"equals"比较字符串包含内容是否相同。

对于非字符串变量来说,如果没有对equals()进行重写的话,"==" 和 "equals"方法的作用是相同的,都是用来比较对象在堆内存中的首地址,即用来比较两个引用变量是否指向同一个对象。

  • ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;

  • equals():比较的是两个字符串的内容,属于内容比较。

02.final、finally、finalize的区别?

final、finally 和 finalize 从英文字面角度来看,看似很像,实则 3 者在 Java 中没任何关系。

  • final 用于修饰变量、方法和类。当应用于类时,final表示该类不能被继承。当应用于方法时,final表示该方法不能被子类重写。当应用于变量时,final表示该变量的值不能被修改,即为常量。

  • finally 用于异常处理中的try-catch-finally语句块的关键词。finally块中的代码无论是否发生异常,都会被执行。它通常用于释放资源、关闭连接或执行一些必要的清理操作。finally块可以和try块或者catch块一起使用,也可以单独使用。

  • finalize是Object类中的一个方法,用于垃圾回收机制。当一个对象即将被垃圾回收器回收时,finalize方法会被自动调用。它可以被子类重写,用于在对象被销毁之前执行一些清理操作,如关闭文件、释放资源等。但是,在实际开发中不推荐使用 finalize 方法,它虽然被创造出来,但无法保证 finalize 方法一定会被执行,所以不要依赖它释放任何资源,因为它的执行极不“稳定”。在 JDK 9 中将它废弃,也很好的证明了此观点。

03.try{return “a”} fianlly{return “b”}这条语句返回啥

finally块中的return语句会覆盖try块中的return返回,因此,该语句将返回"b"。

04.hashmap、hashtable、concurrenthashmap区别

HashMap 是线程不安全的,在多线程的环境中,还是会存在多个线程并发对同一个共享数据进行操作从而引发的线程安全。

在多线程的环境下可以使用的哈希表有:Hashtable  和 ConcurrentHashMap 。

  • Hashtable 为了保证线程安全问题,将每个关键的方法都加上了 synchronized 关键字,这就相当于针对 hashtable 对象本身加锁,多线程并发执行,同一单位时间内,只能有一个线程能(获取到对象锁,并加锁,一个对象只有一把锁,线程只有拿到锁才能够继续执行)争对 hashtable 进行操作,其他的线程阻塞等待,加锁操作有时间消耗,包括释放锁之后唤醒其他线程来竞争锁都是一笔开销,所以 Hashtable 整体在单线程中效率是低于 hashMap 的,在多线程的环境下效率也是极低的。

  • ConcurrentHashMap 可以看作是 hashMap 线程安全的版本,在 JDK 1.7 的时候跟 hashMap 一样都是 数组 + 链表的结构。在线程安全的角度也是在 hashtable 的基础上做了一系列改进和优化,hashtable 是针对整个对象加锁,在 JDK1 .7 的时候 ConcurrentHashMap 采用的分段加锁的机制,对每一个“段”来加锁。在JDK 1.8 中取消了分段锁的安全机制,而是给每个哈希桶(每个链表)分配一个锁,在数据结构方面改进成数组 + 链表 + 红黑树的方式,当链表大于等于8 个元素就转换成红黑树。

05.ThreadLocal 原理

ThreadLocal可以理解为线程本地变量,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离,相比于synchronized的做法是用空间来换时间。

ThreadLocal有一个静态内部类ThreadLocalMap,ThreadLocalMap又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备了保存key value键值对的能力。

弱引用的目的是为了防止内存泄露,如果是强引用那么ThreadLocal对象除非线程结束否则始终无法被回收,弱引用则会在下一次GC的时候被回收。

但是这样还是会存在内存泄露的问题,假如key和ThreadLocal对象被回收之后,entry中就存在key为null,但是value有值的entry对象,但是永远没办法被访问到,同样除非线程结束运行。

但是只要ThreadLocal使用恰当,在使用完之后调用remove方法删除Entry对象,实际上是不会出现这个问题的。

  

ThreadLocal 是一个线程的本地变量,也就意味着这个变量是线程独有的,是不能与其他线程共享的,这样就可以避免资源竞争带来的多线程的问题,这种解决多线程的安全问题和lock(这里的lock 指通过synchronized 或者Lock 等实现的锁) 是有本质的区别的:

  1. lock 的资源是多个线程共享的,所以访问的时候需要加锁。

  2. ThreadLocal 是每个线程都有一个副本,是不需要加锁的。

  3. lock 是通过时间换空间的做法。

  4. ThreadLocal 是典型的通过空间换时间的做法。

06.线程池原理(参数、执行过程、拒绝策略)

线程池是为了减少频繁的创建线程和销毁线程带来的性能损耗。

线程池的构造函数有7个参数:

  • corePoolSize:线程池核心线程数量。默认情况下,线程池中线程的数量如果 <= corePoolSize,那么即使这些线程处于空闲状态,那也不会被销毁。

  • maximumPoolSize:线程池中最多可容纳的线程数量。当一个新任务交给线程池,如果此时线程池中有空闲的线程,就会直接执行,如果没有空闲的线程且当前线程池的线程数量小于corePoolSize,就会创建新的线程来执行任务,否则就会将该任务加入到阻塞队列中,如果阻塞队列满了,就会创建一个新线程,从阻塞队列头部取出一个任务来执行,并将新任务加入到阻塞队列末尾。如果当前线程池中线程的数量等于maximumPoolSize,就不会创建新线程,就会去执行拒绝策略。

  • keepAliveTime:当线程池中线程的数量大于corePoolSize,并且某个线程的空闲时间超过了keepAliveTime,那么这个线程就会被销毁。

  • unit:就是keepAliveTime时间的单位。

  • workQueue:工作队列。当没有空闲的线程执行新任务时,该任务就会被放入工作队列中,等待执行。

  • threadFactory:线程工厂。可以用来给线程取名字等等

  • handler:拒绝策略。当一个新任务交给线程池,如果此时线程池中有空闲的线程,就会直接执行,如果没有空闲的线程,就会将该任务加入到阻塞队列中,如果阻塞队列满了,就会创建一个新线程,从阻塞队列头部取出一个任务来执行,并将新任务加入到阻塞队列末尾。如果当前线程池中线程的数量等于maximumPoolSize,就不会创建新线程,就会去执行拒绝策略。

主要有这四种拒接策略:

线程池执行过程如下:

任务调度流程

  1. 首先检测线程池运行状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING的状态下执行任务。

  2. 如果workerCount < corePoolSize,则创建并启动一个线程来执行新提交的任务。

  3. 如果workerCount >= corePoolSize,且线程池内的阻塞队列未满,则将任务添加到该阻塞队列中。

  4. 如果workerCount >= corePoolSize && workerCount < maximumPoolSize,且线程池内的阻塞队列已满,则创建并启动一个线程来执行新提交的任务。

  5. 如果workerCount >= maximumPoolSize,并且线程池内的阻塞队列已满, 则根据拒绝策略来处理该任务, 默认的处理方式是直接抛异常。

07.说一下JVM加载一个类的过程

JVM 中类的装载是由类加载器,也就是ClassLoader,和它的子类来实现的,Java 中的类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。

由于 Java 的跨平台性, 经过编译的 Java 源程序并不是一个可执行程序, 而是一个或多个类文件。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接( 验证、 准备和解析)和初始化。

类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应的 Class 对象。加载完成后, Class 对象还不完整, 所以此时的类还不可用。当类被加载后就进入连接阶段, 这一阶段包括验证、准备( 为静态变量分配内存并设置默认的初始值) 和解析( 将符号引用替换为直接引用) 三个步骤。

最后 JVM 对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句, 就依次执行这些初始化语句。

08.垃圾收集有哪些算法?

  • Serial 收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。

  • ParNew 收集器,ParNew 收集器其实就是 Serial 收集器的多线程版本。

  • Parallel 收集器,Parallel Scavenge 收集器类似 ParNew 收集器,Parallel 收集器更关注系统的吞吐量。

  • Parallel Old 收集器,Parallel Old 是 Parallel Scavenge 收集器的老年代版本,使用多线程和“标记-整理”算法

  • CMS 收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。

  • G1 收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征

09.String s = new String(“abc”)执行过程中分别对应哪些内存区域?

首先,我们看到这个代码中有一个new关键字,我们知道new指令是创建一个类的实例对象并完成加载初始化的,因此这个字符串对象是在运行期才能确定的,创建的字符串对象是在堆内存上

其次,在String的构造方法中传递了一个字符串abc,由于这里的abc是被final修饰的属性,所以它是一个字符串常量。在首次构建这个对象时,JVM拿字面量"abc"去字符串常量池试图获取其对应String对象的引用。于是在堆中创建了一个"abc"的String对象,并将其引用保存到字符串常量池中,然后返回;

所以,如果abc这个字符串常量不存在,则创建两个对象,分别是abc这个字符串常量,以及new String这个实例对象。如果abc这字符串常量存在,则只会创建一个对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/950821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VR司法法治教育平台,沉浸式课堂教学培养刑侦思维和能力

VR司法法治教育平台提供了多种沉浸式体验&#xff0c;通过虚拟现实(Virtual Reality&#xff0c;简称VR)技术让用户深度参与和体验法治知识。以下是一些常见的沉浸式体验&#xff1a; 1.罪案重现 VR司法法治教育平台可以通过重现真实案例的方式&#xff0c;让用户亲眼目睹罪案发…

基于天鹰算法优化的BP神经网络(预测应用) - 附代码

基于天鹰算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于天鹰算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.天鹰优化BP神经网络2.1 BP神经网络参数设置2.2 天鹰算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Python 的画图函数 seaborn 简介

seaborn 简介 seanborn 是 Python 的另外一个常用工具包&#xff0c;它基于 matplotlib&#xff0c;但画出的图形更加美观些&#xff0c;并且与 Pandas 的数据类型结合地较好。 # Import seaborn import seaborn as sns import matplotlib.pyplot as plt# Apply the default …

选择一款可靠的仓库管理软件

在选择仓库管理软件时&#xff0c;数据的准确性、数据的安全性和软件的稳定性这三点是至关重要的。下面我们将详细讨论这些关键点。 第一&#xff0c;数据的准确性对于一个仓库管理软件来说是非常重要的。如果数据的准确性无法得到保证&#xff0c;那么这样的仓库入库出库管理…

华为OD七日集训第1期复盘 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、活动内容如下第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、双指针第5天、递归回溯第6天、二分查找第7天、贪心算法 && 二叉树 二、可观测性工程1、简介2、主要内容 大家好&#xff0c;我是哪吒。 最近一直在刷华为OD机试的算法题&#xff0c;坚持…

RT-Thread内核机制 线程栈

int flag;void cmp_val(int a,int b) {volatile int tmp[10];tmp[0] a;if(tmp[0] > b){flag 1;}else{flag 0;} }int main() {int a 1;int b ;cmp_val(a,b);return 0; }我们写好的程序会保存在Flash上。 其它类似汇编指令 SUB R0,R0,#4 R0 R0-4 B LR 放入LR寄存器 局…

Swift使用PythonKit调用Python

打开Xcode项目。然后选择“File→Add Packages”&#xff0c;然后输入软件包依赖链接&#xff1a; ​https://github.com/pvieito/PythonKit.git https://github.com/kewlbear/Python-iOS.git Python-iOS包允许在iOS应用程序中使用python模块。 用法&#xff1a; import Pyth…

超大屏画质奇迹 !TCL 115吋 QD-Mini LED 电视成豪宅顶配

有目共睹的是&#xff0c;现如今的电视屏幕越做越大。 尤其近年来&#xff0c;大屏电视的趋势愈发明显&#xff0c;原因无他&#xff0c;大屏电视所带来的震撼视觉体验&#xff0c;是其他电视所无法比拟的&#xff0c;这也正是电视品牌们不断突破新局限&#xff0c;往“大”了…

Python 画多个子图函数 subplot

子图函数 subplot 若要 pyplot 一次生成多个图形&#xff0c;一般要用到subplot函数&#xff0c;另外还有一个subplots函数。两个函数比较接近但略有区别&#xff0c;限于篇幅&#xff0c;我们只介绍 subplot函数&#xff0c;它的基本语法如下&#xff1a; ax plt.subplot(n…

【C语言基础】变量类型,Static关键字的使用

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【C/C++】#define宏替换高级用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

载舟前行——2023跳槽涨薪,Android的1000道面试题

转眼没有口罩的一年&#xff0c;就来到下半年。比起之前几年今天愈发的艰难&#xff1b;今年的金九银十的来到&#xff0c;许多跳槽找工作的也来到了旺季。岗位的减少无疑造成的后果就是竞争大&#xff0c;所以面试优胜劣汰你需要在千百人中脱颖而出。 面试不容小觑&#xff0…

英文晨读记录(broken heart)

2023/8/28 mate 配偶;伙伴;朋友;(男人之间常 用)哥儿们&#xff0c;伙计&#xff0c;老兄;同伴;subject n. 主题;问题;学科;课程;科目;话题;题目;题材;表现对象; adj. 服从于;取决于;视…而定;易遭受…的;受…支配;可能受…影响的;受异族统治的 vt. 使臣服;使顺从;(尤指)压服 …

Go 面向对象(匿名字段)

概述 严格意义上说&#xff0c;GO语言中没有类(class)的概念,但是我们可以将结构体比作为类&#xff0c;因为在结构体中可以添加属性&#xff08;成员&#xff09;&#xff0c;方法&#xff08;函数&#xff09;。 面向对象编程的好处比较多&#xff0c;我们先来说一下“继承…

软件系统测试报告包括哪些内容?对软件产品起到什么作用?

软件系统测试报告是软件开发过程中非常重要的一环。它是一个详细记录了对系统进行测试的结果和总结的文档。通过系统测试报告&#xff0c;开发人员可以了解系统在测试过程中的表现&#xff0c;发现系统的问题和不足之处&#xff0c;从而采取相应的措施进行改进。 一、软件系统…

睿趣科技:抖音开小店大概多久可以做起来

随着移动互联网的快速发展&#xff0c;社交媒体平台成为了人们分享生活、交流信息的主要渠道之一。在众多社交平台中&#xff0c;抖音以其独特的短视频形式和强大的用户粘性受到了广泛关注。近年来&#xff0c;越来越多的人通过在抖音上开设小店来实现创业梦想&#xff0c;这种…

CSPM考试如何报名?证书在哪查?

WOW&#xff01;咱们国家自己的项目管理证书来了&#xff01;&#xff01; 下面我将从7个方面对国标项目管理证书CSPM详细介绍&#xff1a; &#xff08;1&#xff09;CSPM是什么证书&#xff1f; &#xff08;2&#xff09;和PMP什么关系&#xff1f; &#xff08;3&#…

Windows系统下MMDeploy预编译包的使用

Windows系统下MMDeploy预编译包的使用 MMDeploy步入v1版本后安装/使用难度大幅下降&#xff0c;这里以部署MMDetection项目的Faster R-CNN模型为例&#xff0c;将PyTorch模型转换为ONNX进而转换为Engine模型&#xff0c;部署到TensorRT后端&#xff0c;实现高效推理&#xff0c…

SQL注入漏洞复现(CVE-2017-8917)

文章目录 搭建环境启动环境漏洞复现报错注入使用sqlmap 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub Docker Compose是 docker 提供的一个命令行工具&…

PKI/CA体系介绍

概述 目前最常用的第三方认证服务包括&#xff1a;PKI/CA和Kerberos。PKI/CA是基于非对称密钥体系的&#xff0c;Kerberos是基于对称密钥体系的。 数字证书&#xff1a;提供一种发布公钥的简便途径&#xff1b; 数字签名&#xff1a;用来确认信息发送者的身份&#xff0c;保证…