core java interview point (2)

接上篇(1)

 

11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

 HashMap是键值对形式的集合map,是由数组和链表数据结构。ConcurrentHashMap是线程安全的HashMap“再包装”,是由一些列的Segment标签标注的HashMap。

 具体的讲解请参照我的博客《HashMap和ConcurrentHashMap的区别,HashMap的底层源码》

 

 

12. TreeMap、HashMap、LindedHashMap的区别。

Map集合是Java集合工具类顶级父类接口,键值对形式存储数据。

HashMap是Map接口最常用的实现类,根据键的hashcode值存储数据,使用get(1)或者get('key')获取值,访问数度快遍历顺序是随机的。HashMap允许一条记录的键为null,值可以为空,HashMap是非线程安全的,可以使用集合工具类Collections.synchronziedMap()线程安全包装,返回一个线程安全的map或者使用ConcurrentHashMap。HashTable与HashMap类似,但是它是Dictionary类的子类,不允许key或者value为bull并且是线程安全的。

TreeMap是SortMap的实现类,能够将其保存的数据根据键排序,默认升序(ASC)也可以重写排序方法,因此使用Iterator遍历时候是有序的。

扫描二维码关注公众号,回复: 240252 查看本文章

LinkedHashMap是KashMap的子类,它是有序的保存了插入时候的顺序,

 

 

13. Collection包结构,与Collections的区别。

Collection是集合工具类顶级父类接口,实现类包括List, Set等;Collections集合工具类,提供了集合类的公共处理方法,比如排序sort,synchronziedMap,synchronziedList等方法。

 

14. try catch finally,try里有return,finally还执行么?

try...catch用于捕获异常并处理一样,finally用于该语法最后,用于处理不论是否异常都需要完成的逻辑,而不论是否有return都执行。

 

15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

Ecveption和Error都是顶级异常接口Throwable的子接口。Throwable接口包含了一个线程创建时执行线程执行堆栈的快照,提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

Exception:运行时异常RuntimeException和非运行时异常

  运行时异常是java编译器不会检查的会在程序运行时出现的异常,如ArithmaticException, NullpointException, OutOfMemoryException, IndexOutOfBoundException等

非运行时异常,一般都是我们提供的代码中需要显示throw的自定义异常类。

 

Error:用于指示合理运行的程序因为系统以外的因素如系统错误等。

 

OOM:OutOfMemoryException内存异溢出,是虚拟机jvm内存运行过程中因为内存不足而导致抛出异常,程序停止运行

 

16. Java面向对象的三个特征与含义。

抽象:是对一个主题中共同部分的拆分和细节的忽略,以便更充分的描述这样一类的公共特征。

继承:继承是一种子类能够通过复用父类的方法属性而提供的明确表述共性的方法。一个新对象可以从现有的对象中派生或者修改部分对象方法,并且新对象仍然可以自由增加新的方法可以使之更适合特殊的需求。

封装:将过程和数据等逻辑重新写在一个新的方法中,对他的访问只能通过这已定义的接口访问。

多态:父类的引用,在同一个行为下却因为不同的子类实现而不同。由此衍生出了:

引用变量类型:编译时类型和运行时类型。编译时类似由声明该变量时使用的类型决定,运行时类型由实际给该变量赋值对象决定。

 

17. Override和Overload的含义去区别。

Override重写是在对象继承机制中,子类对象对父类或者超类中某一个方法的逻辑进行的特殊改变以适应新需

Overload重载,是在同一个类中,具有相同的名称的方法,但是参数的个数,类型或者位置不同。与方法返回数据类型无关。

 

18. Interface与abstract类的区别。

abstract抽象类,我们知道在java中,所有的对象都是通过类来描述,但是不是所有的类都来描述对象,对于一个没有足够信息来描述一个具体的对象,而需要更加具体的类来支撑和补充,那么这样的类我们称之为抽象类。

Interface接口,是定义的某一个领域的一种规则或者协议,所有实现该接口的类都必须遵循这些协议并实现他们。它是一种形式,是抽象类的延伸和抽象化,一个类可以同时实现多个接口使用关键值inplements标识。

两者都是不可以直接实例化,而需其子类或者实现类来完成

 

19. Static class 与non static class的区别。

static class内部静态类,non static class非静态内部类。

内部静态类不需要有指向外部类的引用,不能够访问外部类的非静态成员,

