没有合适的资源?快使用搜索试试~ 我知道了~
首页Java面试宝典:基础入门与核心概念解析
Java面试宝典:基础入门与核心概念解析
需积分: 5 0 下载量 190 浏览量
更新于2024-06-30
收藏 11.67MB DOCX 举报
本资源是一份Java面试宝典的初步章节,主要聚焦于Java的基础知识。首先,讲解了面向对象编程的四个核心特性:封装、继承、多态和抽象。封装强调将对象的属性和行为封装在一起,隐藏内部细节,增强代码的安全性;继承使得子类能够继承父类的特性并扩展,提高代码复用性;多态则是通过动态绑定实现,允许不同对象对同一消息作出响应,是封装和继承的自然延伸;抽象则是在设计中对同类概念的概括,Java中通过abstract关键字定义抽象类或接口。 其次,介绍了Java的基本数据类型,这是理解Java编程基础的关键,包括基本数值类型如int、float等,以及字符类型char等。这部分考察面试者对Java语言基本数据结构的熟悉程度。 接着,文档明确了理解JDK、JRE和JVM之间的区别的重要性。JDK是Java开发的核心工具包,包含开发环境和库;JRE是运行Java程序所需的最低环境,包含虚拟机和核心类库;JVM是Java的核心组成部分,负责执行Java字节码,实现跨平台特性。 讨论了Java中的重载和重写概念,重载强调在同一类内方法名称相同但参数不同导致的不同实现,而重写则涉及子类对父类方法的扩展,需满足特定的参数、返回值和访问修饰符要求。 最后,讲解了Java中"=="和equals方法的区别。"=="用于比较基本类型的值和引用类型的地址,而equals方法在引用类型中默认比较的是对象的地址,但在String类中,equals方法经过特殊处理,可以比较字符串的内容。 掌握这些知识点对于理解和应用Java编程至关重要,是面试中常被问到的基础问题。在深入学习和备考Java开发者职位时,理解并熟练运用这些概念是必不可少的。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86501383/bg10.jpg)
13
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO 插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
1. 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是 0 来决定
(2)Map 接口有四个实现类:
HashMap
基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键, 线程
不安全。
HashTable
线程安全,低效,不支持 null 值和 null 键;
LinkedHashMap
线程不安全,是 HashMap 的一个子类,保存了记录的插入顺序;
TreeMap
能够把它保存的记录根据键排序,默认是键值的升序排序,线程不安全。
2.5Hashmap 的底层原理(高薪常问)
HashMap 在 JDK1.8 之前的实现方式 数组+链表,
但是在 JDK1.8 后对 HashMap 进行了底层优化,改为了由 数组+链表或者数值+红黑
树实现,主要的目的是提高查找效率
![](https://csdnimg.cn/release/download_crawler_static/86501383/bg11.jpg)
14
1. Jdk8 数组+链表或者数组+红黑树实现,当链表中的元素超过了 8 个以后, 会
将链表转换为红黑树,当红黑树节点 小于 等于 6 时又会退化为链表。
2. 当 new HashMap():底层没有创建数组,首次调用 put()方法示时,底层创建长度
为 16 的数组,jdk8 底层的数组是:Node[],而非 Entry[],用数组容量大小乘以加载因子得
到一个值,一旦数组中存储的元素个数超过该值就会调用 rehash 方法将数组容量增加到原
来的两倍,专业术语叫做扩容,在做扩容的时候会生成一个新的数组,原来的所有数据需要
重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.
默认的负载因子大小为 0.75,数组大小为 16。也就是说,默认情况下,那么当 HashMap
中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍。
3. 在我们 Java 中任何对象都有 hashcode,hash 算法就是通过 hashcode 与自己进
行向右位移 16 的异或运算。这样做是为了计算出来的 hash 值足够随机,足够分散,还有
产生的数组下标足够随机,
map.put(k,v)实现原理
(1)首先将 k,v 封装到 Node 对象当中(节点)。
(2)先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
(3)下标位置上如果没有任何元素,就把 Node 添加到这个位置上。如果说下标对应的位
置上有链表。此时,就会拿着 k 和链表上每个节点的 k 进行 equal。如果所有的 equals 方
法返回都是 false,那么这个新的节点将被添加到链表的末尾。如其中有一个 equals 返回了
true,那么这个节点的 value 将会被覆盖。
map.get(k)实现原理
(1)、先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
(2)、在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返
回 null。如果这个位置上有单向链表,那么它就会拿着参数 K 和单向链表上的每一个节点
的 K 进行 equals,如果所有 equals 方法都返回 false,则 get 方法返回 null。如果其中一
![](https://csdnimg.cn/release/download_crawler_static/86501383/bg12.jpg)
15
个节点的 K 和参数 K 进行 equals 返回 true,那么此时该节点的 value 就是我们要找的
value 了,get 方法最终返回这个要找的 value。
4. Hash 冲突
不同的对象算出来的数组下标是相同的这样就会产生 hash 冲突,当单线链表达到一定长度
后效率会非常低。
5. 在链表长度大于 8 的时候,将链表就会变成红黑树,提高查询的效率。
2.6 Hashmap 和 hashtable ConcurrentHashMap 区别(高薪常问)
区别对比一(HashMap 和 HashTable 区别):
1、HashMap 是非线程安全的,HashTable 是线程安全的。
2、HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。
3、因为线程安全的问题,HashMap 效率比 HashTable 的要高。
4、Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更适合于单线
程环境,而 Hashtable 适合于多线程环境。一般现在不建议用 HashTable, ①
是 HashTable 是遗留类,内部实现很多没优化和冗余。②即使在多线程环境下,
现在也有同步的 ConcurrentHashMap 替代,没有必要因为是多线程而用
HashTable。
区别对比二(HashTable 和 ConcurrentHashMap 区别):
HashTable 使用的是 Synchronized 关键字修饰,ConcurrentHashMap 是
JDK1.7 使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap 取消了
Segment 分段锁,采用 CAS 和 synchronized 来保证并发安全。数据结构跟 HashMap1.8
的结构类似,数组+链表/红黑二叉树。
synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就
不会产生并发,效率又提升 N 倍。
3.多线程(必会)
3.1 什么是线程?线程和进程的区别?(了解)
线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的
可以独立运行的基本单位。
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作
系统进行资源分配和调度的一个独立单位。
![](https://csdnimg.cn/release/download_crawler_static/86501383/bg13.jpg)
16
特点:线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行
时各自内存单元相互独立,线程之间 内存共享,这使多线程编程可以拥有更好
的性能和用户体验。
3.2 创建线程有几种方式(必会)
1.继承 Thread 类并重写 run 方法创建线程,实现简单但不可以继承其他类
2.实现 Runnable 接口并重写 run 方法。避免了单继承局限性,编程更加灵活,实
现解耦。
3..实现 Callable 接口并重写 call 方法,创建线程。可以获取线程执行结果的返回
值,并且可以抛出异常。
4.使用线程池创建(使用 java.util.concurrent.Executor 接口)
![](https://csdnimg.cn/release/download_crawler_static/86501383/bg14.jpg)
17
3.3Runnable 和 Callable 的区别?(必会)
主要区别
Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型
Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方
法允许抛出异常,可以获取异常信息
3.4 如何启动一个新线程、调用 start 和 run 方法的区别?(必会)
线程对象调用 run 方法不开启线程。仅是对象调用方法。
线程对象调用 start 开启线程,并让 jvm 调用 run 方法在开启的线程中执行
调用 start 方法可以启动线程,并且使得线程进入就绪状态,而 run 方法只是 thread 的一
个普通方法,还是在主线程中执行。
3.5 线程有哪几种状态以及各种状态之间的转换?(必会)
1. 第一是 new->新建状态。在生成线程对象,并没有调用该对象的 start 方法,这是线程处于
创建状态。
2. 第二是 Runnable->就绪状态。当调用了线程对象的 start 方法之后,该线程就进入了就绪
状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
3. 第三是 Running->运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线
程就进入了运行状态,开始运行 run 函数当中的代码。
4. 第四是阻塞状态。阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直到线程
进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(1)等待 – 通过调用线程的 wait() 方法,让线程等待某工作的完成。
(2)超时等待 – 通过调用线程的 sleep() 或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。
当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状
态。
(3)同步阻塞 – 线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),它会进入同
步阻塞状态。
5. 第五是 dead->死亡状态: 线程执行完了或者因异常退出了 run()方法,该线程结束生命周期.
剩余164页未读,继续阅读
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![text/x-c++](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)