java面试基础(一)
1、接口和抽象类的相同与区别?
相同:
两者都不能被实例化。
只有接口的实现类和抽象类的子类实现接口或抽象类中方法才能实例化。
不同:
接口只能定义方法,不能实现方法,抽象类可以定义和实现方法。
一个类可以实现多个接口,但只能继承一个抽象类。
2、Java提供的多态机制?
重载和覆盖
重载:同一个类中有多个同名方法,但这些同名方法的参数列表不同,在编译时期可以调用不同参数的方法。
覆盖:当一个子类继承了父类后,也同时继承了父类的属性和方法,当父类的方法不能满足子类的需求时,可以在子类中对父类的方法进行改造,即覆盖。在覆盖的过程中,需要提供与父类中被覆盖方法相同的方法名,参数列表和返回类型。
3、覆盖与重载的区别?
1、覆盖是父类与子类之间的关系,是垂直关系,重载是一个类中多个方法直接的关系,是平行关系。
2、覆盖是一个或一对方法产生关系,重载是多个方法。
3、覆盖要求是相同的参数列表,重载要求是不同的参数列表。
4、覆盖中,调用方法是根据对象的类型来决定的,而重载中,调用方法是根据调用时实参与形参来选择方法体。
5、覆盖方法可以改变方法的返回值类型,而重载方法不能改变方法的返回值类型。
4、为什么要把String设计为不变量?
节省空间:字符串常量存储在JVM的字符串池中,可以被用户共享。
提高效率:String会被不用的线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。
安全:String常被用于用户名,密码,文件名,不容易被黑客篡改。
5、Java异常的分类?
Error(程序无法处理的错误),Exception(程序本身可以处理的异常),这两个类均继承Throwable。
Error常见的有StackOverFlowError(堆栈异常)和OutOfMemoryError(内存溢出异常)。
Exception分为运行时异常和非运行时异常,运行时异常可以try/catch捕获或者不处理,但是非运行时异常必须处理,不然无法通过编译。
6、throw和thorws的区别?
一般throw是在定义在方法体中的,用于程序出现异常时主动抛出异常信息。
而throws一般用于方法声明上,代表该方法可能会抛出的异常列表。
7、泛型
泛型,即“参数化类型”,用来解决不确定对象具体类型的问题,在编译阶段有效。
8、内部类及其作用
成员内部类:作为成员对象的内部类。可以访问private及以上外部类的属性和方法。外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。外部类也可访问private修饰的内部类属性。
局部内部类:存在于方法中的内部类。访问权限类似局部变量,只能访问外部类的final变量。
匿名内部类:只能使用一次,没有类名,只能访问外部类的final变量。
静态内部类:类似类的静态成员变量。
String类采用final修饰,不可变,想要修改对象,需要new对象来修改,同时将旧串和新串存进去。
StringBuilder采用无final修饰的字符数组进行保存,可变,但是线程不安全
StringBuffer采用无final修饰的字符数组进行保存,可变,线程安全,可以认为成线程安全的StringBuilder
10、Java中的List
List是一个有序列表,分为以下两种实现方式:
ArrayList使用数组实现,容量可变,非线程安全,随机访问快,扩容时会创建一个更大容量的数组,将旧数组复制到新数组。
LinkedList本质是双向链表,与ArrayList相比插入和删除快,随机访问元素很慢。
如果涉及到多线程,那么就选择Vector(当然,你也可以使用ArrayList并自己实现同步)。
如果不涉及到多线程就从LinkedList、ArrayList中选。 LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除(数组的特性)。
11、Java中线程安全的基本数据类型?
HashTable:哈希表的线程安全版,效率低
ConcurrentHashMap:哈希表的线程安全版,效率高,用于替代HashTable
Vector:线程安全的ArrayList
Stack:线程安全的Blocking
Queue及其子类:线程安全版队列
12、TreeMap
TreeMap是底层为红黑树的Map结构,可保证键的排序和唯一性
TreeMap键不允许插入null,线程不安全,效率高
13、如何选则TreeMap和HashMap
如果要频繁的对Map进行插入、删除、或定位一个元素,选用HashMap,如果需要对Key集合遍历,选用TreeMap
14、Java反射机制?
Java反射机制是指程序在运行过程中可以构造任意一个类的对象,获取任意一个类的成员变量和成员方法,获取任意一个对象所属类的信息,调用任意一个对象的属性和方法。
Java反射机制使Java具有动态获取程序信息和动态调用对象方法的能力。
15、new String()会创建多少对象
1.new String(“abc”)创建几个对象?
答:1个或者2个,如果代码运行时常量池中没有abc则创建两个,分别在常量池中一个,堆中一个。如果常量池已有abc,则只会在堆上创建一个对象
2.String str1 = "abc"创建几个对象
0个或1个
3.String str = “abc” + “def”;创建几个对象
上述代码在编译时就已经被合并成’abcdef’字符串,所以只要常量值中没有abcdef的话只会创建一个对象,这样也减轻的gc的负担
4.String str = “abc” + new String(“def”)创建几个对象
常量池中创建对象abc和def;堆中有new String()和abcdef,也就是4个字符串对象
这就完了吗,其实上述代码在编译阶段也会有优化成以下代码
String s = new String(“def”);
String str = new StringBuilder().append(“abc”).append(s).toString();
很明显,还多出了一个StringBuilder对象,所以答案是5个对象
5.String str = new String(“abc”)+new String(“def”);创建几个对象
常量池两个(abc、def);堆中三个字符串对象(两个new+abcdef);堆中还有一个Stringbuilder对象
6.String str = new String(“abc”+“def”);
两个,常量池中abcdef以及堆中一个new对象
16、final关键字的用法?
final关键字可以修饰类,方法,变量。当修饰类时,该类不能被继承,修饰方法时,该方法不能被重写,修饰变量时,该变量为常量不能被重新赋值。
17、==和equals的区别
1、==
当比较的是基本数据类型时,比较的是数值
当比较的是引用数据类型时,比较的是地址值
2、equals
当没有重写时,比较的是地址值
当重写方法后,一般是比较对象中属性的内容
18、&和&&的区别
&是(1)逻辑与(2)按位与
&&是短路与,&&左边的表达式为false时,直接将右边的表达式短路,不进行计算。
例如在验证用户登录时判定用户名不是 null 而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的 equals 比较,否则会产生 NullPointerException 异常。
19、ArrayList和LinkedList的区别?
1、ArrayList是实现了基于动态数组的数据结构,LinkedList是实现了基于链表的数据结构。
2、对于随机访问get和set方法,ArrayList更方便,因为LinkedList需要移动指针
3、对于新增和删除操作 add 和 remove,LinkedList 比较占优势,因为 ArrayList 要移动数据。
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList 的速度反而优于 LinkedList。但若是批量随机的插入删除数据,
LinkedList 的速度大大优于 ArrayList. 因为 ArrayList 每插入一条数据,要移动插入点及之后的所有数据。
20、线程的生命周期?
1、新建状态(New):线程对象被创建后,就进入了新建状态,如:Thread thread = new Thread();
2、就绪状态(Runnable):调用了start()方法后,启动了该线程,这是处于就绪状态。随时被CPU调度执行
3、运行状态(Running):线程获取到CPU权限进行执行,注意线程只能从就绪状态进入到运行状态。
4、阻塞状态(Blocked):指线程由于某种原因放弃CPU的执行权,进入阻塞状态,暂时停止运行。直到线程再次进入就绪状态,才有机会转成运行状态,阻塞的情况分为三种:
(1)等待阻塞——通过调用wait()方法,让线程等待某工作的完成。
(2)同步阻塞——当线程在获取synchronized同步锁失败时(锁被其他线程占用),会进入同步阻塞状态。
(3)其他阻塞——通过调用sleep(),join()方法或者发出来I/O请求时,线程会进入阻塞状态,当sleep(),join()方法执行完,或者I/O请求处理完,线程会重新进入就绪状态。
5、死亡状态(Dead):线程执行完了,或者异常退出了run()方法,线程生命周期结束。
21、什么情况下会出现死锁?
产生死锁的原因:
1、系统资源不足
2、进程/线程进行推进的顺序不当。
3、资源分配不当
产生死锁的4个必要条件:
1、互斥条件:一个资源每次只能被一个线程使用
2、请求与保持条件:一个进程因请求资源而阻塞时,对以获得资源保持不放。
3、不剥夺条件:对于已获得资源的线程,在其没有使用完之前,不可以强行剥夺。
4、循环等待条件:若干线程形成一种首位相接的循环等待资源的关系。
22、什么是反射?
1、反射就是java语言在运行时拥有的一项可以自我观察的能力。
class 代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。
2、java反射的作用:
在java运行环境中,对于任意一个类,可以知道这个类中有哪些属性和方法,对于任意一个对象,可以调用其中的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能就是java的反射机制。
3、java反射机制提供的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
23、什么是序列化?
序列化就是操作对象流的一种机制,对象流就是将对象的内容流化,可以对流化后的对象进行读写操作,也可以将流化之后的对象在网络中传输,序列化就是为了解决对象流在进行读写操作时的问题。

浙公网安备 33010602011771号