但非静态内部类需要有对外部类的引用,即不能脱离外部类实例被创建,能够访问外部类的静态和非静态成员。

nested class are devided into two categories: static and non-static. Nested classed that are declared static are called static nested classes, non-static nested classed are called inner class.

内部静态类是称为内部嵌套类,非静态内部类称为内部类。

嵌套:自己完全独立,就是借用壳而隐藏自己

内部类:是一部分,了解你并知道全部,没有外部类就不存在内部类。

 

20. java多态的实现原理。

java多态,就是同一个操作作用于不同的对象,却有不同的方法逻辑和执行结果,父类的引用指向子类的对象实例。它允许基类的引用指向派生类的对象,在具体访问时实现方法的动态绑定。

 

21. 实现多线程的两种方法:Thread与Runable。

线程接口是Runable,java也提供了一个实现类Thread,我们初始化一个线程对象,我们既可以继承线程类Thread也可以实现Runable接口实现run方法。

Thread th = new Thread(new Runable(override run()));

th.start();

使用实现方式,能够避免单继承而导致的某些局限性。

 

22. 线程同步的方法:sychronized、lock、reentrantLock等。

何为同步?

我们使用一个变量,这个变量在第一个线程中进行读写操作,第二个线程同时访问该变量,可能会导致第一个线程读取的该变量的值是第二个线程改变的,反之亦然。这样一个变量在并发情况下值不能保证“一致性”的情况,我们称之为非线程安全。

synchronzied关键字,是java提供的最基础的用于线程安全锁。用于修饰类,方法,代码块。在修饰代码块时候,必须绑定一个reference对象作为锁对象,我们可以使用this当前对象。在修饰方法时候默认就是当前对象。修饰类时候默认当前类的class对象作为锁对象。

synchronzied的锁机制是使用monitorenter和monitorexit字节码指令,在每次进入代码块时候执行monitorenter获取对象锁,如果对象没有被锁或者已经是当前对象锁定,那么锁计数器加一,退出同步块monitorexit减1、直到0主动释放该对象的锁。因此synchronzied是可重入得,不会出现自己把自己锁死的。

在Java1.5以后,增加了reentrantLock和Atomic:

ReentrantLock,以对象的方式操作对象锁,相对于synchronzied需要手动finally释放锁,并且多了其他功能:

1.等待可中断:在持有锁的线程长时间无法释放锁时候,等待的线程可以选择主动放弃,tryLock(long timeout, TimeoUnit unit)

2.公平锁:所有的线程是按照申请的顺序来获取锁称之为公平锁。synchronzied是非公平的,线程的优先级越高,获取锁越高。new ReentrantLock(boolean fair)

3.绑定多个condition:通过多次new Condition可以获取多个condition对象,可以简单实现比较复杂的线程同步,通过awati(), signal()

 

相对于ReentrantLock,synchronzied是直接在JVM层面上实现的,不但可以通过监控工具监控synchronzied锁定,而且在程序出现异常JVM会自动释放锁对象,但是Lock不行,它是通过代码实现的,必须保证锁释放,unLock()放到finally{}中。

在资源竞争不激烈的情况下,synchronzied性能优于ReentrantLock,但是竞争激烈时,synchronzied性能会下降,但是ReentrantLock不变化。

 

23. 锁的等级:方法锁、对象锁、类锁。

方法锁和对象锁是一样的。只有方法锁和类锁两种。都是在java中synchronzied关键字时候,涉及到锁的问题。

java内置锁,每个java对象都可以用作一个实现同步的锁,这些所称之为内置锁。线程进入同步代码块或者方法时候会自动获得锁对象,在退出同步代码块时候释放。触发内置锁,就是程序调用了synchronzied修饰的方法或者代码块。该内置锁是一个互斥锁,一个线程获得锁后,其他线程只能在该线程释放锁之前等待或者阻塞,直到释放。

java的对象锁和类锁:对象锁使用与对象的实例方法,或者一个对象实例,类锁则是用于类的静态成员变量或者类的class上。类的实例对象可以有很多歌,但是每个类只有一个class,所以不同对象锁是互不干扰,但是类锁只有一个。类锁是一个概念,并不真实存在,我们在使用类的静态成员变量时候永远获取的只有一个,就是可以理解为该类锁。

 

猜你喜欢

转载自flycw.iteye.com/blog/2376858
今日推荐