2021.04.21牛客网Java校招面经汇总(1~12)

交行软开一面面经 遇见TA

1.Java的类加载机制**

解析:
https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/jvm/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.md

系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。

(1)加载

①通过全类名获取定义此类的二进制字节流
②将字节流所代表的静态存储结构转换为方法区的运行时数据结构
③在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口

(2)验证:

文件格式,元数据,字节码,符号引用验证

(3)准备阶段:

内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在 Java 堆中。

(4)解析阶段:

是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。

(5)初始化:

是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 ()方法的过程。

(6)卸载:

卸载自定义加载器加载的类

携程后台一面面经 牛客705237269号

2.hashmap 和 hashtable 的区别**

https://www.jianshu.com/p/5c34133ed372
区别
①HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
②HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsValue 和 containsKey。因为 contains 方法容易让人引起误解。
③HashTable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。
④HashTable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。
⑤Hashtable的enumerator迭代器不是fail-fast, HashMap则是fail-fast,因此当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException

3. hashtable 和 concurrenthashmap的区别***

https://www.cnblogs.com/heyonggang/p/9112731.html
①ConcurrentHashMap底层采用分段的数组+链表实现,
HashTable底层数组+链表实现
②concurrenthashmap线程安全通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,效率相对concurrenthashmap低下

注意:ConcurrentHashMap有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁

4. stringBuilder ,StringBuffer的区别****

String类是不可变类,任何对String的改变都 会引发新的String对象的生成;(少量数据使用),线程安全,速度最慢
StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象,线程安全,适用多线程下在字符缓冲区进行大量操作的情况,效率仅次于stringBuilder
stringBuilder:适用单线程下在字符缓冲区进行大量操作的情况,线程不安全,效率最快

用法:https://blog.csdn.net/mad1989/article/details/26389541
StringBuffer sb = new StringBuffer(“KMing”);
sb. deleteCharAt(1);//删除序号为1字符,输出结果:King
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);//删除[1,4}字符,结果:TString
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

5. String 和 StringBuilder在合并字符串上的区别****

String:创建一个StringBuilder的存储空间,大小为第一个字符串的长度+16,之后创建新字符串1,添加至缓冲区…创建新字符串N,添加至缓冲区,最后将缓冲区对象转换为字符串对象
StringBuilder拼接字符串:①创建一个新的StringBuilder的存储空间
②.在StringBuilder的基础上进行添加,不创建新的字符串
③.循环完成之后,将StringBuilder转成String
https://blog.csdn.net/m0_46325925/article/details/110144790

字节后端开发一面面经【校招】牛客43800845号

6. 隔离具体是怎么实现的

根据快照版本号知道事务执行时间进而决定事务之后执行顺序。insert、update和delete会更新版本号

7. 操作系统怎么管理内存的

分为连续内存分配和非连续内存分配

一.连续内存分配:

给程序分配一块连续内存区域,会出现内/外部碎片,
内部碎片产生缘由:分配的内存大小是否要取整
外部碎片:被分配的内存区域之间没的的空闲区域

二.非连续内存分配:

连续内存分配会出现内/外部碎片、动态修改比较困难、内存必须连续,而且内存利用率不高。因此提出了非连续内存分配的方法,允许程序使用非连续的内存空间、允许共享代码和数据,以提高内存利用效率和管理的灵活性。

下面介绍三种方式:
①段式存储管理(segmentation):

段(segment)指一类地址空间,一个段就是一个地址连续的内存块,若干个段组成程序的逻辑地址空间。

段式存储管理下的逻辑地址组成格式为(s, o),s为段号,o为段内偏移量,段号和对应内存中的物理起始地址由段表记录。寻址时,先根据段号到段表中查到物理起始地址(基址),然后加上偏移量,得到最终的物理地址。

②页式存储管理(paging):

物理页帧(Frame | Page Frame | 帧 | 页帧):把物理地址空间分成大小相同的基本单位。大小为2^n,如512/4096等。
逻辑页面(Page | 页):把逻辑地址空间划分为相同大小的基本单位
页帧大小和页面大小必须一致

