文章目录
- Java基础大纲图
- 面试资料下载(重点)
- 1、Java是一种什么语言,JDK,JRE,JVM三者的区别?
- 2、Java 1.5之后的三大版本?
- 3、Java跨平台及其原理?
- 4、Java 语言的特点?
- 5、什么是字节码,字节码的好处?
- 6、Java 和 C++ 的区别?
- 7、Java的三大特性?
- 8、Java中的基本数据类型和引用数据类型及其区别?
- 9、switch(expr),expr支持哪些数据类型?
- 10、int 和 Integer 有什么区别,怎么理解自动拆箱,自动装箱?
- 11、计算2^3效率最高的方法是?
- 12、Math.round(temp) ?
- 13、float f=3.4;是否正确?
- 14、short s1 = 1; s1 = s1 + 1;有错吗?
- 15、short s1 = 1; s1 += 1;有错吗?
- 16、Java中的注释?
- 17、Java中的访问修饰符?
- 18、重写与重载的区别?
- 19、运算符 &和&&的区别?
- 20、Java 有没有 goto?
- 21、this关键字的用法?
- 22、super关键字的用法?
- 23、Java 的final 关键字?
- 24、break ,continue ,return 的区别及作用?
- 25、在 Java 中,如何跳出当前的多重嵌套循环?
- 26、hashCode 与 equals?
- 27、抽象类和接口的区别是什么?
- 28、什么是接口?
- 29、静态变量与非静态变量的区别
- 30、值传递和引用传递的区别是什么?
- 31、什么是反射?
- 32、String 类中常用的方法?
- 33、String 中的==和 equals 的区别?
- 34、Java 中的 String,StringBuilder,StringBuffer 三者的区别?
- 35、Java中final、finally和finalize的区别?
- 36、Java里可不可以有多继承?
- 37、HashMap 和 Hashtable 的区别?
- 38、Map 集合有哪些实现类,分别具有什么特征?
- 39、解决 hashmap 线程不安全问题?
- 40、Hashmap 的底层实现原理?
- 41、hash 碰撞怎么产生,怎么解决?
- 42、HashMap 为什么需要扩容?
- 43、如何遍历 Map 集合?
- 44、ArrayList 与 LinkedList 区别?
- 45、Java中的ArrayList的初始容量和容量分配?
- 46、如何使用的 List 集合来保证线程安全?
- 47、IO 和 NIO 的区别?
- 48、在 Java 中要想实现多线程代码有几种手段?
- 49、Thread 类中的 start() 和 run() 方法有什么区别?
- 50、Java 中 notify 和 notifyAll 有什么区别?
- 51、Java 多线程中调用 wait() 和 sleep()方法有什么不同?
- 52、什么是线程安全
- 53、Java中的 volatile 变量是什么?
- 54、线程的状态?
- 55、实现线程同步有三种方式?
- 56、Java中的锁有几种方式?
- 57、Lock的几个实现类?
- 58、线程间通信的几种实现方式?
- 59、synchronized 和 Lock 的区别和应用场景?
- 60、为什么要用线程池?
- 61、如何创建线程池?
- 62、Java中的异常体系?
- 63、throw 和 throws 的区别?
- 64、说出 5 个常见的异常?
Java基础大纲图
1、Java是一种什么语言,JDK,JRE,JVM三者的区别?
Java是一种完全面向对象的编程语言,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,它吸收了c++的优点,去掉了c++中多继承,指针等让人难于理解的概念。java语言采用Unicode编码标准。
JDK(Java Development Kit)是针对 Java 开发员的产品,是整个 Java 的核心,包括了 Java 运行环境 JRE、Java 工具和 Java 基础类库。
Java Runtime Environment(JRE)是运行 JAVA 程序所必须的环境的集合,包含 JVM 标准实现及 Java 核心类库。
JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,是整个 java 实现跨平台的最核心的部分,能够运行以 Java 语言写作的软件程序。
2、Java 1.5之后的三大版本?
- Java SE Java标准版
- Java EE Java企业版
- Java ME Java微型版
3、Java跨平台及其原理?
所谓的跨平台就是Java源码经过一次编译以后,可以在不同的操作系统上运行。
原理:经过编译的 .class 文件运行在Java虚拟机上,并非直接运行在操作系统上,只要安装满足不同操作系统的JVM(JAVA虚拟机)即可。
4、Java 语言的特点?
- 面向对象。Java 是面向对象语言,即满足面向对象的基本特征(封装,继承,多态)
- 跨平台。 JVM实现Java语言的跨平台
- 支持网络编程
- 支持多线程
- 健壮性。Java语言的强类型机制,异常处理机制,GC垃圾自动收集机制
5、什么是字节码,字节码的好处?
- 字节码:Java 经过 Javac 命令产生的 .class 文件就是字节码
- 字节码的好处:
- 在一定程度上解决了解释性语言效率低下的问题
- 不针对特定的机器,保留了解释性语言的可移植性
6、Java 和 C++ 的区别?
Java和C++都是面向对象语言。因此都有面向对象的基本特性封装,继承,多态。它们的区别如下:
- Java不提供指针来直接访问内存,程序内存更加安全
- Java中是单继承,c++中支持多继承
- Java中有内存管理机制,无需程序员手动释放内存
7、Java的三大特性?
- 封装:把方法、变量封装在类中,提高代码的安全性
- 继承:Java中为单继承,提高代码的重用性
- 多态:多态就是同一个类或者接口,使用不同的实例因而执行不同的操作,提高代码的灵活性
8、Java中的基本数据类型和引用数据类型及其区别?
- 8种基本数据类型
说明
所占内存大小(字节)
取值范围
默认值
byte
Java中最小的数据类型
1
− 2 7 {-2^7} −27~ 2 7 {2^7} 27-1
0
short
短整型
2
− 2 15 {-2^{15}} −215~ 2 15 {2^{15}} 215-1
0
int
整型
4
− 2 31 {-2^{31}} −231~ 2 31 {2^{31}} 231-1
0
long
长整型
8
− 2 63 {-2^{63}} −263~ 2 63 {2^{63}} 263-1
0L
float
单精度
4
-3.40E+38 ~ +3.40E+38
0
double
双精度
2
-1.79E+308 ~ +1.79E+308
java基础2150
char
字符型
2
0~65535
null
boolean
布尔型
1
true,false
false
- 引用数据类型
类,接口类型,数组类型,枚举类型,注解类型
- 基本数据类型与引用数据类型的区别
基本数据类型在被创建时,会在栈上分配空间,直接将之存储在栈中。而引用数据类型在被创建时,首先会在栈上分配空间,将其引用存在栈空间中,然后在堆中开辟内存,值存放在堆内存中,栈中的引用指向堆中的地址。
在Java5以前,expr支持 byte,short,int,char 四种数据类型,在Java5以后,又多了枚举enum类型,Java7又增加了string类型,到目前并比支持long类型。
int 是基本数据类型,默认值是0
integer是引用类型,是int 的包装类,默认值是 null
自动拆箱:将包装类型自动转化为对应的基本数据类型
自动装箱:将基本类型自动转化为对应的引用类型
计算2^3效率最高的方法是:2<<(3-1)
四舍五入的原理是在原来的参数上加0.5,然后进行向下取整。
不正确。3.4是双精度类型,赋值给float需要强制类型转换,float f=(float)3.4,可以写成 float f=3.4F。
short s1 = 1; s1 = s1 + 1 不正确。因为 1是int类型,因此 s1+1 也是int类型,在执行 s1=s1+1 时,需要将int类型的s1+1赋值给short类型的s1,大转小可能会有精度损失,无法显示转化。
short s1 = 1; s1 += 1 正确。因为 s1+=1 相当于s1=(short)(s1+1),存在隐含的强制类型转换。
定义:注释是用来解释说明程序的文字。分为:
- 单行注释:// 注释的文字
- 多行注释:/* 注释的文字 */
- 文档注释:/ 注释的文字 /
Java中的访问修饰符有:public,private,protected,以及不写(默认)。

