因为时间有限,所以这部分很多都没有整理答案,后序有时间再补上。
其他请参看我的系列文章:
互联网公司校招Java面试题总结及答案——阿里、腾讯
互联网公司校招Java面试题总结及答案——微店、去哪儿、蘑菇街
互联网公司校招Java面试题总结及答案——招银科技
互联网公司校招Java面试题总结及答案——乐视、滴滴、华为
互联网公司校招Java面试题总结及答案——CVTE
互联网公司校招Java面试题总结及答案——美团
( 百度Java面经)互联网公司校招Java面试题总结及答案——百度(目前只是部分总结)
互联网公司校招Java面试题总结及答案——京东
1,初始化阶段 调用init()方法
2,响应客户请求阶段 调用service()方法
3,终止阶段 调用destroy()方法
HashMap是非线程安全的,Hashtable是线程安全的,但是由于Hashtable是采用synchronized进行同步,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。
ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对;Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。
ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个叫做Segment的结构,一个Segment其实就是一个类Hash Table的结构,Segment内部维护了一个链表数组,我们用下面这一幅图来看下ConcurrentHashMap的内部结构:
从上面的结构我们可以了解到,ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作,第一次Hash定位到Segment, 第二次Hash定位到元素所在的链表的头部,因此,这一种结构的带来的副作用是Hash的过程要比普通的HashMap要长,但是带来的好处是写操作的时 候可以只对元素所在的Segment进行加锁即可,不会影响到其他的Segment,这样,在最理想的情况下,ConcurrentHashMap可以最 高同时支持Segment数量大小的写操作(刚好这些写操作都非常平均地分布在所有的Segment上),所以,通过这一种结 构,ConcurrentHashMap的并发能力可以大大的提高。
ConcurrentHashMap 的高并发性主要来自于三个方面:
- 用分离锁实现多个线程间的更深层次的共享访问。
- 用 HashEntery 对象的不变性来降低执行读操作的线程在遍历链表期间对加锁的需求。
- 通过对同一个 Volatile 变量的写 / 读访问,协调不同线程间读 / 写操作的内存可见性。
使用分离锁,减小了请求 同一个锁的频率。
通过 HashEntery 对象的不变性及对同一个 Volatile 变量的读 / 写来协调内存可见性,使得 读操作大多数时候不需要加锁就能成功获取到需要的值。由于散列映射表在实际应用中大多数操作都是成功的 读操作,所以 2 和 3 既可以减少请求同一个锁的频率,也可以有效减少持有锁的时间。
(1)线程安全的集合:
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
StringBuffer是线程安全,而StringBuilder是线程不安全的。
(2)
hashTable同步的,线程安全,而HashMap是非同步的,线程不安全,效率上逼hashTable要高。
hashMap允许空键值,而hashTable不允许。
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
HashMap实现同步的方法:调用Collections的静态方法 Collections.synchronizedMap(Map map);,返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
同时说一下,ArrayList和HashSet,他们也都不是同步的,都是线程不安全的,对其实现同步的方式和HashMap的方式相同,都允许使用null元素,ArrayList分配的初始空间为10,HashSet分配的初始空间为16
class A {
synchronized void f1(){}
synchronized void f2(){}
}
Thread T1,T2,分别调用A的f1和f2是否会相互之间有影响。
这个问题实际上很简单,就是对象锁问题。
类:在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。final类中的方法默认是final的,变量则不是;
方法:只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。注:类的private方法会隐式地被指定为final方法。
变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。
记住,即使没有显示地声明为static,类的构造器实际上也是静态方法。
static是不允许用来修饰局部变量。
static关键字只会出现在类中,不会出现在任何方法中。
这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
tomcat集群
类似Google Gson的还有什么包
tomcat加载基本流程,涉及到的参数
Spring、SpringMVC原理、流程
Mybatis原理
Hibernate了解吗,Mybatis和Hibernate的区别
设计模式在spring中的使用
jvm参数、调优
JDK1.8有什么新特性
什么情况下会触发Minor GC
java线程之间的通信
HashMap&ConcurrentHashMap原理、区别
使用过什么同步器
项目遇到什么难以解决的BUG
项目怎么改为分布式的
String是基本类型吗,为什么可以用+操作
两个方法完全相同可以重载吗,有什么办法可以
try里面return,finally再return,哪个会返回,字节码怎么变的
java有几种引用类型,什么情况下使用软引用,GC时如何判定哪些软引用需要回收
使用过什么垃圾收集器,Serial收集器有什么特点
java同步方式,有什么同步器
AtomicInteger原理
什么状况下不适合用CAS
怎样让一个线程放弃锁,放弃锁后什么时候能再次获取锁
Synchronized与Lock有什么区别
服务器怎么记忆用户登录状态
Cookie&Session的格式、传输的内容
Java的垃圾回收机制有了解过吗?
2.GC的算法。
3.Java的引用类型。