昨天向公司提交离职申请通过之后,内心还是很不安的,毕竟目前除了有一家上市公司给我发了offer之外(路程太远,不打算去),其他的都是还不确定的,而且现在前前后后面试也快一个月了,现在才拿到一个offer是有点不正常的,而且现在马上就要到年底了,我想很多公司都不会再招聘新人了吧。
Java面试问到的基础知识点:
Static关键字的作用和意义:
1)static修饰的成员变量和方法,从属于类;普通变量和方法从属于对象;静态方法不能调用非静态成员,编译会报错。
2)方便在没有创建对象的情况下进行调用(方法/变量)。
3)静态变量只有一个,被类所拥有,所有的对象都共享这个静态变量,而实例对象与具体对象有关。
4)构造方法用于对象的初始化。静态初始化块,用于类的初始化操作。
二、成员变量和静态变量的区别:
1、**生命周期的不同:**成员变量随着对象的创建而存在随着对象的回收而释放。静态变量随着类的加载而存在随着类的消失而消失。
2、**调用方式不同:**成员变量只能被对象调用。静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
3、**别名不同:**成员变量也称为实例变量。静态变量称为类变量。
4、数据存储位置不同:成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
三、静态使用时需要注意的事项:
1、静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
2、静态方法中不可以使用this或者super关键字。
3、主函数是静态的
四、什么时候使用static来修饰
1、静态变量:
(1)当分析对象中所具备的成员变量的值都是相同的,这时这个成员就可以被静态修饰。
(2)只要是数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。
(3)如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,是静态的。
2、静态函数。
(1)函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中特有的数据。
(2)简单来说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,但是非静态需要被对象调用,而仅创建对象是没有意义的。
3、静态代码块:
(1)随着类的调用或创建实例而执行,而且只执行一次。
作用:用于给类进行初始化。
HashMap和Map 、ArrayList和LinkedList的区别和联系:
Map是一个接口不能实例化,HashMap是Map的一个实现。
HashMap和HashTable和ConcurrentHashMap的3大区别:
1)HashMap是非synchronized的,HashTable是同步的,线程安全的;Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好Hashtable。ConcurrentHashMap引入了分割(Segment),ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成,Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样
2)HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行。
3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable是enumerator迭代器。
4)HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
5) HashMap不能保证随着时间的推移Map中的元素次序是不变的。
6)HashTable初始size为11,扩容:newsize=oldsize2+1;HashMap初始size为16,扩容:newsize =oldsize2,size一定为2的n次幂。
HashMap和ArrayMap的区别:
HashMap内部是使用一个默认容量为16的数组来存储数据的,而数组中每一个元素却又是一个链表的头结点,所以,更准确的来说,HashMap内部存储结构是使用哈希表的拉链结构(数组+链表),这种存储数据的方法叫做拉链法 。HashMapEntry存储的内容有key、value、hash值、和next下一个HashMapEntry,HashMapEntry数据是按hash(key)%len获取到数组的角标位置进行存储的。
ArrayMap是一个<key,value>映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值,它和SparseArray一样,也会对key使用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作,所以,应用场景和SparseArray的一样,如果在数据量比较大的情况下,那么它的性能将退化至少50%。
[LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序;TreeMap 可以用于排序。](https://www.runoob.com/java/java-collections.html)
TreeMap 可以用于排序处理hash冲突的方法有以下几种:开放地址法、再哈希法、链地址法、建立公共溢出区。