秋招备战——Java基础知识

news2024/10/10 14:31:39

垃圾回收,JVM常用参数

将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

对新生代的对象收集称为minor GC

对老生代的对象收集称为full GC

程序中主动调用System.gc()强制执行的GC为full GC。

Xms堆内存的最小大小,默认为物理内存的1/64

Xmx堆内存的最大大小,默认为物理内存的1/4

Xmn堆内新生代的大小,通过这个值也可以得到老生代的大小:Xmx减去Xmn。

char和byte的区别

一个字符类型,无符号型的,占2个字节(Unicode码),Java用char来表示一个字符;一个是字节类型,有符号型,占1个字节。

int和byte能否相互转换

可以相互转换,byte占1字节,而int占用4个字节,不会照成精度损失。

数组和链表的区别

数组是连续的内存空间,适合通过索引查找,查找和修改比较方便;链表不一定是连续的内存空间,添加和删除比较方便。

红黑树的特点

解决平衡二叉查找树的缺点:不适合需要大量插入、删除和查找的场景,需要左旋和右旋来保证平衡,引入红黑树,每条路径的黑色节点数相同,红色节点不能相同,时间复杂度O(logn)。红黑树的特性:红黑树是近似平衡的二叉查找树,支持高效的查找、插入和删除元素,查找删除和插入的效率稳定。红黑树更适合应对实际开发过程中的复杂场景。

父节点为红,子节点还能是红色吗

不可以,需要把红色节点先变成黑色。

排序算法哪些是稳定的

稳定性体现在相同数字在排序之后后面的不会出现到前面

稳定算法:插入排序、冒泡排序、归并排序、基数排序;不稳定算法:希尔排序、选择排序、堆排序、快速排序。

设计模式有哪些?单例模式、工厂模式,单例模式怎么实现?spring中的单例模式和普通单例模式有什么区别?

单例模式:枚举实现、静态内部类实现、利用Spring的依赖注入能力实现单例、双重检查锁。Spring中的单例模式和普通单例模式的区别:spring中的单例是相对于容器,既在ApplicationContext中是单例的。而平常所说的单例是相对于JVM的。另一个JVM可以有多个Spring容器,而且Spring中的单例也只是按bean的id来区分的。

collection 和 collections

collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,实现该接口的类主要有List和Set。

collections是针对集合类的一个包裹类,它提供了一系列静态方法实现对各种集合的搜索、排序以及线程安全化等操作。如sort()对集合进行排序,min(),max()求集合的最大值和最小值。

synchronized和reentranLock的区别

  1. Reentrant Lock显示地获得释放锁,synchronized隐式获得释放锁;
  2. ReentrantLock可响应中断,可轮回,synchronized是不可以响应中断的
  3. reentranLock是API级别的,synchronized是JVM级别的
  4. ReentrantLock可以实现公平锁;
  5. ReentrantLock通过Condition可以绑定多个条件;
  6. 底层实现不一样,synchronized是同步阻塞,使用的是悲观并发策略,lock是同步非阻塞,采用的是乐观并发策略;
  7. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现
  8. synchronized在发生异常时,会自动释放线程中的锁,因此不会导致死锁现象发生;而lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁。

synchronized底层如何实现,锁升级的过程

synchronized底层通过不同的锁实现。线程获取共享资源时,
第一步:检查mark world里面是不是放的自己的Thread,如果是,表示当前线程是处于“偏向锁”。
第二步:如果mark world不是自己的threadID,锁升级,这时候,用CAS来执行切换,新的线程根据MarkWorld里现有的ThreadId,通知之前线程暂停,之前线程将MarkWOrld的内容置空。
第三步:两个线程都把锁对象的hashcode复制到自己新建的用于存储锁的记录空间,接着开始通过cas操作,把锁对象的MarkWorld的内容修改为自己新建的记录空间的地址的方式竞争MarkWorld。
第四步:第三步中成功执行的CAS获得资源,失败的则进入自旋。
第五步:自旋的线程在自旋过程中,成功获得资源,则整个状态依然处于轻量级锁的状态,如果自旋失败。
第六步:进入重量级锁的状态,这个时候,自旋的线程进行阻塞,等待之前线程完成并唤醒自己。

List、Set、Map的区别

List:一个有序容器,元素存入集合的顺序和取出顺序一致,,元素可以重复,可以出入null元素,元素都有索引。常用的有ArrayList、LinkedList和Vector。

