909422229__Hashtable、HashMap、hashset区别分析与一些面试小题

HashMap底层实现:

基于哈希表的Map接口的非同步实现,hashmap与hashTable很想,

HashMap父类 :AbstractMap

Hashtable父类:Dictiionary

是否同步:HashMap否/Hashtable是

k,v可否null:HashMap是/Hashtable否

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口。

主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

hashmap实际上是一个链表的数组的数据结构,每个数组中的每一项又是一个链表,当新建一个hashmap

的时候就会初始化一个数组。存放在链表头节点的数组,即数组与链表的结合体。

在java语言中,最基本的结构有了两种,一个是数组,一个是链表。

如何让hashMap实现线程安全?

如果在多线程的环境下,可以通过Collections中的synchronizedMap()获取到一个线程安全的hashMap。

HashMap与HashTable的区别:

hashMap是对Map接口的实现,hashtable实现Map接口与dictionary抽象类。hashMap初始容量为16,hashtable是11,

两者的默认填充因子都是0.75,hashmap扩容时会翻倍。

hashMap与hashset,hashTable区别:

hashSet不是key value结构,仅仅是存储不重复的元素,相当于简化版的hashMap,只是包含了hashMap的key而已。

查看源码就是这样。hashSet也是也是非线程安全的。

heap和Stack有什么区别?

           Java中的内存有两种,一类是栈内存,一类是堆内存,栈内存是指程序进入一个方法时,会为这个方法单独分配一块私有属性存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配这个空间的栈就会释放,栈中的变量也就随之是释放。

堆与栈作用不同得内存,例如对象。

Static是否可以被覆盖! NO or Yes

静态方法可以被子类继承,从表面上的确重写了父类的静态方法,实际上:

每一个静态方法都会与本类的类名绑定,才可以直接调用静态方法,

所以父类的静态方法不会与子类类名绑定,而从表面上看到的重写【覆盖】

只是一个在子类中存在的一个新的静态方法,并不是覆盖。

== Or equlas的区别

== 号是代表着比较地址,而equlas的调用者肯定是引用类型,两个引用类型调用

Equlas 比较的是 值 ,而因为系统自动重写了equlas方法,所以改变成比较值。

final finally,finalize的区别

final  最终,被定义赋值之后无法被修改。

修饰方法,方法不能被重写,修饰类,类不能被继承,修饰变量,就变成了常量

(2)finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象进行垃圾回收,类

似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行I/0操作);

(3)finally{}用于标识代码块,与try{}进行配合,不论try中的代码执行完或没有执行完(这里指有异常),

**该代码块之中的程序必定会进行;

被finally控制的语句体一定会执行

特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))

finally的作用

用于释放资源,

在IO流操作和数据库操作中会见到

Finally

ThrowsOrthrow区别(面试题)

 * throw:如果出现了异常情况,我们可以把该异常抛出,这个时候抛出的是异常的对象

 *                在方法内部

 * throws和throw的区别(面试题)

 * throws

 *                用在方法声明的后面,跟的是异常类名

 *                可以跟多个异常类名,用逗号隔开

 *                表示抛出异常,由该方法的调用者来处理

 *                throws表示出现异常的一种可能性,并不一定会发生这些异常

 * throw

 *                用在方法体内,跟的是异常对象名

 *                只能抛出一个异常对象名

 *                表示抛出异常,由方法体内的语句处理

 *                throw是抛出了异常,执行throw则一定抛出了某种异常

 *

 

 

JAVA中存在内存泄的原因是什么?

长生命周期的对象持有短生命周期对象的引用就很有可能发生内存泄漏。

 

为什么要在实体类中序列化?

以某种形式使对象持久化,允许我们在内存中创建复用的java对象,通常JVM处于运行时,这些对象那个才可以存在。即这些对象的生命周期不会比JVM的声明周期长。

序列化可以将内存中的类写入文件或者数据库中。下次读取的时候只需要将序列化的对象进行反序列化到内存中并保留序列化时类中大的所有变量和状态。

简单来说就是用来处理对象流的一中机制。我们可以对流化的对象进行读写。

 

如何获得线程安全效率又高的集合:

ArrayList-----------CopyOnWriteArrayList();              不是利用锁机制进行线程安全,而是利用复制新的进行替换进行。

   应用场景:读操作的概率明显多于写操作,那么效率高

HashMap--------ConcurrentHashMap                        对其中的某一段加锁。互不影响。相当于局部加锁。锁分级。这样不会影响

 

hashSet

就是HashMap

值为null

ArrayList

数组

 

LinkedList

链表

 

HashTable

数组加链表

 

ConcurrentHashMap

就是hashMap

分段加锁

BlockingQueue

实现了生产者和消费者的z阻塞队列

 

ExecuteorService

线程池,使用完之后等待下次启动

 

 

 

System。exit();

JDK1.8中接口中的方法可以有实现的方法

Assert 用来调试代码。上线绝不能出现

断点、junit  已经代替

对象创建:new 工厂方法 = SpringIOC支持   反射  反序列化  克隆

 

单例

工厂

代理

装饰

分层

MVC:架构模式

你可能感兴趣的:(面试)