已经进入八月份了,我看到了许多朋友在焦急的准备“金九银十”跳槽面试,甚至很多即将毕业的大学生都在备战秋招,对于学历还算优秀的大学生来说,这是一次离大厂最近的机会,毕竟是应届毕业生,不会对技术有非常严格的要求。
而对于工作了一两年的Android开发朋友来说,这段时间加强技术能力,多掌握一些Android核心技术点是重中之重。
为了大家更好的冲刺金九银十,在此每天分享2~3道面试题,希望能对大家的面试起到一点帮助! 话不多说,一起来看面试题吧!!
有需要更多面试题的小伙伴,可以点击下方课程链接详细了解!!!
https://edu.51cto.com/course/32703.html
分别讲讲 final,static,synchronized关键字可以修饰什么,以及修饰后的作用?
static
1.static 方法 static 方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this 的,因为它不依附于任何对象,既然都没有对象,就谈不上 this了。
public class StaticTest{
public static void a(){
}
public static void main(String[]args){
StaticTest.a();
}
}
2.static 变量 static 变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。 3.static 代码块 static 关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static 块可以置于类中的任何地方,类中可以有多个 static 块。在类初次被加载的时候, 会按照static块的顺序来执行每个 static块,并且只会执行一次。
public class StaticTest{
private static int a ;
private static int b;
static {
a = 1;
b = 2;
}
}
final
1. final 变量 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为 final的都叫作 final变量。final 变量经常和 static 关键字一起使用,作为常量。
private final int aa = 1;
static {
a = 1;
b = 2;
}
private void init(){
aa = 2;//报错编译器会提示 不能赋值。。
}
public static void main(String[]args){
StaticTest.a();
}
class StaticTest2 extends StaticTest{
public final void a(){
//这边就会编译器提示不能重写
}
}
2. final 方法 final也可以声明方法。方法前面加上 final 关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为 final。final 方法比非 final 方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。 3. final 类 其实更上面同个道理,使用 final 来修饰的类叫作 final类。final 类通常功能是完整的,它们不能被继承。Java 中有许多类是 final 的,譬如 String,Interger 以及其他包装类。
synchronized
synchronized 是 Java 中解决并发问题的一种最常用的方法,也是最简单的一种方法。synchronized 的作用主要有三个:
- 确保线程互斥的访问同步代码
- 保证共享变量的修改能够及时可见
- 有效解决重排序问题。
1.synchronized 方法有效避免了类成员变量的访问冲突:
private synchronized void init(){
aa = 2;
}
2.synchronized 代码块 这时锁就是对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的 instance 变量(它得是一个对象)来充当锁。
public final void a(){
synchronized(lock){
//代码
}
}
@Override
public void run() {}
请说一下HashMap与HashTable的区别
HashMap和Hashtable的比较是Java面试中的常见问题, 用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。
1父类不同
第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
public class HashMap<K, V> extendsAbstractMap<K, V>
implements Cloneable, Serializable {...}
public class Hashtable<K, V> extends Dictionary<K, V>
implementsMap<K,V>,Cloneable, Serializable {...}
而HashMap继承的抽象类AbstractMap实现了Map接口:
public abstract class AbstractMap<K, V>
implements Map<K, V> {...}
2 线程安全不一样
Hashtable 中的方法是同步的,而HashMap中的方法在默认情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
3允不允许null值
Hashtable中,key和value都不允许出现null值,否则 会抛出NullPointerException异常。而在HashMap中,null可以作为键,这样的键只有一 个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap 中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
4遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
5哈希值的使用不同
HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
6 内部实现方式的数组的初始大小和扩容的方式不一样
HashTable中的hash数组初始大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16, 而且一定是2的指数。
最后
我整理了一套Android面试题合集,也包括以上面试题,有需要的朋友可以点击下方课程链接详细了解!!!
https://edu.51cto.com/course/32703.html
标签:面试题,HashMap,public,static,Hashtable,Android,final,变量,金九银 From: https://blog.51cto.com/u_16163442/6953205