页式存储管理的寻址方式和段式管理类似,逻辑地址格式为(p, o),表示页中的地址,其中p表示页号,o表示偏移量。物理地址格式为(f, o),表示页帧中的地址,其中f表示页帧号,o表示偏移量,页偏移量和页帧偏移量是相等的。

页和页帧的对应关系使用**页表(Page Table)**来管理。寻址时首先根据页号找到页表中对应的页帧号,然后用得到的页帧号与偏移量组成实际的物理地址。

③段页式存储管理(上面两者的综合)

给每个段加一级页表。逻辑地址格式为(s, p, o),s为段号,p为页号,o为页内偏移。寻址时,现根据段号s查找段表中的页表地址,然后到页表中查找p对应的起始地址,最后加上偏移o得到最终的物理地址。
总结自https://www.pianshen.com/article/18991039193/

8. 智力题:100个香蕉和一只猴子在起点,终点隔了50米。猴子一次能搬50个香蕉,但走一米就得消耗一根香蕉。问猴子最多能搬多少香蕉到终点。

想了没多久就有思路了,但是式子写错了算出来不对,面试官也不提醒,慌死我了。最后磨了好一会儿,算出来了。
-编程题:经典dfs:leetcode 200. 岛屿数量。
我说这个我会,他让我讲讲思路,讲完说你会啊,那我加个难度:
-如果有形状相同的岛屿就只算同一个岛(??这难度一下子就不一样了)
想了一下,用字符存储了遍历岛屿时走的方向,遍历完时放入一个HashSet,最后HashSet的长度就是岛屿数量(因为相同岛屿的路径字符串是相同的)

美团Java后端一面 蔡宜身

9.Spring IOC, AOP实现, 原理应用场景等;

IOC

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 在实际项目中一个 Service 类可能有几百甚至上千个类作为它的底层,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

AOP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理

实现原理

IOC:dom4j解析配置+反射
AOP:动态代理
https://blog.csdn.net/qq_21993785/article/details/80930112

应用场景

IOC:无需创建对象,直接注解引用
AOP:日志,事务和异常处理

10.一道合并有序链表, 合并k个有序链表;

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> q = new PriorityQueue<>((x,y)->x.val-y.val);
        for(ListNode node : lists){
            if(node!=null){
                q.add(node);
            }
        }
        ListNode head = new ListNode(0);
        ListNode tail = head;
        while(!q.isEmpty()){
            tail.next = q.poll();
            tail = tail.next;
            if (tail.next != null){
                q.add(tail.next);
            }
        }
        return head.next;
    }
}

来自leetcode用户星际仓鼠题解

11.超多数取前k小的(最大堆);

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
	
	 
	
		 //用一个数组来装,输入1,2,3,2,2,3,则num[2]=3,num[3]=2;//数字2出现3次,数字3出现2次
		 if(arr.length==0||k==0)
			 return new int[0];
		 int[] anum=new int[10000];
		 for(int a:arr)
		 {
			 anum[a]++;
		 }
		 //统计当前已经有多少个最小值,计算最小值从anum[0]->anum[499]
		 int index=0;
		 //用一个新数组装返回值
		 int[] are=new int[k];
		 for(int i=0;i<anum.length;i++)
		 {
			 while( (anum[i]--)>0&&index<k)
			 {
				 are[index++]=i;
			
			
			 }	
			 //已经有k个结果了,就不用继续循环下去
			 if(index==k)
				 break;
		 }
		 return are;
		 
	 
    }
}

12.MySQL优化流程, 索引创建的原则等;

问题分析

MYSQL优化首先应该定位问题,可能导致MYSQL低性能的原因有:业务逻辑过多的查询、表结构不合理、sql语句优化以及硬件优化,从优化效果来看,这四个优化点的优化效果依次降低:理清业务逻辑能够帮助我们避免不必要的查询,合理设计表结构也能帮助我们少查询数据库。

优化流程

https://blog.csdn.net/weixin_30416497/article/details/97999092

索引创建的原则

https://www.cnblogs.com/niuben/p/11250230.html

腾讯|客户端开发 https://www.nowcoder.com/discuss/641881?source_id=discuss_experience_nctrack&channel=-1

13.分页和分段的区别?段页式?