Set:无序容器,存入和取出顺序不一致,不可以存储重复元素,只允许存入一个null元素,必须保证元素的唯一性。set接口常用的实现类是HashSet、LinkedHashSet、TreeSet

Map:是一个键值对集合,存储键、值和之间的映射。key无序,唯一;value不要求有序,允许重复。Map常用的有HashMap、Tree Map、Hash Table、LinkedHashMap、ConcurrentHashMap.

集合框架底层的数据结构

List集合:Arraylist和Vector使用的是 Object 数组, LinkedList使用双向循环链表

set集合:HashSet(无序,唯一):基于 HashMap 实现的,HashSet的值作为key,value是Object类型的常量
LinkedHashSet继承HashSet,并且通过 LinkedHashMap 来实现的
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)

Map集合:HashMap由数组+链表+红黑树组成,数组是是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,当链表长度大于阈值(默认为8)并且数组长度大于64时,将链表转化为红黑树

LinkedHashMap(有序) 继承自 HashMap,底层仍然是数组+链表+红黑树组成。另外,LinkedHashMap 在此基础上,节点之间增加了一条双向链表,使得可以保持键值对的插入顺序

HashTable无序,数组+链表组成的,数组是 HashTable的主体,链表则是主要为了解决哈希冲突而存在的

TreeMap有序,红黑树

复合框架的扩容

ArrayList和Vector默认初始容量为10,当元素个数超过容量长度时都进行进行扩容,ArrayList扩容为原来的1.5倍,而Vector扩容为原来的2倍

HashSet和HashMap默认初始容量为16,加载因子为0.75:即当元素个数超过容量长度的0.75倍时,进行扩容,扩容为原来的2倍。HashSet基于 HashMap 实现的,因此两者相同

HashTable:默认初始容量为11,加载因子为0.75,扩容策略是2倍+1,如 初始的容量为11,一次扩容后是容量为23

HashMap的实现原理以及JDK1.7和JDK1.8的区别

JDK1.7是数组+链表,无冲突时,存放数组;冲突时,存放链表;采用头插法。

JDK1.8是数组 + 链表 + 红黑树,无冲突时,存放数组;有冲突存放链表或者红黑树,当链表长度大于阈值(默认为8)并且数组长度大于64时,将链表转化为红黑树;树元素小于等于6时,树结构还原成链表形式。

HashMap是怎么解决哈希冲突的?

(1)使用链地址法(链表)来链接拥有相同hash值的数据;
(2)使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;
(3)引入红黑树进一步降低遍历的时间复杂度,使得遍历更快。

扰动函数的解释:

如果只使用hashCode取余,那么相当于参与运算的只有hashCode的低位,高位是没有起到任何作用的,所以我们的思路就是让hashCode的高位也参与进行运算,来获取hash值,进一步降低hash碰撞的概率,使得数据分布更平均,我们把这样的操作称为扰动。

ConcurrentHashMap底层的具体实现

