微店一面

微店一面


1.自我介绍

2.你用java多长时间了?
算一下到现在两年多了。

3.学校里有java的课程是吧?
是的,大二上学期、下学期。

4.你用的jdk版本是多少?
Jdk8

5.jdk8相较于jdk7有哪些优化?
举了ConcurrentHashMap的例子,锁方面的优化:分段式锁->CAS,HashMap方面的优化:一直是链表->链表到红黑树的相互转化(链表节点达到8个的时候会进化成红黑树,红黑树节点少于等于6个的时候会退化回链表),这样做性能上会好很多。

6.HashMap底层的存储结构是什么样的?
一维数组,有冲突的话往下拉成单向链表,单向链表会进化成红黑树,或者红黑树退化回单向链表。

7.HashMap的构造函数可以接收哪几个参数?
这里只说了HashMap(int initialCapacity)、HashMap(Map<? extends K, ? extends V> m),实际上还有HashMap(int initialCapacity, float loadFactor),说错一个:可以把Collection的子类作为参数传入构造方法(实际上没有)。

8.你觉得HashMap是一个集合,那它有实现Collection接口吗?
后面想起来了,当然没有,HashMap属于Map系列,而Map并没有继承于Collection,是独立于Collection的顶层接口。

9.HashMap的扩容机制?
当HashMap中的元素个数超过 数组大小loadFactor 时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过160.75=12的时候,就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置。

10.HashMap默认的负载因子是多少?
0.75。

11.HashMap在扩容的时候,一次性会扩容多少?
扩容为原来的两倍。

12.为什么是两倍?
HashMap的扩容使用到了位运算的左移,而左移操作就是扩大两倍。
(PS:左移,如2<<1,代表2左移1位)

13.Collection有很多实现,举几个例子?
ArrayList,CopyOnWriteArrayList,HashTable(又说错了,这个顶层是Map),Set。

14.对于List接口有哪些典型实现?
ArrayList、LinkedList。

15.说下ArrayList和LinkedList的区别?
ArrayList采用数组实现,LinkedList采用链表实现。数组实现查找、修改简单,但是新增、删除麻烦(需要移动很多元素);链表实现查找、修改麻烦,但是新增、删除简单。

16.判断两个对象是否相等应该用什么方法?
对象之间的比较一般用equals。

17.直接用==不行吗?
对于基本数据类型和基本数据类型之间的比较、基本数据类型和包装类之间的比较,==比较的是值;对于对象之间的比较,==比较的是地址。

18.java里有哪些基本类型?
8种,int,float,double,long,boolean(漏说了byte、short、char)。

19.long是几个字节?
8字节,64位(这里认为跟操作系统的位数有关,32位与64位不同,实际上是无论是32位还是64位,long都是8字节,手动尴尬)。

20.int和Integer可以直接用==来比较吗?
如果int i1=0;Integer i2=new Integer(0);System.out.println(i1==i2);会输出true。

21.创建线程有哪几种方式?
①继承Thread类;
②实现Runnable接口,可以直接new Thread(Runnable runnable);
③实现Callable接口,有返回值,一般结合FutureTask使用;
④线程池。

22.线程有哪些状态?
(这里回答的不好,只说了RUNNABLE、NEW、BLOCKED,还说错了俩,手动尴尬)
线程的六种状态①NEW:新建状态,线程对象已经创建,但尚未启动;
②RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU,操作系统调度运行;
③BLOCKED:堵塞状态。线程等待锁的状态,等待获取锁进入同步块/方法或调用wait后重新进入需要竞争锁;
④WAITING:等待状态。等待另一个线程以执行特定的操作。调用以下方法进入等待状态。 Object.wait(), Thread.join(),LockSupport.park;
⑤TIMED_WAITING: 线程等待一段时间。调用带参数的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil;
⑥TERMINATED:进程结束状态。

23.线程池主要是哪个类?
ThreadPoolExecutor

