面试题:搜狐百度 !=!=未看

本人是做java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些,相信面试会轻松许多。

1. junit用法,before,beforeClass,after, afterClass的执行顺序


2. 分布式锁     https://blog.csdn.net/zxp_cpinfo/article/details/53692922
3. nginx的请求转发算法,如何配置根据权重转发
4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap)

系统中在用hashmap作为缓存,所以不得不考虑一些因素:多线程并发,最大容量,性能,以及与redis,EhCache等的优劣比较

1、容量的问题:

源码中,HashMap的最大容量为1<<30。HashMap的初始默认容量是16,默认负载因子0.75,也就是说,随着数据的不断插入,当数据量不断增大,超过现有容量*负载因子的时候,就是进行容量扩充,即resize操作,而这个操作需要将原来数组的数据逐个全部重新放入到新生成的大容量的数组里面去,这样的代价就会比较高,尤其是hashmap容量在不断迅速增长的情况下。因此,类似我们现在这个系统中,hashmap中需要缓存的数据量基本上是比较稳定的(在可预见的未来不会出现暴增的情况,因此只要在一定范围内,也不会造成内存的急剧膨胀),这种情况下可以考虑在生成hashmap的时候就直接指定一个容量以及负载因子;而且在我们的系统中,hashmap缓存的其实就是一张数据表的数据,这样这个指定的容量其实就可以根据数据表现在的长度来获得。

2、多线程并发的问题

HashMap本身不是线程安全的,因此不能用于多线程并发,因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,但是java中提供了一个ConcurrentHashMap,这个map是线程安全的,通过对get操作不加锁,对put操作分块加锁的方式来保证线程安全的同时还能有较高的读写性能,详细的介绍可以参考:http://goldendoc.iteye.com/blog/1103980http://www.infoq.com/cn/articles/ConcurrentHashMap

3、操作性能没有进行测试,稍后再来测试这个,暂时可以参考http://blog.csdn.net/java2000_net/article/details/3373181http://blog.csdn.net/liuzhengkang/article/details/2916829,但是后者看评论好像是有争议的。


5. 线程的状态
5. 线程的阻塞的方式

1、线程阻塞
一个线程进入阻塞状态可能的原因:
①通过调用sleep(millseconds)使任务进入休眠状态;
class Demo1 implements Runnable throws InterruptedException{
     public void run(){ 
          Thread.sleep(1000);
     }
}
②通过调用wait()使线程挂起,直到线程获取notify()/notifyAll()消息,(或者在Java SE5中java.util.concurrent类库中等价的signal()/signalAll()消息),线程才会进入就绪状态;
class Demo2 implements Runnable{
     public void run(){
          Thread.await();
          Thread.notify();
     }
}
③任务在等待某个输入 / 输出流的完成;
class Demo3 implements Runnable throws InterruptedException{
     private InputStream in;
     public void run(){
          in.read();
     }
}
④任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取了该锁;
class Demo4 implements Runnable{
     public synchronized void method1(){     }
     public synchronized void method2(){     }
     public void run(){
          method1();
     }
}


6. sleep和wait的区别
7. hashmap的底层实现
8. 一万个人抢100个红包,如何实现(不用队列),如何保证2个人不能抢到同一个红包,可用分布式锁  待看
9. java内存模型,垃圾回收机制,不可达算法

Java堆中存放着程序中几乎所有的对象实例,垃圾收集器在对堆进行回收前,首先需要判断哪些对象还“活着”,哪些已经“死去”。通常判断的方法有引用计数算法、可达性分析算法。引用计数算法给对象中添加一个引用计数器,每当一个地方引用它时,计数器值加1;当引用失效时,计数器值减1,如果计数器的值为0,则说明对象不再被使用(死去了)。然而Java虚拟机中并没有选用计数算法来管理内存,因为引用计数算法难以解决对象之间相互循环引用的问题可达性分析算法是将一系列称为“GC Roots”的对象作为起始节点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的(也死去了)。其中可作为GC Roots对象的有虚拟机栈(栈帧中本地变量表)中引用的对象,方法区中静态属性引用的对象,方法区中常量引用的对象,本地方法栈中引用的对象上边说的都是Java堆中的内存回收,而方法区(HotSpot中的永久代)的垃圾收集主要回收两部分内容:废弃常量和无用类。判断一个常量是否是废弃常量只需判断是否还存在对该常量有引用的对象。而判断无用类需要同时满足3个条件该类所有的实例都已经被回收,即Java堆中不存在该类的任何实例;加载该类的ClassLoader已经被回收;该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