https://blog.csdn.net/smilesundream/article/details/70148878
内存管理方式主要分为:页式管理、段式管理和段页式管理。

三种离散分配内存方式

https://blog.csdn.net/smilesundream/article/details/70148878
分页:把虚拟空间分为若干个长度相等的页(不会产生外碎片,需要有硬件支持程序全部装入内存)
分段:把程序按照内容或者过程函数分段(会产生外碎片,但能对不同段采取不同的措施如保护等,可以动态链接以实现代码共享)
段页式:段中继续按页划分(具有上面两者的优点,但是执行速度更慢)

三种离散分配内存方式映射物理地址

分页:页的地址如下2021.04.21牛客网Java校招面经汇总(1~12)_第1张图片

位移量(业内地址)
逻辑地址=页号&位移量(&号是连接符号,是将页号作为逻辑地址的最高位)

真正计算开始了:①根据分页地址找到页号和位移量(31~12为页号)

块内地址=位移量(页内地址)
②根据页号前往页表查找到块号,感觉像map
String 块号=map.get(页号)
③物理地址=块号&块内地址

分段(为了简单起见以省略部分概念)

2021.04.21牛客网Java校招面经汇总(1~12)_第2张图片
①根据上面一图得到段号,段内地址
②//注意:段表有三个字段:段号,段长,基址,在查找基址前会进行地址是否越界判断,控制器里存储着段表长度,若是段号&段内地址>段长,则说明这个地址不在段里,发生越界停止调用
2021.04.21牛客网Java校招面经汇总(1~12)_第3张图片

③查找段表,根据段号找到基址
物理地址=基址+段内地址(比如基址30,段内地址20,物理地址则是50)

段页式

//段页式地址:
在这里插入图片描述
①得到段号,段内页号,页内地址(页偏移量)
②进行越界判断:段表长度与页号进行判断(判断这个页有没有在段表里)
③页号与页长度进行判断(判断这个页有没有在段2里)
④由段表+页表得到块号
⑤物理地址=块号&页内地址
//工作流程图
2021.04.21牛客网Java校招面经汇总(1~12)_第4张图片

14.TCP UDP 的定义?在哪层?区别?

