2024年java开发基础面试

java开发基础面试1 Arrays sort 实现原理和 Collection 实现原理 Collection sort 底层会调用 Arrays sort Arrays sort 底层实现是 TimeSort TimeSort 的算法就是先找到已经排好序数据的子序列 然后对剩余部分数据进行排序 然后在合并起来 2 foreach 和 while 的区别 编译之后 while 会读一行输入

大家好,我是讯享网,很高兴认识大家。



1.Arrays.sort实现原理和Collection实现原理

Collection.sort()底层会调用Arrays.sort(),Arrays.sort()底层实现是TimeSort,TimeSort的算法就是先找到已经排好序数据的子序列,然后对剩余部分数据进行排序,然后在合并起来。

2.foreach和while的区别(编译之后)

while会读一行输入,把它存入某个变量并执行循环体,然后再找其他行的输入,适用于不确定循环次数的情况;foreach是增强for循环,它是逐条读取,在循环开始前会将所有输入全部读入,适用于数组、集合等确定长度的情况;当输入内容非常大的时候foreach会非常占内存。

3.线程池的种类,区别和使用场景

a.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

b.newFixedThreadPool创建一个定长线程池,可控制线程的最大并发数,超出的线程会进入阻塞队列中等待。

c.newScheduledTreadPool创建一个定长线程池,支持定时或者周期性任务执行。

d.newSingleThreadPool创建一个单线程化的线程池,它只会用唯一的线程来执行任务,保证所有任务按照指定顺序执行。

4.线程的调度过程

a.当线程池小于corePoolSize时,新提交的任务会创建一个新的线程执行,技术此线程池中有空闲线程;

b.当线程池达到corePoolSize时,新提交的任务将被放入workQueue,等待线程池中任务调度执行;

c.当workQueue已满,并且maximunPoolSize > corePoolSize时,新提交的任务会创建新的线程执行;

d.当提交的任务数超过maximunPoolSize时,新提交的任务将被拒绝;

e.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程;

f.当线程池中设置allowCoreThreadTimeOut=true时,线程池中corePoolSize线程超过keepAliveTime时也将被关闭;

5.线程池如何调优

个人觉得比较ok:

6.线程池的最大线程数目根据什么确定

int maxthread = Runtime.getRuntime().availableProcessors() * 25;//最大线程数=cpu个数*25,超过这个值系统运行会不稳定(仅限于服务器,自己的电脑不能达到这个数)。

Runtime.getRuntime().totalMemory();// Java 虚拟机中的内存总量

Runtime.getRuntime().freeMemory()//Java 虚拟机预留内存

Runtime.getRuntime().maxMemory()//Java 虚拟机试图使用的最大内存量

计算线程可有使用的内存 理论上:最大内存量- 虚拟机预留内存,实际上:虚拟机中的内存总量-虚拟机预留内存。

7.动态代理的几种方式

jdk动态代理和cglib动java开发基础面试态代理。jdk动态代理是有java内部的反射机制实现的,前提是代理类和目标类必须实现统一的接口;cglib动态代理是借助asm来实现的。
8.HashMap的并发问题

HashMap是线程不安全的,当size超过一定大小需要扩容时,会重新计算hashcode值,在多线程的情况下可能会产生死循环。可以使用HashTable和ConcurrentHashMap。
9.了解LinkedHashMap的应用吗

10.反射的原理,反射创建类实例的三种方式是什么?

java反射机制实在运行当中,对任意一个类来说,能够知道它的所有属性和方法,都能调用它的任意一个属性和方法。

三种方式:getClass()方式,调用类的静态属性class,Class.forName()。

11.cloneable接口实现原理,浅拷贝or深拷贝


12.Java NIO使用


13.hashtable和hashmap的区别及实现原理,hashmap会问到数组索引,hash碰撞怎么解决

2.hashmap会问到数组索引,hash碰撞怎么解决

1.开放地址法
开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。
如果di取值可能为伪随机数列。称伪随机探测再散列。
2.再哈希法
当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止
3.链地址法(拉链法)
将所有关键字为同义词的记录存储在同一线性链表中。
4.建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

14.arraylist和linkedlist区别及实现原理

arraylist是基于动态数组的数据结构,而linkedlist是基于链表的数据结构;对于查询来说arraylist优于linkedlist,而对于删除和新增则linkedlist更好些。
15.反射中,Class.forName和ClassLoader区别

java类加载的过程包括:加载->验证->准备->解析->初始化->使用->卸载,而初始化就是激活java类中静态变量初始化代码和静态代码块,并初始化程序设置的变量值。

小讯
上一篇 2024-12-24 14:37
下一篇 2025-01-02 14:05

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/4177.html