在JDK1.7中,concurrenthashMap是由Segment数组结构和Hash Entry数据结构组成。segment继承了ReentrantLock,是一种可重入锁。Hash Entry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,一个Segment里包含一个HashEntry数组,每个HashEnrty是一个链表结构的元素,因此JDK1.7的concurrentHashMap是一种数组+链表结构。当对HashEnrty数组的数据进行修改时,必须首先获得与它对应的锁,这样才能保证线程安全,也就实现了全局的线程安全。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4z2vmVc2-1662292004425)(en-resource://database/1127:1)]

而在JDK1.8中采用Node + CAS+synchronized来保证并发安全进行实现,synchronized只锁定当前链表或红黑二叉树的首节点。如果相应位置上的Node没有初始化,则调用CAS插入相应的数据;如果相应位置的Node不为空,如果该节点的
如果该节点的first.hash!=-1,则对该节点加synchronized锁,更新节点或插入新节点; 如果该节点的first.hash=-1,则扩容。读操作无锁,Node节点的val和next使用volatile修饰,数组也用volatile修饰。

双亲委派机制

当一个类加载器收到了类加载请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候,才会由当前这个加载器来负责类的加载。

Java中提供四种类型的加载器,具体如下:

Bootstrap ClassLoader类加载器:主要负责加载Java核心类库,
%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。

Extention CLassLoader扩展类加载器:主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。

Application ClassLoader(应用程序类加载器):主要负责加载当前应用的classpath下的所有类

User ClassLoader(用户自定义类加载器):用户自定义的类加载器可加载指定路径的class文件。

这四种类加载器存在如下关系,当进行类加载的时候,虽然用户自定义类不会由bootstrap classloader或是extension classloader加载(由类加载器的加载范围决定),但是代码实现还是会一直委托到bootstrap classloader, 上层无法加载,再由下层是否可以加载,如果都无法加载,就会触发findclass,抛出classNotFoundException.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ophNl0Cp-1662292004427)(en-resource://database/1129:1)]

加载器之间的层级关系并不是以继承的方式存在的,而是以组合的方式处理的。

双亲委派机制的意义:

  1. 通过委派的方式,可以避免类的重复加载,当父加载器已经加载某一个类时,子加载器就不会再重新加载这个类。
  2. 通过双亲委派的方式,还保证了安全性。因为启动加载器在加载的时候,只会加载Java-home中的jar包里面的类,那么这个类是不会被随意替换的,除非有人跑到你的机器上,破坏你的jdk。那么就可以避免有人自定义一个有破坏功能的jdk里面的类被加载。这样可以有效防止核心Java API被篡改。

双亲委派机制有他存在的意义,不过也存在许多场景是需要破坏这个机制的,所以双亲委派机制也非必然。比如 tomcat web容器里面部署了很多的应用程序,但是这些应用程序对于第三方类库的依赖版本却不一样,但这些第三方类库的路径又是一样的,如果采用默认的双亲委派类加载机制,那么是无法加载多个相同的类。所以,Tomcat破坏双亲委派原则,提供隔离的机制,为每个web容器单独提供一个WebAppClassLoader加载器。

Tomcat的类加载机制:为了实现隔离性,优先加载 Web 应用自己定义的类,所以没有遵照双亲委派的约定,每一个应用自己的类加载器——WebAppClassLoader负责加载本身的目录下的class文件,加载不到时再交给CommonClassLoader加载,这和双亲委派刚好相反。

面试大礼包分享

‍下面再给大家分享一个超级棒的Java后端面试的大礼包,是某华为大师兄当时呕心沥血整理的,希望会对大家有用。
在这里插入图片描述
里面涵盖的内容非常的完整,且非常有用。

请关注微信公众号《AI与计算机视觉》,回复“面试大礼包”即可获取!

有不对的地方欢迎大家指正。

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

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

相关文章

2023情人节送另一半什么好?四款适合送女友的数码好物分享

2023年情人节快到了,一个关于浪漫、惊喜并且充满爱意的节日,不少人都在烦恼送另一半什么好。而数码产品在日常生活中也是必不可少的存在,在此,我给大家整理了四款适合送女友的数码好物,一起来看看吧。 一、蓝牙耳机&a…

操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!!&am…

这18张 Python 数据科学速查表,让你的代码能力飞起来

数据科学是利用科学方法、流程、算法和系统从数据中提取价值的跨学科领域。数据科学家综合利用一系列技能(包括统计学、计算机科学和业务知识)来分析从网络、智能手机、客户、传感器和其他来源收集的数据。 目前在主流的数据科学领域一般有三大生态&…

深入详解 二次移动平均法python

什么是 二次移动平均法 二次移动平均法,也称为指数加权移动平均法,是一种用于平滑时间序列数据的算法。 文章目录二次移动平均法逻辑Python代码实现第二种实现二次移动平均法的方式第三种卷积实现二次移动平均法二次移动平均法的应用场景二次移动平均法逻…

Linux监控之prometheus学习

目录 需要学习以及掌握的知识 第一步:安装准备 1、安装nginx 2、安装prometheus 2_1、解压:prometheus-2.0.0.linux-amd64.tar.gz 2_2、移动到安装目录 2_3、将Prometheus配置为系统服务 2_4、重新加载系统文件,使prometheus.service文…

Linux字符设备、块设备的区别

一、字符设备 字符设备就是在对某设备进行操作时,该设备的读取以字节为单位进行。字符设备的操作是通过linux系统直接调用驱动程序完成的,在驱动程序的上一层并没用文件系统。因此字符设备的特点如下: 1、以字节流的方式进行读写、一个字节一…

亚马逊上线优惠券推荐功能,如何选品成为重中之重?

随着全球数字经济的进一步发展以及中国数字化基础设施的完善,众多中国品牌选择出海掘金道路。虽然全球经济格局的不确定因素在增多,但是总体上各国消费潜力在逐步释放,我国外贸行业也在不断迭代优化,尤其是出口跨境电商行业&#…

Python 基础语法介绍(二)

文章目录一、概述二、函数1)函数定义2)函数调用3)函数传参1、形式参数和实际参数2、关键字参数3、参数默认值4、可变参数4)函数返回值1、语法结构2、多值返回5)变量作用域1、局部变量2、全局变量【1】在主程序中定义全…

