12,java创建线程有几种方式?
有三中方式可以创建线程:
1,继承Thread类
2,实现Runnable接口
3,应用程序可以使用Executor框架来创建线程池
一般来说实现Runnable接口方式更受欢迎,因为这不需要继承,java只支持单继承,在应用已经设计成继承了别的类的时候,就只能实现接口来提高扩展性了。同时,线程池也是非常高效的。
13,线程状态
就绪(Runnable):线程准备运行,不一定立马就执行
运行(Running):进程正在执行线程的代码
等待(Waiting):线程处于阻塞状态,等待外部的处理结果。
睡眠(Sleeping):线程被强制睡眠。
I/O阻塞:等待I/O操作完成。
同步阻塞(Blocked n Synchronized):等待获得锁。
14,同步方法和同步代码块区别?
在java中,没一个对象都有一把锁,线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
15,在监视器(Monitor)内部,是如何做线程同步的?程序该做哪种级别的同步?
监视器和锁在java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取所之前不允许执行同步代码。
16,什么是死锁(deadlock)?
两个线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁,结果就是两个进程都陷入了无限的等待中。
17,如何确保n个线程可以访问n个资源同时又不导致死锁?
使用多线程时候,一种非常简单的避免死锁的方式是:指定获得锁的顺序,并强制线程按照指定的顺序获得锁。因此,如果所有的线程都是以同样的顺序来加锁和释放锁,就不回出现死锁了。
18,java集合框架基本接口有哪些?
collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的集合。
List:有顺序的集合,并且可以包含重复元素。
Map:存储的是键(key)值(value)对,所以也叫双列集合,可以把键(key)映射到值(value)的对象,键不能重复(值可以),添加重复的值会把前面的值覆盖掉。
19,迭代器
迭代器(Iterator)接口提供了很多对元素集合进行 迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代过程中删除底层集合的元素。
20,Iterator和ListIterator区别?
Iterator可遍历set和list,但ListIterator只能遍历List。
Iterator智能前向遍历,ListIterator即可前向遍历,也可后向遍历。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引。
21,快速失败(fail-fast)和安全失败(fail-safe)区别是什么?
22,java中HashMap的原理是什么?
HashMap是以键值对来存储元素的,HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshoid resizing)。
23,hashcode()heequals()的重要性体现在什么地方?
java中的hashmap和equals方法来确定键值对的索引,当根据键获取值得时候也会用到这两个方法。如果没有正确的实现这两个方法两个不同的键可能会有相同的hash值,因此可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素,所以这两个方法的实现对hashmap的精确性和正确性是至关重要的。
24,hashmap和hashtable有什么区别?
他们都实现了map接口,因此很多特性非常相似,但是,它们有以下不同点:
1,hashmap允许键和值是null的,hashtable不允许键和值是null。
2,hashtable是同步的,而hashmap不是。因此,hashmap更适合单线程环境,而hashtable适合于多线程环境。
3,hashmap提供了可供应用迭代的键的集合,因此,hashmap是快速失败的。另一方面,hashtable提供了对键的列举(Enumeration)。
一般认为,hashtable是一个遗留的类。
25,array和arraylist区别?
Array可以包含基本类型和对象类型,Arraylist只能包含对象类型。
Array大小固定,ArrayList大小动态变化。
ArrayList提供了更多的方法和特性,如:addAll()、removeAll()、iterator()等等。
26,arraylist和linkedlist区别?
都实现了list接口,有以下不同点:
1,arraylist基于索引,底层是数组,它可以以O(1)时间复杂度进行随机访问。linkedlist是以元素列表形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
2,linkedlist插入、删除操作块,查询慢;
arraylist是插入、删除慢,查询块。
29,java的优先级队列(Priority Queue)?
是一个基于优先级的无界队列,元素按照自然顺序排序。
30,大O符号?
31,hashset和treeset区别?
hashset由一个hashmap表来实现,因此,它的元素是无序的,add(),remove(),contains()方法时间复杂度是O(logn)。
GC(Garbage Collectors):垃圾回收
32,垃圾回收目的?什么时候进行?
目的是识别并丢弃应用不再使用的对象来释放和重用资源。
33,System.gc(),Runtime.gc()会做什么事?
都用来提示JVM要进行垃圾回收,但是立即执行还是延迟执行垃圾回收要取决于JVM自身。
34,finalize()方法什么时候调用?析构函数(finalization)目的是什么?
在释放对象占用内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中释放对象持有的资源。
38,如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会,会在下一个垃圾回收周期中,这个对象将是可以被回收的。
39,java的堆结构是什么样子的?什么是堆的永久代?
堆是运行时数据区,所有的类的实例和数组都在堆上分配内存。它在JVM启动时被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器来回收。
堆内存是由死亡的和存活的对象组成的,存活的对策应该是可以访问的,不会被垃圾回收器回收。死亡的对象是应用不可访问尚且还没有被垃圾回收器回收掉的对象。一直垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。
41,在java中,对象什么时候可以进行垃圾回收?
当对象对当前使用这个对象的应用程序变得不可触及的时候,这时候对象就可以被回收了。
42,永久代会进行垃圾回收吗?
不会,若满了或是超过了临界值,会触发完全垃圾回收(Full Gc),永久代也是被回收的,这就是正确的永久代大小对避免Full Gc是非常重要的。
java8中,移除了永久代,新增了一个叫元数据区的native区。
43,java中的两种异常时什么?
Exception和Error,它们都是Throwable的子类,Exception用于程序可以捕捉的异常情况,Error定义了不期望被用户程序捕获的异常,一般直接修改程序。
44,throw和throws区别?
throw:用来在程序中明确的抛出异常
throws:用来在表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法调用者才能确保处理可能发生的异常,多个异常用逗号分开。
45,异常处理的时候,finally代码块作用(重要性)?
fianlly代码块总会被执行,它主要用来释放资源,如:I/O缓冲区,数据库连接。
46,异常处理完成后,Exception对象会发生什么变化?
Exception对象会在下一个垃圾回收过程中被回收掉。
47,finally代码块和finalize()区别?
无论是否有异常,finally块都会执行,主要作用是用来释放被占用的资源。finalize()是Object类的一个protected()方法,它是在对象被垃圾回收之前由java虚拟机来调用的。
java小应用程序Applet
48,什么是Applet?
是能够被包含在HTML页面中的并且能被启用了java的客户端浏览器执行的程序。Applet主要用来创建动态交互的web应用程序。