24.ThreadPoolExecutor构造方法有哪些参数?
ThreadPoolExecutor(
int corePoolSize,//核心线程数
int maximumPoolSize,//最大线程数
long keepAliveTime,//当线程数大于线程数时,多余的空闲线程在终止之前
                                //等待新任务的最长时间。
TimeUnit unit,//最长时间的时间单位
BlockingQueue workQueue,//阻塞队列
ThreadFactory threadFactory,//创建新线程时要使用的工厂
RejectedExecutionHandler handler//拒绝策略
)

25.线程池的自动扩容机制?
当线程池核心数量不够时,新加入的任务会被存放在队列中,如果队列存满了,线程池会创建更多的线程,直到maximumPoolSize。如果还不足以处理新的任务,则走拒绝策略。

26.把一个任务提交到线程池,任务会立刻执行吗?
不一定。当前任务小于核心线程数时,直接执行;
当前任务大于核心线程数,且阻塞队列未满,在阻塞队列里阻塞着;
当前任务大于核心线程数,阻塞队列已满,没有超时,线程池扩容新线程,直接执行;
当前任务大于核心线程数,阻塞队列已满,超时,走拒绝策略;

27.并发编程中的同步问题一般通过什么方式解决?
如果具备可见性就能解决问题,那么使用volatile;
无锁的一种解决方式CAS;
如果必须加锁,可以使用synchronized或者ReentrantLock;

28.synchronized可以用在什么地方?
修饰方法、代码块,如果修饰的是普通方法,锁的是对象;
如果修饰的是静态方法,锁的是类;
如果修饰的是代码块,锁的是传入的对象(如synchronized (this))

29.synchronized和Lock用法的区别?
Lock更灵活,可以由开发者去定义何时lock、何时unlock(一般在try-catch-finally的finally块中);
synchronized只能交给JVM来判断。

30.如何判断一个对象可以被GC回收?
(回答的有些模糊,估计是最后讲到可达性分析算法可以解决循环引用,面试官才放过)
①引用计数算法(已被淘汰)
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
②可达性分析算法
通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(从GC Roots到这个对象不可达)时,则证明此对象是不可用的。

31.jdk中提供了很多gc算法,举几个例子?
标记清除,标记压缩(对标记清除的改进,没有碎片),复制算法(对标记压缩的改进,空间换时间,性能好,但是浪费一半的空间)。

32.CMS算法的回收过程能简单介绍下吗?
回答的不好,只说到了分代回收算法,新生代用复制算法,老年代用标记清除算法,而后面的GC基本都是采用分代回收算法。

33.在项目中有关注底层到底采用哪种回收算法吗?
没有…

34.你没有遇到过内存泄漏的问题吗?
举了ThreadLocal内存泄漏的例子。

35.有了解排查jvm问题相关的命令吗?
不了解…

36.java类加载机制?
为了安全,当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,父类若不能加载,反馈给子类,由子类完成类的加载,以保证所有相同的类在各种类加载器的环境中都是同一个类,行为保持一致,这就是双亲委派机制。比如说你也写了个java.lang.String,实际加载的是rt.jar中的String而不是你写的String。

37.你一般用什么数据库?
mysql,主要对索引和innodb比较了解。

38.表里有很多字段,在字段a上建了一个索引,在字段b上建了一个索引,查询条件where a=1 and b=2,mysql如何去判断使用哪个索引?
根据最左匹配原则,会走a的索引,不会走b的索引。
(不确定是否正确,大佬请在评论区留下正确答案)

39.mysql一张表到达多少数据量之后,增删改查的效率会变慢?
不了解。
(大佬请在评论区留下正确答案)

