1、== 和 equals 的区别是什么?

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

 

2、final、finally、finalize 有什么区别?

final:是修饰符,如果修饰类,此类不能被继承;修饰的方法不能被重写;修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

finally:是 try{} catch{} finally{} 后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果finally部分存在则一定会执行finally里面的代码。

finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。

 

3、String 、StringBuffer、StringBuilder的区别和使用场景

       String 字符串常量(final修饰、不可被继承、线程不安全)

       StringBuffer、StringBuilder可以改变字符串的长度和内容,是一个字符串缓冲区,在做大量字符串拼接的时候不会开辟新的空间。

       StringBuffer线程安全、效率低;StringBuilder非线程安全、效率更高。

使用的总结:

操作少量的数据: 适用String

单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder

多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer

 

4、接口和抽象类有什么区别?

都不能实例化对象,都可以包含抽象方法,而且抽象方法必须被继承的类全部实现。

参数

抽象类

接口

实现

子类使用extends关键字来继承抽象类

子类使用关键字implements来实现接口

构造方法

可以有

不能有

访问修饰符

抽象方法可以有public、protected和default这些修饰符

接口方法默认修饰符是public。不可以使用其它修饰符。

多继承

抽象方法可以继承一个类和实现多个接口

接口只可以继承一个或多个其它接口

 

5、HashMap 和 Hashtable区别和使用

存储:HashMap 允许 key 和 value 为 null,而 Hashtable 不允许。

线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。

推荐使用: Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。

 

6、如何决定使用 HashMap 还是 TreeMap

对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

 

7、ArrayList 和 Vector 的区别

线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程 安全的。

性能:ArrayList 在性能方面要优于 Vector。

扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加1倍,而ArrayList 只会增加 50%。

 

8、哪些集合类是线程安全的

Vector、Hashtable、Stack 、ConcurrentHashMap

 

9、Iterator 和 ListIterator 有什么区别

Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。

Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。

ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

 

10、HashMap 和HashSet 实现原理

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时, HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算 出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

JDK 1.8对HashMap进行了比较大的优化,底层实现由之前的“数组+链表”改为“数组+链表+红黑树”。当链表节点较少时仍然是以链表存在,当链表节点较多时 (大于8)会转为红黑树。

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的 实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成, HashSet 不允许重复的值。

 

11、Java对象的序列化和反序列化

把对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为对象的过程称为对象的反序列化。

序列化用途:

想把的内存中的对象状态保存到一个文件中或者数据库中时候;

想用套接字在网络上传送对象的时候;

想通过RMI(远程方法调用)传输对象的时候。

 

12、并行和并发的区别

并行:多个处理器或多核处理器同时处理多个任务。

并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。

并行 = 两个队列和两台咖啡机。并发 = 两个队列和一台咖啡机。

 

13、用户线程和守护线程的区别

用户线程:平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程

守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。在 Java 中垃圾回收线程就是特殊的守护线程。

优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。

二者其实基本上是一样的。唯一的区别在于JVM何时离开。

用户线程:当存在任何一个用户线程未离开,JVM是不会离开的。

守护线程:如果只剩下守护线程未离开,JVM是可以离开的。

在Java中,制作守护线程非常简单,直接利用 setDaemon(true)

 

14、线程与进程的区别?

进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。

一个程序至少有一个进程,一个进程至少有一个线程。

 

15、Linux进程的分类

主进程:程序的执行入口,相当于main方法

父进程:用于创建子进程,可以创建多个子进程

              任何进程都有父进程

子进程:由父进程创建

              一个子进程对应一个父进程

守护进程:标记为daemon的子进程

              杀死父进程,子进程与父进程同死

僵尸进程:子进程未标记为daemon

              杀死父进程,子进程变成僵尸进程

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/yangms/p/13837807.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!