重写:
至少发生在两个类中,并且类与类具有继承或者实现关系,表示子类中的方法具有与父类方法中完全相同的方法名称,返回值,参数。子类中的方法覆盖父类的方法,体现了多态性。
重载:发生在同一个类中,多个方法名称相同,参数类型,个数和顺序不同的方法发生重载现象,与返回值无关。
&:无论左边true还是false,右边也会进行判断。
&&:如果左边为false,有边就不会进行判断,因此&&比&效率高。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。
- 普通的直接引用,this相当于是指向当前对象本身。
- 形参与成员名字重名,用this来区分:
div data-card-loading="true" data-card-editable="false" data-syntax="java">
public Person(String name, int age) {
this.name = name;
this.age = age;
}
ol start="3">
div data-card-loading="true" data-card-editable="false" data-syntax="java">
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name);
this.age = age;
}
}
- 普通的直接引用。
- 调用父类中与子类重名的方法。
- 调用父类的构造函数。
在java中,final关键字可以修饰类,变量和方法。被final修饰后以下特点:
- final修饰类:final修饰的类不能被继承。
- final修饰变量:final修饰的变量是常量,不能改变。
- final修饰方法:final修饰的方法不能被重写。
- break:跳出当前循环
- continue:结束本次循环,进行下次循环
- return:返回
在外面的循环语句前定义一个标号
div data-card-loading="true" data-card-editable="false" data-syntax="java">
ok:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
system.out.println("i="+i+",j="+j);
if(j==5)break ok;
}
}
如果两个对象equals()方法相等则它们的hashCode返回值一定要相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。
两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。
接口中的方法都是抽象的,抽象类中可以有抽象方法,也可以有非抽象方法。
在JDK1.8以后接口中也可以有用defaule关键字修饰的普通方法
接口是一种规范,Java中的接口:interface
静态变量
非静态变量
调用方式
静态变量只能通过 “ 类名.变量名 ” 调用
非静态变量通过实例化对象名调用
共享方式
静态变量是全局变量,被类的所有实例化对象共享
非静态变量是局部变量,不共享
相互访问方式
静态变量无法访问非静态变量
非静态变量可以访问静态变量
值传递:
在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中。
引用传递:
引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
col span="1" width="435.996">
col span="1" width="435.996">
方法
说明
split()
把字符串分割成字符串数组
indexOf()
从指定字符提取索引位置
append()
追加字符或字符串
trim()
去掉字符串两端的空格
replace()
替换
hashCode()
返回字符串的哈希值
subString()
截取字符串
equals()
比较字符串是否相等
length()
获取字符串长度
concat()
将指定字符串连接到此字符串的结尾
//底层用 final 关键字修饰,底层实际在维护 char 类型的字符数组
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/ The value is used for character storage. */
private final char value[];
}
td data-transient-attributes="table-cell-selection" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
修饰的对象
td data-transient-attributes="table-cell-selection" class="table-last-row" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
说明
td data-transient-attributes="table-cell-selection" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
final 修饰类
td data-transient-attributes="table-cell-selection" class="table-last-row" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
表明该类不能被其他类所继承,但要注意:final类中所有的成员方法都会隐式的定义为final方法。
td data-transient-attributes="table-cell-selection" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
final 修饰变量
td data-transient-attributes="table-cell-selection" class="table-last-row" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
final成员变量表示常量,只能被赋值一次,赋值后其值不再改变
td data-transient-attributes="table-cell-selection" class="table-last-column" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
final 修饰方法
td data-transient-attributes="table-cell-selection" class="table-last-column table-last-row" style="min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default; vertical-align: top;">
final 修饰的方法不能被重写
实现类
特征
HashMap
线程不安全的键值对集合,允许 null 值,key 和 value 都可以
HashTable
线程安全的键值对集合,不允许 null 值,key 和 value 都不可以
TreeMap
能够把它保存的记录根据键排序,默认是按升序排序
();
(
);
)
)
br>
(
){
br>
br>}
br>
(
){
br>}
br>
();
br>
.
();
56、Java中的锁有几种方式?
- Synchronized
- Lock
Synchronized的局限性:
- a. 如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能等待。(不能主动释放锁)
- b.当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象如果多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操作。(不分情况,一律锁死)
57、Lock的几个实现类?
- ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。
- ReadWriteLock,顾名思义,是读写锁。它维护了一对相关的锁 ——“读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。他的两个实现类读锁readerLock和写锁writerLock。
58、线程间通信的几种实现方式?
- 使用 volatile 关键字。基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式。
- 使用Object类的wait() 和 notify() 方法。Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。
注意: wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁
59、synchronized 和 Lock 的区别和应用场景?
- Lock 是接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言实现;
- synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁;
- Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用synchronized 时,等待的线程会一直等待下去,不能够响应中断;
- 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
- Lock 可以提高多个线程进行读操作的效率。
- Lock 能完成 Synchronized 所实现的所有功能在性能上来说,如果竞争资源不激烈,Synchronized 要优于 Lock,而当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
60、为什么要用线程池?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数 有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。
从JDK1.5 开始,JavaAPI 提供了 Executor 框架让你可以创建不同的线程池。比如单线程池,每次处理一个 任务;数目固定的线程池或者是缓存线程池。
61、如何创建线程池?
- 线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。
Executors:线程池创建工厂类 - 自己根据创建线程池的需求来 new 对象(使用)
注意:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端如下:
1)FixedThreadPool 和 SingleThreadPool:允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
2)CachedThreadPool 和 ScheduledThreadPool:允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
建议自己通过 new 关键字创建 newThreadPoolExecutor
62、Java中的异常体系?
63、throw 和 throws 的区别?
- throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的 是异常对象。
- throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方 式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
- throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常, 执行 throw 则一定 抛出了某种异常对象。
- 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
64、说出 5 个常见的异常?
- NullpointException:空指针异常 null 值导致
- IOExceptionIO 异常 IO 流常见编译异常
- SQLExceptionSQL 拼写异常,mybatis 中的 sql 拼写异常
- ClassNotFoundException 类找不到异常 一般为 jar 包引入失败或者忘写 spring 注解
- ClassCastException 类型转换异常
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/961.html