【21面经】- 面试题总结(4年后端)

笔试部分

1. 说说&&&的区别。

  &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

  &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 &++y>0) y会增长,If(x==33 && ++y>0)不会增长

  &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。

2. "=="equals方法究竟有什么区别?

  (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)

  ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

  如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

3. Integerint的区别

  int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

  在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

  另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

4. 请说出作用域publicprivateprotected,以及不写时的区别

  这四个作用域的可见范围如下表所示。

  说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。

  作用域    当前类  同一package  子孙类  其他package

  public         √              √                 √          √

  protected   √              √                 √          ×

  default       √              √                 ×          ×

  private       √              ×                 ×          ×

5. Java中的几种基本类型,各占用多少字节?

byte short int long float double char boolean
1字节 2字节 4字节 8字节 4字节 8字节 2字节 1bit

 

 

 

6. ArrayList和LinkendList有什么区别?

ArrayList底层是数组实现,具有数组的特性,增删慢,查询快
LinkedList底层是采用链表来实现,增删快,查询慢

ArrayList和linkedList底层实现原理以及区别?

7.讲讲类的实例化顺序,比如父类静态数据、构造函数、字段、子类静态数据、构造函数、字段,当new的时候,他们的执行顺序是什么?

类的实例化顺序:先静态再父子
父类静态数据->子类静态数据->父类字段->子类字段->父类构造函数->子类构造函数

8.写出三种单例模式的实现。

懒汉式(先定义,用的时候再创建),饿汉式(定义并创建好,用的时候直接拿),饱汉式(静态内部类,枚举)
#这里也可以写具体实现。

9.深拷贝和浅拷贝的区别?

浅拷贝只拷贝指针,深拷贝就是拷贝他的值,重新生成的对象.

10.数组和链表数据结构描述,各自时间复杂度?

数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.
链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起.
访问数组中第 n 个数据的时间花费是 O(1) 但是要在数组中查找一个指定的数据则是 O(N) .当向数组中插入或者删除数据的时候,最好的情况是在数组的末尾进行操作,时间复杂度是 O(1) ,但是最坏情况是插入或者删除第一个数据,时间复杂度是 O(N) .
在数组的任意位置插入或者删除数据的时候,后面的数据全部需要移动,移动的数据还是和数据个数有关所以总体的时间复杂度仍然是 O(N) . 在链表中查找第 n 个数据以及查找指定的数据的时间复杂度是 O(N) ,但是插入和删除数据的时间复杂度是 O(
1)

11.a.hashcode()有什么用?,与a.equals(b)有什么关系?

hashCode()方法是相应对象整型的 hash值.它常用于基于hash的集合类,如Hashtable,HashMap,LinkedHashMap等等.它与 equals() 方法关系特别紧密.根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code.

12.java中的Math.round(-1,5)等于多少?

13.List、Set、Map之间的区别是什么?

14.给定一个文本,获取某字符出现的次数?

15.spring怎么配制事务(具体数出一些关键的xml元素)

16. 如何避免浏览器缓存?

HTTP信息头中包含Cache-Control:no-cache,pragma:no-cache,或Cache-Control:max-age=0等告诉浏览器不用缓存的请求

需要根据Cookie,认证信息等决定输入内容的动态请求是不能被缓存的
经过HTTPS安全加密的请求(有人也经过测试发现,ie其实在头部加入Cache-Control:max-age信息,firefox在头部加入Cache-Control:Public之后,能够对HTTPS的资源进行缓存,参考《HTTPS的七个误解》)

POST请求无法被缓存

HTTP响应头中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的请求无法被缓存

17.简述http请求get和post的区别以及数据包格式?

18.TCP三次握手和四次挥手的流程,为什么断开连接要4次,如果握手只有两次,会出现什么.

19.SQL优化思路?

20.String,Stringbuffer,StringBuilder的区别.

String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响.
StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized.
但是保证了线程安全是需要性能的代价的.在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1. 5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销. StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK
9 以后是 byte数组).

21.有没有有顺序的Map实现类,如果有,他们是怎么保证有序的.