在Java语言中,可以作为GC Roots的对象包括下面几种
  • 虚拟机栈(栈帧中的本地变量表)中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象;
总结就是,方法运行时,方法中引用的对象;类的静态变量引用的对象;类中常量引用的对象;Native方法中引用的对象。




10. 两个Integer的引用对象传给一个swap方法在方法内部交换引用,返回后,两个引用的值是否会发现变化


11. aop的底层实现,动态代理是如何动态,假如有100个对象,如何动态的为这100个对象代理

https://blog.csdn.net/qq_24693837/article/details/54909477

https://www.jianshu.com/p/6402c45cee62


12. 是否用过maven install。 maven test。git(make install是安装本地jar包)
13. tomcat的各种配置,如何配置docBase
14. spring的bean配置的几种方式
15. web.xml的配置
16. spring的监听器。
17. zookeeper的实现机制,有缓存,如何存储注册服务的
18. IO会阻塞吗?readLine是不是阻塞的
19. 用过spring的线程池还是java的线程池?
20. 字符串的格式化方法 (20,21这两个问题问的太低级了)


21. 时间的格式化方法
22. 定时器用什么做的

高效的实现方式就是使用java.util.Timer工具类。


23. 线程如何退出结束
24. java有哪些锁?乐观锁 悲观锁 synchronized 可重入锁 读写锁,用过reentrantlock吗?reentrantlock与synmchronized的区别
25. ThreadLocal的使用场景

在工具 类获取CurrentSession 或者获取连接的工具类 可以用ThreadLocal <Session或者Connection> 用线程的变量副本存储 这些session 保证一个线程只存在一个session 相互直接不共享数据


