本就无意写些什么,仅仅记录一下看的一些面试题目,并且继续修改吧
http://www.jsondream.com/2016/10/13/distribute-base-knowledge.html
1、 什么是负载均衡
负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
2、 in ,exists,not in,not exists
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in;
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引,而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。
3、 什么是原子操作
指不会被线程调度机制打断的操作
4、 Volatile和synchronized的区别
volatile是变量修饰符,而synchronized则作用于一段代码或方法;
volatile只是在线程内存和“主”内存间同步某个变量的值(用一句话概括volatile,它能够使变量在值发生改变时能尽快地让其他线程知道);
而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源
5、 Set、List、Map的区别和联系
List:
1、可以允许重复的对象
2、可以插入多个null元素
3、有序的
4、常用子类:ArrayList,LinkedList,Vector
①ArrayList:
基于动态数组的数据结构;
不同步;
通过ensureCapacity()方法进行扩容,每次增长1.5倍
随机访问速度快
②LinkeList:
基于双向链表的数据结构;
不同步;
增加删除速度快
③Vector:
基于数组的数据结构;
同步;
扩容,每次增长2倍;
如果要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
Set:
1、不包含重复元素;
2、无序的
3、常用子类:HashSet,LinkedHashSet,TreeSet
①HashSet:
不同步;
无序;
元素集合可以放null,但是只能放一个null;
调用hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置
②LinkeHashSet:
有序
迭代方法Set中元素,性能优于HashSet
同样 hashCode值来决定该对象在HashSet中存储位置,但是它同时使用链表维护元素次序
③TreeSet:
有序,支持自然排序 和定制排序
Map:
1、key不可以重复,value可以重复
2、常用子类:HashMap,Hashtable
①HashMap:
是非synchronized的,线程不安全的;
可以接受null;
HashMap不能保证随着时间的推移Map中的元素次序是不变的;
②Hashtable:
是线程安全的也是synchronized,单线程环境下它比HashMap要慢;
不可以接受null。
6、 HashMap的源码,实现原理,底层结构。
HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。
HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象太多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。
7、 Final和static
Final:
final类不能被继承,没有子类,final类中的方法默认是final的;
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
Static:
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块;
被static修饰的成员变量和成员方法独立于该类的任何对象
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
9、 Class.forName和classloader的区别
Class.forName:将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块;
classloader:将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块
10、
11、 string、stringbuilder、stringbuffer区别
String 字符串常量:
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuffer 字符串变量(线程安全)
StringBuffer 对本身进行操作,而不是生成新的对象,再改变对象引用。
StringBuilder 字符串变量(非线程安全)
与StringBuffer 基本相同
12、 hashtable和hashmap的区别
hashmap:
①基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长;
②非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap;
③实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆;
④允许有null的键和值
⑤效率相对于hashtable高点
hashtable:
①线程安全;
②不允许有null的键和值;
③效率相对hashmap低点
13、 Hash冲突怎么办?哪些解决散列冲突的方法?
①开放定址法:
当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。
按照形成探查序列的方法不同,可将开放定址法区分为线性探测再散列,二次探测再散列,伪随机探测再散列。
线性探测再散列
dii=1,2,3,…,m-1
这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
二次探测再散列
di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )
这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
伪随机探测再散列
di=伪随机数序列。
具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点
②再哈希法:
这种方法是同时构造多个不同的哈希函数。当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,
直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
③链地址法:
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,
因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
④建立公共溢出区:
将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
14、 Java的内存模型以及GC算法
15、 讲讲mybatis的连接池。
16、 spring框架中需要引用哪些jar包,以及这些jar包的用途
17、 springMVC的原理
18、 springMVC注解
19、 spring中beanFactory和ApplicationContext的联系和区别
20、 springIOC和AOP
21、 string、stringbuilder、stringbuffer区别
22、 hashtable和hashmap的区别
23、 Java 的引用类型有哪几种
24、 java的基础类型和字节大小。
25、 Hash冲突怎么办?哪些解决散列冲突的方法?
26、 什么时候使用字节流、什么时候使用字符流?
27、 递归读取文件夹下的文件,代码怎么实现
28、 session和cookie的区别和联系,session的生命周期
29、 jsp和servlet的区别
30、 Java的内存模型以及GC算法
31、 jvm性能调优都做了什么
32、 jvm 如何分配直接内存, new 对象如何不分配在堆而是栈上,常量池解析
33、 spring如何实现事物管理的