40.mysql索引的数据结构是什么?
B+树。
首先二分查找法是性能最好的查找算法,二叉查找树很好的利用了这一特性,但是二叉树在极端情况下会退化成链表、查找数据仍然费时。
于是改进为平衡二叉查找树,而平衡二叉查找树在巨量数据的情况下,仍然存在太深的缺点。
接着继续往下改进为多路平衡查找树(B树),可是由于每个节点需要保存数据,加载到内存中的关键字数量还是较少。
最终改进为多路绝对平衡查找树(B+树),它仅仅以叶子节点保存数据,不仅拥有B-树的优势,并且它的扫库扫表能力更强、磁盘读写能力更强、排序能力更强、查询效率更加稳定。

41.几十个亿的数据,如果要存到mysql里,保证基本的增删改查,给个解决方案?
(感觉回答的不好)
①NoSQL,如Redis;
②分库分表,用mycat。
(大佬请在评论区留下正确答案)

42.如何分库分表?
(感觉回答的不好)
水平拆分,如一张2000W的表拆成两张1000W的表;
垂直拆分,如一张60字段的表拆成两张30字段的表,主键保持一致。
(大佬请在评论区留下正确答案)

43.水平拆分的具体策略?
不知道,没有遇到过也没有实际操作过。
(大佬请在评论区留下正确答案)

44.Redis支持哪些数据类型?
①String
②List
③Set
④Zset(有序set)
⑤Hash

45.你们项目用那种数据结构用的比较多?
Hash,最省空间。

46.java访问Redis,用的什么客户端?
jedis。

47.你们redis是什么样的部署形式?
单点…

48.什么是缓存击穿?
缓存有失效时间,比如缓存都是在上午10点过期,而缓存刚刚过期,大量的请求过来,跟奔不走缓存,全部都去查库,这个就是缓存击穿。

49.redis底层如何实现expire?
不了解。
(大佬请在评论区留下正确答案)

50.你们项目组代码管理用的是什么?
Git,具体用的GitLab。

51.依赖管理用的什么?
主要用的是Gradle,maven也会。

52.面向对象的设计原则,你知道几个?
(紧张了,只说到单一职责、合成复用、接口分离、依赖倒置)
①开闭原则:对扩展开放,对修改关闭。
②依赖倒置:高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。
③最少知道:对其他对象保持最少的了解。
④里氏替换:子类替换父类,严入宽出,原有功能不变。
⑤单一职责:一个Class/Interface/Method只负责一项职责。
⑥接口分离:用多个专门的接口替代单一的总接口,不实现不需要的接口。
⑦合成复用:尽量使用组合(has-a)/聚合(contanis-a),而不是继承。

53.简单说下依赖倒置指的是什么?
详见52中的②。

54.常用的设计模式,举几个例子?
①单例模式:在spring配置文件中定义的bean默认为单例模式。
②工厂模式:BeanFactory用来创建对象的实例的核心理念。
③代理模式:在AOP中被用的比较多。
④模板模式:用来解决代码重复的问题。比如RedisTemplate,JdbcTemplate。
⑤委派模式:Srping提供了DispatcherServlet来对请求进行分发。

55.解释下java中的动态代理和静态代理?
静态代理:比如写了a类和b类,b类中有a类的成员属性,那么b类可以对a类的方法进行增强;
动态代理:jdk的动态代理是基于实现接口的方式,用反射写代码,帮你实现静态代理,cglib的动态代理则是基于继承的方式来重写。

56.建立TCP连接,有几次交互?
(回答的不好,下面是正解)
TCP三次握手第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

57.有没有用到公用网关?
不清楚。

58.对网关有了解吗?
我学过,但我忘了(理直气壮)。
(大佬请在评论区留下正确答案)

59.你了解的RPC框架是哪种?
严格意义上的话,dubbo,springcloud也有了解,但是springcloud不是严格意义上的rpc(还是基于http的远程调用)。

60.dubbo服务有几个角色?
服务的注册方,服务的调用方。

61.最常用的注册中心?
zookeeper。

62.用过mq吗?
没有。

63.介绍下实习期间做的性能优化。

64.你有什么想问我的吗?

PS:别问我为什么记得这么清楚,有录音,一面一共面了52分钟,面完之后感觉脑瓜子嗡嗡作响…

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值