金融风控12

社交网络分析与金融反欺诈 设备指纹 一般是基于某些设备信息,通过一些设备指纹算法将这些信息组合,通过特定hsah算法得到一个ID值,作为该设备唯一标识符 常见元素有: - sim卡信息 - wifi信息 - 硬盘信息 - 内存信息 - 屏幕…

【Qt】6.QTableWidget控件、其他控件、自定义控件封装、鼠标事件

目录 QTableWidget控件 代码 widget.cpp 结果 其他控件 stackWidget栈控件 下拉框 代码 widget.cpp 结果 自定义控件封装 代码 smallwidget.h smallwidget.cpp widget.cpp 结果 鼠标事件 代码 mylabel.h mylabel.cpp 结果 QTableWidget控件 设置列数setC…

oAuth2的入门

目录一、OAuth2流程演示示例第一步第二步二、流程2.1 资源所有者2.2 客户2.3 客户2.4 认证服务器2.5 客户2.6 资源服务器三、测试一、OAuth2流程演示示例 第一步 先到gitee下载oAuth2官方提供的代码,然后导入项目 https://gitee.com/lisenaq/oauth2-example.git第…

SpringMVC(十四):SpringMVC异常处理

文章目录 SpringMVC异常处理 一、异常简介 二、异常处理具体实现

Charles 的简单使用

1.下载并安装charles官方下载地址:https://www.charlesproxy.com/download/当前最新版本是4.6.3 选择合适的安装包进行下载(windows.msi、macos.dmg、linux.tar.gz)例windows.msi:执行msi文件,选择合适的下载地址&…

【机器学习】聚类算法(理论)

聚类算法(理论) 目录一、概论1、聚类算法的分类2、欧氏空间的引入二、K-Means算法1、算法思路2、算法总结三、DBSCAN算法1、相关概念2、算法思路3、算法总结四、实战部分...一、概论 聚类分析,即聚类(Clustering)&…

js继承的6种方式

// 1 原型链继承function Per() {this.name "key";}Per.prototype new Person(); // 主要var per1 new Per();console.log(per1.age);// instanceof 判断元素是否在其他元素的原型链上// per1继承了Person的属性,返回trueconsole.log(Per1 instanceof …

java常用类:BigInteger类和BigDecimal类

java常用类型: Ineteger等包装类 String类,StringBuffer类和StringBuilder类 Math类及常用方法 System类及常用方法 Arrays类及常用方法 BigInteger类和BigDecimal类及常用方法 日期类Date类,Calender类和LocalDateTime类 文章目录引言BigInteger (大整数)常用方法B…

二分算法学习

🌼 扎着马尾的姑娘,笑容温柔很善良自在的少年 - 要不要买菜 - 单曲 - 网易云音乐 前言 本来打算做蓝桥杯2022C++A组省赛F题青蛙过河的,看到标签显示"二分",第一时间竟然想不到二分是什么,所以来学习下 目录…

传闻将与马云合作,涨了7倍的正大企业国际,还能跟风吗?

1月30日周一,港股正大企业国际逆势大涨68.35%,1月31日正大企业国际继续飙升,最高点涨超275%,收盘时涨幅达251.88%,成为2023年第一只翻倍的股票。今日早盘继续近40个点,还在持续发酵中。 消息面上&#xff…

Python+Go实践(电商架构一)

文章目录简介架构分析接口管理peeweeCURDGin获取请求参数protobuf验证表单中间件静态文件优雅退出小结简介 电商系统:后台管理前端商城 架构分析 传统的单体架构,以Django为例;之前写过flask开发微视频网站就是这样的架构 痛点分析及演进 …

Oracle数据库安装配置和卸载

Oracle数据库是一种网络上的数据库, 它在网络上支持多用户, 支持服务器/客户机等部署(或配置) 服务器与客户机是软件概念, 它们与计算机硬件不存在一一对应的关系. 即: 同一台计算机既可以充当服务器又可以充当客户机, 或者, 一台计算机只充当服务器或只充当充当客户机. Orac…