顺序的Map实现类:LinkedHashMap,TreeMap
LinkedHashMap是基于元素进入集合的顺序或者被访问的先后顺序排序,TreeMap 则是基于元素的固有顺序(默认是hashcode,可以实现Comparable自定义排序规则).

22.请列出5个运行时异常.

NullPointerException
IndexOutOfBoundsException
ClassCastException
ArrayStoreException
BufferOverflowException

23. JVM内存为什么要分成新生代,老年代,持久代.新生代中为什么要分为Eden和Survivor.

24. Spring MVC的工作原理是怎样的? 

链接:https://www.nowcoder.com/questionTerminal/f80a7abd45b04372b925421e4351b5b2
来源:牛客网

第一步:用户发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找

第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)

第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

第五步:处理器适配器去执行Handler

第六步:Handler执行完给处理器适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析

第九步:视图解析器像前端控制器返回View

第十步:前端控制器对视图进行渲染

第十一步:前端控制器向用户响应结果

25. spring ioc和aop的原理.

26.sleep和wait的区别.

27. synchronized的原理是什么,一般用在什么地方(比如加在静态方法和非静态方法的区别)

28. Lock与Synchronized的区别.

29.ThreadLocal用过么,用途是什么,原理是什么,用的时候要注意什么.

30. 线上系统突然变得异常缓慢,你如何查找问题.

31.如何做到接口的幂等性.

32. 什么叫数据一致性,你怎么理解数据一致性.

33. 聚集索引和非聚集索引的区别

34.b树和b+树的区别,为什么用b+树不用平衡二叉树,简单计算b+树为什么只有三四层

35.redis的数据持久化是怎么实现的?

36.mybatis和hibernate的区别?

37.常见的缓存策略有哪些,如何做到缓存与DB的数据一致性

38.如何防止缓存击穿和雪崩

39.redis集群方案, 哨兵模式的优缺点

40.服务器有很多ip只能加四个白名单,怎么解决?

用代理解决

41.什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决.

序列化:把对象转换为字节序列的过程称为对象的序列化.
反序列化:把字节序列恢复为对象的过程称为对象的反序列化.
详细:https://blog.csdn.net/riemann_/article/details/87835260

42.什么情况下会发生栈内存溢出.

43.平时用到哪些Linux命令.

netstat查看网络
iostat 查看io
lsof 查看端口
free 查看内存,了解几个区别
df du 参看磁盘
grep 查找文件内容 find查找文件
ps查看进程
less more cat tail查看文件
chmod修改权限

44.String,StringBuffer,StringBuilder 的区别是什么?String为什么是不可变的?

45.Vector,ArrayList,LinkedList的区别是什么?

46.HashTable,HashMap,TreeMap区别?

47.Session, Cookie区别?

cookie:存在客户端、安全级别低、存储量有限、不超过4k
session:存在服务器端、安全性高、存储空间大、容易造成服务器缓慢

1.cookie数据存放在客户端浏览器上,session数控存放在服务器上
2.cookie不是很安全,别人可以分析存放在本地cookie并进行cookie欺骗,考虑到安全应使用session
3.session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
4.单个cookie保存数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
5.建议:
将登陆信息等重要信息存放在session
其他信息如果需要保存,可以放在cookie中

48.mybatis中#{}和${}的区别?

#{}是预编译处理,${}是字符串替换。 

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调PreparedStatement的set方法来赋值;  
Mybatis在处理时,就是把{}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。

49.hashmap了解吗?说一下hashmap相关的一些东西?hashmap是线程安全的吗?为什么是线程安全的?

50.concureenthashmap了解吗?他是如何实现线程安全的?

51.violate了解吗?它的原理是什么?violate是线程安全的吗?

53.redis是单线程的还是多线程?

 

非技术面试:

1. 技术选型,一个新技术和一个稳定的旧技术,你会怎么选择,选择的考虑有哪些?   

2. 你是怎么去接触一门新技术的?

3. 未来你的职业规划是怎么样?

4. 休息时间你是怎么安排的?下班回去会做什么?

 

其他优秀面经:

字节跳动面试真题分享,四面斩获offer

社招|美团点评Java岗社招面试经历

 

 

posted @ 2021-06-06 10:38  多搞学习少搞事情  阅读(147)  评论(0编辑  收藏  举报