java中级程序员面试题_Java初中级程序员面试题宝典篇二(记得收藏)

68d84172d069600e7ea407e545d20440.png

多线程部分

什么是多线程?

在一个应用程序中,同时,有多个不同的执行路径。

说一下多线程的好处?

提供程序效率。

线程和进程有什么区别?

线程是进程的一条执行路径,而进程是线程的集合。

什么是线程同步、异步?

线程同步表示,当前线程执行完后下一个线程接着执行。

线程异步表示, 在一个应用程序中,同时,有多个不同的执行路径。例如 javaweb ajax android handler

线程之间如何同步

线程之间同步使用 synchronized、wait 与 notify

什么是线程不安全?如何解决?(重点)

就是在多个线程共享同一个数据会受到其他线程的干扰。如何解决:使用线程同步技术, 用上锁(synchronized)。 让一个线程执行完了,在让另一个线程执行。

如何创建一个线程?有几种方法?

继承thread类, 重写run方法、实现Runnalbe接口,重新run方法 , 启动一个线程用start();

是使用Runnalbe接口好?还是继承Thread类好?

是实现Runnalbe接口好,因为实现的接口还可以继续继承。如果继承了Thread类不能在继承。

sleep()和 wait()有什么区别?

a、sleep是让当前线程指定休眠时间,然后继续工作 不释放锁

b、让当前线程wait则是等待,直到有线程通知notify()唤醒他才会重新工作。释放锁

集合相关面试题

065f3a567ff3c314eb6f2c7d8ec357af.png

说一下数据结构中的什么是数组?什么是链表?

所谓数组,是相同数据类型的元素按一定顺序排列的集合

数组:存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

所谓链表,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

说一下什么是哈希表

那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:

4b1836565402a2cd389fb6b06e162e18.png

4ee396afbedcde7f9297b346e84de27b.png

说一下ArrayList底层实现方式?

①ArrayList通过数组实现,一旦我们实例化ArrayList无参数构造函数默认为数组初始化长度为10

②add方法底层实现如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。是一旦数组超出长度,就开始扩容数组。扩容数组调用的方法 Arrays.copyOf(objArr, objArr.length + 1);

说一下LinkedList底层实现方式?

LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,如下:

dea2619a46d9d53815bb07b77ad58aa0.png

既然是双向链表,那么必定存在一种数据结构——我们可以称之为节点,节点实例保存业务数据,前一个节点的位置信息和后一个节点位置信息,如下图所示:

6e3213d70a791b6ad12ff7d9a9d09456.png

说一下HashMap底层实现方式?

HashMap是由数组+链表组成

put方法底层实现:

通过key的hash值%Entry[].length得到该存储的下标位置,如果多个key的hash值%Entry[].length 值相同话就就会存储到该链表的后面。

ArrayList 和 Vector 的区别

这两个类都实现了 List 接口(List 接口继承了Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,

ArrayList 与 Vector 的区别,这主要包括两个方面:.

(1)同步性:

Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayList 是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用 ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用 Vector,因为不需要我们自己再去考虑和编写线程安全的代码。

(2)数据增长:

ArrayList 与 Vector 都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加 ArrayList 与 Vector 的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector 默认增长为原来两倍,而 ArrayList 的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。

ArrayList 与 Vector 都可以设置初始的空间大小,Vector 还可以设置增长的空间大小,而 ArrayList 没有提供设置增长空间的方法。

HashMap 和 Hashtable 的区别

280c0cfc56d56dbb551d63fb85c0aa72.png

写在最后:

未完待续!既然看到这里了,觉得笔者写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值