26. java的内存模型,垃圾回收机制
27. 为什么线程执行要调用start而不是直接run(直接run,跟普通方法没什么区别,先调start,run才会作为一个线程方法运行
28. qmq消息的实现机制(qmq是去哪儿网自己封装的消息队列)
29. 遍历hashmap的三种方式

30. jvm的一些命令

31. memcache和redis的区别

http://www.cnblogs.com/shan1393/p/9001113.html

32. mysql的行级锁加在哪个位置
33. ConcurrentHashmap的锁是如何加的?是不是分段越多越好
34. myisam和innodb的区别(innodb是行级锁,myisam是表级锁)
35. mysql其他的性能优化方式

36. linux系统日志在哪里看

cat /var/log/syslog 等
cat /var/log/*.log

37. 如何查看网络进程

ps 命令用于查看当前正在运行的进程。

grep 是搜索

例如: ps -ef | grep java

表示查看所有进程里 CMD 是 java 的进程信息

ps -aux | grep java

-aux 显示所有状态

ps kill 命令用于终止进程

例如: kill -9 [PID]

-9 表示强迫进程立即停止

通常用 ps 查看进程 PID ,用 kill 命令终止进程

关键字: linux 查进程、杀进程、起进程

38. 统计一个整数的二进制表示中bit为1的个数

39. jvm内存模型,java内存模型

40. 如何把java内存的数据全部dump出来

41. 如何手动触发全量回收垃圾,如何立即触发垃圾回收

system.gc 但是 不保证垃圾回收器一定会执行

42. hashmap如果只有一个写其他全读会出什么问题

43. git rebase

44. mongodb和hbase的区别

45. 如何解决并发问题
46. volatile的用途  保证变量时刻是最新的 不可以被缓存 只能修饰变量
47. java线程池(好像之前我的理解有问题)
48. mysql的binlog
49. 代理模式
50. mysql是如何实现事务的

每执行一条sql调用一次事务  手动设置 需要  set autoCommit=0

51. 读写分离何时强制要读主库,读哪个从库是通过什么方式决定的,从库的同步mysql用的什么方式
52. mysql的存储引擎

mylsam  选择  插入  

innodb  数据库恢复  事务 

53. mysql的默认隔离级别,其他隔离级别
54. 将一个链表反转(用三个指针,但是每次只发转一个)
55. spring Aop的实现原理,具体说说

面向切面 在不改变原有代码对 程序进行增强
56. 何时会内存泄漏,内存泄漏会抛哪些异常

内存泄漏 是指在资源用完没有及时释放导致内存泄漏

内存溢出 指你有的数据比内存给的要大  内存溢出 例如用int  存Long类型的 数


57. 是否用过Autowire注解


58. spring的注入bean的方式
59. sql语句各种条件的执行顺序,如select, where, order by, group by

分组后排序
60. select  xx from xx where xx and xx order by xx limit xx; 如何优化这个(看explain)

61. 四则元算写代码

62. 统计100G的ip文件中出现ip次数最多的100个ip

 select count ( select  通过id进行分组)r where r.rownum<100 
63. zookeeper的事物,结点,服务提供方挂了如何告知消费方
64. 5台服务器如何选出leader(选举算法)

65. 适配器和代理模式的区别

类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可

代理模式就是多一个代理类出来,替原对象进行一些操作

代理模式的应用场景:

如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:

1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。


66. 读写锁
67. static加锁
68. 事务隔离级别
69. 门面模式,类图(外观模式)
70. mybatis如何映射表结构

71. 二叉树遍历
72. 主从复制

https://i.cnblogs.com/EditPosts.aspx?postid=9064102
73. mysql引擎区别
74. 静态内部类加载到了哪个区?方法区

75. class文件编译后加载到了哪

76. web的http请求如何整体响应时间变长导致处理的请求数变少,该如何处理?用队列,当处理不了那么多http请求时将请求放到队列
中慢慢处理,web如何实现队列

77. 线程安全的单例模式

78. 快速排序性能考虑

79. volatile关键字用法

80. 求表的size,或做数据统计可用什么存储引擎

81. 读多写少可用什么引擎

82. 假如要统计多个表应该用什么引擎

83. concurrenhashmap求size是如何加锁的,如果刚求完一段后这段发生了变化该如何处理

84. 1000个苹果放10个篮子,怎么放,能让我拿到所有可能的个数

85. 可重入的读写锁,可重入是如何实现的?

86. 是否用过NIO

87. java的concurrent包用过没

88. sting s=new string("abc")分别在堆栈上新建了哪些对象  方法区 "abc" 堆 s对象   栈存的对象的引用 

89. java虚拟机的区域分配,各区分别存什么

90. 分布式事务(JTA)

91. threadlocal使用时注意的问题(ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享)

92. java有哪些容器(集合,tomcat也是一种容器)

93. 二分查找算法
94. myisam的优点,和innodb的区别
95. redis能存哪些类型  String  hash  set  Zset 
96. http协议格式,get和post的区别
97. 可重入锁中对应的wait和notify
98. redis能把内存空间交换进磁盘中吗(这个应该是可以的,但是那个面试官非跟我说不可以)
99. java线程池中基于缓存和基于定长的两种线程池,当请求太多时分别是如何处理的?定长的事用的队列,如果队列也满了呢?交换进磁盘?基于缓存的线程池解决方法呢?
100. synchronized加在方法上用的什么锁 可重入锁

101. 可重入锁中的lock和trylock的区别

trylock(time ) 等待指定时间才会尝试获取锁返回true
102. innodb对一行数据的读会枷锁吗?不枷锁读实际读的是副本
103. redis做缓存是分布式存的?不同的服务器上存的数据是否重复?guava cache呢?是否重复?不同的机器存的数据不同
104. 用awk统计一个ip文件中top10
105. 对表做统计时可直接看schema info信息,即查看表的系统信息
106. mysql目前用的版本
107. 公司经验丰富的人给了什么帮助?(一般boss面会问这些)
108. 自己相对于一样的应届生有什么优势
109. 自己的好的总结习惯给自己今后的工作带了什么帮助,举例为证

110. 原子类,线程安全的对象,异常的处理方式

111. 4亿个int数,如何找出重复的数(用hash方法,建一个2的32次方个bit的hash数组,每取一个int数,可hash下2的32次方找到它在hash数组中的位置,然后将bit置1表示已存在)
112. 4亿个url,找出其中重复的(考虑内存不够,通过hash算法,将url分配到1000个文件中,不同的文件间肯定就不会重复了,再分别找出重复的)
有1万个数组,每个数组有1000个整数,每个数组都是降序的,从中找出最大的N个数,N<1000

113. LinkedHashmap的底层实现
114. 类序列化时类的版本号的用途,如果没有指定一个版本号,系统是怎么处理的?如果加了字段会怎么样?

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。 
115. Override和Overload的区别,分别用在什么场景
116. java的反射是如何实现的

类的字节码 Class.forname("类的全路径")

原文地址:https://www.cnblogs.com/shan1393/p/9017490.html