运输层两个重要协议:
传输控制协议 TCP(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。传输形式:字节流,传输慢消耗资源多,首部20-60个字节
用户数据协议 UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。传输形式:数据报文段,传输快消耗资源少,首部8个字节

15.红黑树?哈希表的区别?

哈系表:对key使用哈希函数处理后的结果作为value的存放地址
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶节点是黑色。 [注意:这里叶节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的,红色节点的孩子和父亲都不能是红色。
(5)任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
https://blog.csdn.net/qq_30815237/article/details/91049223

17.DNS解析过程?

分为迭代查询 递归查询两种情况

DNS解析全过程:

1.主机请求本地域名服务器:本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询)
成功返回IP地址,不成功走②
2.根域名服务器接收到请求,若找到对应IP地址,直接告知本地域名服务器,否则分为下面两种情况①递归查询:根域名服务器去请求顶级域名服务器 ②迭代查询,由本地域名服务器去请求顶级域名服务器,根域名服务器只告诉本地域名服务器去找哪个顶级域名服务器
3.顶级域名服务器接收到请求
①递归查询:要么返回成功结果给根域名服务器要么去找权限域名服务器
②迭代查询:要么返回成功结果给本地域名服务器要么告知本地域名服务器去找哪个权限域名服务器
4.权限域名服务器接收到请求,类似3
2021.04.21牛客网Java校招面经汇总(1~12)_第5张图片

2021.04.21牛客网Java校招面经汇总(1~12)_第6张图片

携程校招Java一面面经 你超级牛B

18.深浅拷贝

许愿Keep,附Java面经 ✧V许愿offer

19.java基础(拆箱装箱)、泛型、设计模式、java线程池、ThreadLocal使用。
redis数据结构、跳表,渐进式hash、mysql索引类型、mysql回表。

keep校招Java开发一面二面 还是搞开发吧

  1. 数据库索引;【B+树】
  2. 线程间的通信
  3. Redis基本命令

shopee校招后端面经 谢谢有被卷到

23.ThreadPoolExecutioner 了解吗?说说它的参数和工作流程
24.Java中thread有几种创建方式?区别是什么?
25.讲讲你对多线程的理解?
26.HashMap的源码看过吗?讲讲hashmap扩容的步骤
27.覆盖索引是怎么实现的?
28.讲讲聚簇索引,非聚簇索引
29.innodb索引怎么实现的?
30.MySQL 了解吗?讲讲它的数据结构
31.Redis事务怎么实现的?为什么Redis事务不支持回滚?
32.Redis持久化,讲讲RDB和AOF区别
33.详细讲讲Java 1.7和1.8 的hashmap resize区别
34.快排??能不能通过一些修改让它变成稳定算法
35.讲讲Redis 的业务场景
36.Redis 为什么可以做缓存?
37.Redis做缓存可能有哪些问题?
38. 讲讲缓存穿透,缓存雪崩
39. Redis做缓存,MySQL做数据库,执行update操作时应该怎么避免缓存和数据库内容不一致?
40. 如果update时先删除Redis缓存内容可能会导致什么问题?
41. 了解布隆过滤器吗?它有哪些用途?
42.volatile和锁的区别是什么?
43.synchronized和reentrantLock的区别是什么?
44.synchronized锁升级过程
45. 假如我有一个Redis集群,该怎么保证缓存一致性?

46.序列化、反序列化的作用
作者:hzbfxac
链接:https://www.nowcoder.com/discuss/643250?source_id=discuss_experience_nctrack&channel=-1

招银网络Java软开面经 hzbfxac

  1. HashMap是线程安全的吗,怎么实现线程安全
  2. CurrentHashMap的实现原理
  3. 怎么理解线程安全和线程不安全
  4. sleep() 和 wait() 有什么区别?
  5. String、StringBuilder区别
  6. 修改String和StringBuilder底层是怎么实现的
  7. 怎么创建线程
  8. 怎么创建线程池
  9. 线程池的状态有哪些
  10. 线程池中 submit() 和 execute() 方法有什么区别
  11. 数据库事务的隔离级别
  12. mysql有几种锁
    1. 怎么看是否使用了索引,用过explain吗
  13. mysql状态码\
  14. spring用了哪些设计模式

欧科云链集团,Java开发二面 还是搞开发吧

金山wps 服务器端 二面 春招 szhhr

62.介绍一下数据库语句的优化(explain关键字,showprofile关键字)
63.并发场景解决方案
64.redis哈希槽底层原理
65.redis新增节点,哈希槽变化

66.为什么协程性能好?

引出协程概念

线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元

一个进程拥有多个线程,一个线程拥有多个协程

协程特点(由程序所控制)

协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。
这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源

协程效率高原因(yield 、send操作由程序控制)

当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。

但是,yield让协程暂停,和线程的阻塞是有本质区别的。协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。

因此,协程的开销远远小于线程的开销。
67.算网络中的组播、单播的概念

技术渣渣的春招面经 ropzIsGod

68.HTTPS过程? -> SSL握手过程 ->对称加密密钥由谁产生?(不是双方沟通的吗,三次随机数,客户端吧)
69.linux命令
linux查看占用某个端口的进程——lsof
linux查看某个日志中某字段出现的次数
linux根据日志关键字出现的次数排序
70.Spring的循环依赖(两种循环依赖,使用三级缓存)

招银网络科技 软件开发 春招一面 coder_lin9706

71.用过哪些ORM,JPA和MyBatis的使用
72.集合框架了解吗?

73.常见状态码

200:服务端成功执行客户端请求
201:服务端根据客户端创建新资源
202:请求稍后执行
204:请求资源为空(Ajax应用)

303:请求资源重定向到规范URL(比如输入clicli.com结果由于clicli.me不是规范URL会跳转到规范URL clicli.me)
304:客户端已经有该请求资源
307:请求资源不在本地,在另外一个URL上

400:通用的客户端错误状态
401:客户端未认证
403:禁止访问该资源
404:资源不存在

500:通用的服务器错误响应
502:代理服务器有问题
504:上行服务器有问题

你可能感兴趣的:(java,经验分享,面试,其他)