java面试笔记 持续更新

记录一下最近面试遇到的问题,持续更新ing

电话面试:
1 nio不是很熟

http://ifeve.com/java-nio-all/

2 kafka中间件的好处有什么  -> 可靠性 -> 它是如何保障它的可靠性

http://www.importnew.com/24973.html

3 redis集群用过嘛

4 hello world 做了什么?

编译,即把我们写好的java文件,通过javac命令编译成字节码,也就是我们常说的.class文件。

运行,则是把编译声称的.class文件交给Java虚拟机(JVM)执行。

5 常用gc算法 ->

1)引用计数法 -> 存在循环引用的缺陷 -> 针对其缺陷 -> 根搜索算法、

2)标记清除算法 -> 效率低 空间碎片 -> 复制算法 -> 较多的复制效率很低 -> 标记整理算法

3)分代回收法 这种算法并没有什么新的思路,只是根据对象的存活周期的不同,将内存划分为几块。一般是把java堆分成新生代和老年代,这样就可以根绝各个年代的特点采取最适当的收集算法。在新生代中,每次垃圾回收时都发现大批对象的死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用”标记-清理”或者“标记-整理”算法来进行回收。

6 一个请求中间都做了什么
7 SpringBoot用了哪些设计模式 xml和注解的bean统一管理是什么设计模式
8 你平时都用了哪些设计模式,为什么要用它
9 10亿个数据的业务要如何处理
10 mysql的版本是什么?
11 常用的数据结构是什么?-> ArrayList HashMap

-> hashMap底层是什么?

-> 数组链表红黑树

-> 为什么要用红黑树

-> 性能好相对于链表每个节点减少一半的可能
12 常用的orm模型框架是什么 -> mybatis -> 原理?
13 你平时用过哪些异步框架?
14 内存溢出如何排查?
15 一个发生概率为1%的问题要如何调查?
16 你平时如何做性能优化的?
17 平时遇到过慢sql嘛? 如何优化的?
18 用jdk几? -> 8 -> 有哪些新特性?
19 redis为什么比数据库快?
20 redis如何持久化?
21 一个增强for循环运行期间删掉一个元素会怎样?
22 threadLocal

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。线程隔离的秘密在于ThreadLocalMap类(ThreadLocal的静态内部类)

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal

类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web

服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java

应用就存在内存泄露的风险。

ThreadLocal的方法:void set(T value)、T get()以及T initialValue()。

ThreadLocal是如何为每个线程创建变量的副本的:

首先,在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。

总结:

a、实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的

b、为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;

c、在进行get之前,必须先set,否则会报空指针异常;如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法

23 线程池
24 给你四个线程 一个主线程 如果并行的处理任务
25 hashcode 方法 和 equals方法

26 问:对象的比较,怎么判断两个对象相等?

答:equals方法

问:Integer里Integer a = new Integer(123), Integer b = 123, a==b?

答:不相等

问:Integer里Integer a = new Integer(123), Integer b = new Integer(123), a==b?

答:不相等

问:Integer里Integer a = new Integer(123), int b = 123, a==b?

答:相等

27 问:常用的List实现有哪些?

答:ArrayList 和 LinkedList, CopyOnWriteArrayList

问:ArrayList 和 LinkedList的区别

答:ArrayList是array实现的,读更快;LinkedList是链表实现的,写更快

问:ArrayList怎么扩容的,扩容到多大?

答:申请空间,copy一份出去,1.5倍

问:ConcurrentHashMap原理

答:线程同步基于Segment加锁,效率比对整个HashMap加锁效率高

问:ConcurrentHashMap怎么实现线程安全

答:分段锁

问:ConcurrentHashMap默认多少个分段锁

答:2的n次方

问:与hashtable区别

答:HashTable用synchronized保证线程安全,竞争激烈情况下效率低下

问:  ConcurrentHashMap是如何解决并发冲突的

答: 使用Segment在每个桶上加锁

问:volatile的作用

答:可见性,防止CPU指令重排

问:原子类atomicinteger

答:cas

问:CAS原理

答:campare and swap 乐观锁

28 数据库不同的存储引擎 

https://www.cnblogs.com/shijiaqi1066/p/3857808.html

https://www.cnblogs.com/sunsky303/p/8274586.html

29 redis的数据结构 及存储策略 -> String,Hash,Set,List,SortedSet,pub/sub,Transaction

->

30 设计一个线程池需要关心什么?

31 redis String是如何存储的?如何扩容?

32 常见线程池

①newSingleThreadExecutor

单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务

②newFixedThreadExecutor(n)

固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行

③newCacheThreadExecutor(推荐使用)

可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。

④newScheduleThreadExecutor

大小无限制的线程池,支持定时和周期性的执行线程

33 你最得意的项目是什么?你在项目中担当着什么样的角色?

最得意的应该属于绘制海报balabalabala ,现在在团队应该属于基层的中级开发人员

34 数据库不同的存储引擎

35 redis 支持的数据结构有哪些

redis 支持五种数据类型

string 字符串

hash 哈希

list 列表

set 集合

sorted set 有序集合

-> String是如何存储的?

https://www.cnblogs.com/idiotgroup/p/5450157.html

36 类加载的过程

类加载的过程主要分为三个部分:

加载

链接

初始化

而链接又可以细分为三个小部分:

验证

准备

解析

https://blog.csdn.net/ln152315/article/details/79223441

37 数据库事务隔离级别

https://blog.csdn.net/ln152315/article/details/79156655

38 线程池设计思路

https://www.cnblogs.com/chinaifae/p/10193774.html

代码面试:

/** 评测题目 1

* 请用java实现以下shell脚本的功能

* cat /home/admin/logs/webx.log | grep "Login" | uniq -c | sort -nr | head -n 10

* 假设webx.log 内容以下:

      Login2

      Login1

      Login1

      Login3

      uniq -c 的结果:

      1 Login2

      2 Login1

      1 Login3

**/

import java.nio.charset.Charset;

import java.nio.file.Files;

import java.nio.file.Paths;

import java.util.Comparator;

import java.util.Optional;

import java.util.function.Function;

import java.util.stream.Collectors;

public class Demo {

    public static void main(String[] args) throws Exception {

        Optional.of("/home/admin/logs/webx.log")

                .map(Paths::get)

                .map(e -> {

                    try {

                        return Files.lines(e, Charset.defaultCharset())

                                .filter(s -> s.contains("Login"))

                                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

                    } catch (Exception err) {

                        return null;

                    }

                })

                .ifPresent(map -> map.keySet()

                        .parallelStream()

                        .sorted(Comparator.comparing(map::get).reversed())

                        .limit(10)

                        .forEach(e -> System.out.println(map.get(e) + " " + e)));

    }

}

/**

* 问1 如果内存不足怎么办?问2 如何提升它的性能?

*/

参照:https://www.cnblogs.com/goody9807/p/6425399.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容