文章目录
- 面试题开始
- 一、Java基础
- 1、JDK和JRE有什么区别?
- 2、==和equals的区别
- 3、装箱拆箱的概念
- 4、final关键字
- 5、String对象中的replace和replaceAll的区别
- 6、Math.round(1.5)的结果
- 7、基本数据类型
- 8、操作字符串类,String、StringBuffer、StringBuilder
- 9、String类的常用方法
- 10、普通类和抽象类的区别
- 11、Java访问修饰符
- 12、Javap的作用
- 13、throw和throws的区别
- 14、内部类
- 15、反射
- 16、java序列化
- 17、对象克隆的应用场景
- 18、深拷贝和浅拷贝
- 19、Java跨平台原理
- 20、Java语言的特性
- 21、Java版本
- 22、注解
- 23、Java的基本数据类型
- 24、i++和++i的区别
- 25、&和&&的区别
- 26、| 和||的区别
- 27、高效进行算数
- 28、Java中基本类型的转换规则
- 29、continue语句的作用
- 30、数组的特点
- 31、类与对象的关系
- 32、面向对象
- 33、方法重载和重写的区别
- 34、this和super关键字的作用
- 35、static关键字
- 36、abstract关键字
- 37、java.lang.Object常用方法
- 38、Java多态
- 39、instanceof关键字
- 40、Java垃圾回收机制
- 41、JDK1.8中的日期与时间API
- 42、包装类
- 43、 java.sql.Date和java.util.Date区别
- 44、java的编译流程
- 45、接口的修饰符
- 46、表示符命名规范
- 47、面向对象的理解
- 48、内存泄漏和溢出
- 二、数据库
面试题开始
本人github:https://github.com/newcalendar
一、Java基础
1、JDK和JRE有什么区别?
JRE是Java程序运行时环境,包含了jvm(虚拟机)、Java运行的核心类库;而JDK是开发工具包,包含了JRE以及Java语言开发的工具类。
2、==和equals的区别
(1)、==是关系运算符,equals()是一种方法,返回结果都为布尔值。==和equals比较的都是地址,作用相同。
(2)、但是在JDK中一般已经将equals()重写了,重写后的equals方法比较的是地址位置的内容
(3)==的作用:基本类型时,比较值是否相同,当比较的是引用类型时,比较的是内存地址值是否相等。
(4)equals比较两个对象相同,则hashcode相同;hashcode相同,equals比较不一定相同;重写equals方法必须重写hashcode,以保证equals比较的相等的两个对象其hashcode值相逢
3、装箱拆箱的概念
1、装箱:将基本数据类型转换为包装类型;拆箱:将包装器类型转换为基本数据类型
2、基本数据类型和包装类型如下:
在这里插入图片描述
3、装箱和拆箱的执行
(1)装箱通过调用包装器类valueOf方法实现,而拆箱是调用包装器类的XXXValue方法实现(XXX代表数据类型)
(2)实例:int的装箱时候自动调用Integer的ValueOf(int)方法;Integer的拆箱时自动调用Interger
//自动装箱
integer i=8;
//自动拆箱
int b=i;
4、final关键字
1、final关键字的作用:被final修饰的类不能被继承;被final修饰的成员变量必须要初始化,赋初始值后不能再重新赋值,对基本类型来说其值不可变,对引用类型来说其引用不可变;final修饰的方法不能被重写。
2、final、finally、finalize()的区别。final表示最终、不可变的;finall是异常处理的一部分,只用于try/catch模块里,表示在finally语句块里最后一定被执行;finalize使用,在垃圾收集器将对象内存清除出去之前做必要的清理工作,在垃圾收集器删除对象之前被调用,特殊情况下可重写此方法。
3、注:finally语句块不一定会执行,直接放回 、抛出异常、系统退出,jvm意外结束
4、final和static:(1)都可以修饰类、方法、成员变量,都不可修饰构造方法
(2)static 可以修饰类的代码块,final不可以;static不可以修饰方法内的局部变量,final可以。
5、return与finally的执行顺序对返回值得影响:finally没有return,finally对return的变量重新赋值无效;try和finally都有return,以finally的return值为准。
5、String对象中的replace和replaceAll的区别
1、replace方法支持字符和字符串的替换
2、基于正则表达式的字符串替换
6、Math.round(1.5)的结果
1、round()方法:朝着无穷大方向返回参数最接近整数的,返回值是int或者long
2、ceil():向上取整返回类型double
3、floor():向下取整,返回类型double
7、基本数据类型
1、八种byte\short\char\int\long\float\double\boolean,String不是基本数据类型,是引用类型
8、操作字符串类,String、StringBuffer、StringBuilder
1、String:final修饰,String类的方法都返回new String,即对String对象的任何改变都不会影响 到原对象,对字符串的修改操作都会生成新的对象。
2、StringBuffer:对字符串的操作的方法都家里synchronized,保证了线程安全
3、StringBuilder不能保证线程安全
9、String类的常用方法
- equals字符串是否相同
- equalsnoreCase忽略大小写后字符串是否相同
- compareTo根据字符串中每个字符的Unicode编码进行比较
- indexOf目标字符或者字符串在源字符串中位置下标
- lastIndexOf目标字符或字符串在源字符串中最后一次出现的位置下标
- valueOf其他类型转字符串
- charAt获取指定下标位置字符
- isEmpty字符串长度是否为0
- length字符串长度
10、普通类和抽象类的区别
1、抽象类不能被实例化
2、抽象类可以有抽象方法,抽象方法只需要声明不需要实现
3、抽象类不能被final修饰、private修饰、不能声明为static、含有抽象方法的类必须声明为抽象类
4、抽象类的子类必须实现抽象类中所有抽象方法,否则此子类野味抽象类
5、抽象类不必须有抽象方法
6、在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
11、Java访问修饰符
12、Javap的作用
Javap是Java class文件分解器,可以反编译,也可以查看Java编译器的字节码
13、throw和throws的区别
1、throw表示方法内抛出某种异常(只能一个);用于开发人员自行产生并抛出异常;位于方法体内,可以作为单独语句使用;执行到throw语句后面的语句块不再执行
2、throws可能抛出多个异常,用于声明在该方法内抛出异常;必须跟在方法参数列表后,不能单独使用;需由方法调用者进行异常处理
14、内部类
1、概念:在Java内部的Java类
2、分类:成员内部类、方法内部类、匿名内部类(继承式、接口式、参数式、)、静态嵌套类
3、作用:内部类提供了某种进入其继承或实现的接口;与外部类无关;提供Java多继承的解决方案
15、反射
1、概述:Java反射机制是在运行状态中,对任意类都能获取该类的所有方法和属性,对任意对象都能调用它的任意一个方法和属性,这种动态获取信息以及调用对象的方法的功能成为反射机制。想要解剖一个类必须先获取该类的字节码对象。而解剖使用的就是Class类中的方法,所以需先获取每个字节码文件对应的Class类型对象。总之,反射就是把Java类中的各种成分映射成一个个的Java对象。
2、通过反射我们可以实现动态装配,降低代码耦合度、动态代理等。但是反射过度使用会严重消耗系统资源
(1)动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。Java中实现动态的方式有JDK动态代理和Java类库CGlib、Spring AOP模块,应用场景有:统计每个api的请求耗时,统一的日志输出,效验被调用的api是否已经登录和权限鉴定。SPring的AOP功能模块就是采用动态代理的机制来实现切面编程
16、java序列化
1、概述序列化就是将Java对象转换成字节流的过程,反序列化是将字节流转换成Java对象的过程
2、作用:永久保存数据到文件或者数据库中、Java对象需要在网络传输、进程间传递对象时将要把Java对象序列化
3、Java序列化的主要实现是类实现接口Serializable接口,其中serialversionUID是序列化版本控制;Externalizable也可实现序列化,继承自Serializable
4、静态变量不会被序列化( static,transient);当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。;当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
17、对象克隆的应用场景
1、方法需要return引用类型,但又不希望自己持有引用类型的对象被修改
2、程序之间方法的调用时参数的传递
18、深拷贝和浅拷贝
1、基本数据类型没有深拷贝和浅拷贝的分别,直接赋值即可。
2、一般引用类型或者成为地址类型,浅拷贝是值拷贝的值不深,值复制了引用类型的地址,而深拷贝是复制了相应的值即会拷贝堆内存中的对象。当操作是浅拷贝,拷贝的是该对象的地址,当值发生改变时另一个值也会发生改变,因为拷贝的是地址,指向的是同一个内存地址的值。而深拷贝是复制了该栈中变量和堆内存对象。
3、实现对象克隆和深拷贝可以实现Cloneable接口,重写clone()方法
19、Java跨平台原理
这与Java语言的开发原理有关,每个平台都有相应的Java虚拟机,,Java语言先将源文件.java文件编译成字节码文件.class文件,再见.class文件通过jvmjava虚拟机来解释成机器码进行运行。,.class文件面向jvm与操作系统无关。本质上Java的跨平台性依赖不同系统的java虚拟机
20、Java语言的特性
1、健壮性
2、可移植性
3、安全性:
(1)使用引用代替了指针,避免了数组越界问题
(2)有异常处理机制,throw、throws、try\catch、finally
(3)强制类型转换需要符合一定的规则
(4)字节码传输使用了加密
(5)JVM有垃圾回收机制
4、多线程
5、面向对象
6、跨平台
7、分布式
8、简易
9、高性能
21、Java版本
JavaSE标准版
JavaEE企业版增加web相关类
JavaME微型版针对嵌入式
22、注解
(1)单行注解//
(2)多行注解/* 注解 /
(3)文档注解
/**
- 文档注解
- 时间
**/
23、Java的基本数据类型
byte1字节8位
short2字节16位
int4字节32位
long8字节64位
float4字节32位
double8字节64位
Boolean,逻辑理解占1位
char2字节16位
24、i++和++i的区别
i++是先运算后加1
++i是先加1后运算
25、&和&&的区别
&为逻辑与,表达式两把都会进行运算
&&短路与左边为false时,右边不进行计算
26、| 和||的区别
| 为逻辑或,两边的表达式都会进行运算
&、|既是位运算符又是逻辑运算符
注:
&、|、^的运算规则:
0&0=0;0&1=0;1&0=0;1&1=1
即:两个同时为1,结果为1,否则为0
例如:3&5
十进制3转为二进制的3:0000 0011
十进制5转为二进制的5:0000 0101
------------------------结果:0000 0001 ->转为十进制:1
即:3&5 = 1
二:或运算(|)
运算规则:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象,一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111,因此,3|5=7。
三:异或运算符(^)
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个位为“异”(值不同),则该位结果为1,否则为0。
例如:3^5 = 0000 0011 | 0000 0101 =0000 0110,因此,3^5 = 6
此处的位运算符原文链接:
27、高效进行算数
2X8用位运算符即2<<3,相当于2的n次方
28、Java中基本类型的转换规则
(1)byte、short、int、long、float、double
(2)char、int、long、float、double
自动转换:运算过程中,低级可以向高级做自动转换
强制转换,高级转低级类型要强制转换并会丢失精度
29、continue语句的作用
(1)结束本次循环,循环后续的语句不执行
(2)继续进行循环条件的判断,进行下一轮循环体执行
30、数组的特点
1、创建时在内存中申请一块连续的空间
2、数组下标从零开始
3、数组的长度类型在定义后固定,改变只能重新申明一个
4、每个数组元素都有默认值,基本数据类型的默认值为0、0.0、false
31、类与对象的关系
类时对象的抽象,对象是类的具体实例
32、面向对象
面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。相对于面向过程来说,面向对象更抽象、更有概括性
33、方法重载和重写的区别
1、方法重载是一个类中允许方法名相同,参数类型和个数不同
2、方法重写是在子类中将父类的成员方法的名称保留,重新编写成员方法的实现内容,更改方法的访问权限,修改返回值类型。
3、区别:
(1)作用范围不同,重写的作用范围是父类和子类之间;
(2)重载是发生在一个类里;重载的参数必须不同,重写的话不能修改
(3)返回类型上,重写不可修改,重载可以修改
(4)抛出的异常,重载可以修改,重写不能修改新的异常或者更大的异常
(5)访问权限,重载可修改,重写不能修改更小的权限
34、this和super关键字的作用
1、this:
(1)对象内部指代自身的引用
(2)解决成员变量和局部变量同名问题
(3)可以调用成员变量
(4)静态方法中不能存在this关键字
2、super:
(1)代表当前对象的直接父类对象的引用
(2)可以调用父类的非private成员变量和方法
(3)super();可以调用父类的构造方法,只限构造方法中使用
35、static关键字
1、static可以修饰变量、方法、代码块、内部类
2、static修饰的变量只能是成员变量
36、abstract关键字
1、修饰的类时抽象类,需要被继承
2、修饰的方法是抽象方法,需要子类被重写
37、java.lang.Object常用方法
1、getClass()获取类结构信息
2、hashcode获取哈希码
3、equals(Object)比较对象地址是否相等,子类可以重写该方法
4、clone()throws CloneNotSupportedException用于对象克隆
5、toString()把对象转换成字符串
38、Java多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作
1、实现多态的三个条件
(1)继承的存在。继承是多态的基础
(2)子类重写父类的方法,JVM会调用子类重写的方法
(3)父类引用变量指向子类对象
2、 多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
39、instanceof关键字
instanceof运算符用来在运行时判断对象是否指定类及其父类的一个实例
40、Java垃圾回收机制
Java垃圾回收机制(GC),Java语言不需要开发者回收内存,由JVM在后台自动回收不在使用的内存
1、回收JVM堆内存里的空间,不负责回收栈内存数据
2、无法处理某些操作系统资源的释放,列如:数据库连接、输入输出流,Socket连接。
3、垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行
41、JDK1.8中的日期与时间API
1、特点:
(1)区分适合人阅读和适合机器计算的时间和日期类
(2)可并发解析与格式化日期与对象
(3)支持设置不同的时区和历法
2、常用API
1、获取当前日期:LocalDate.now()
2、创建日期:LocalDate date=LocalDate.of(2020,1,22)
3、获取年份:date.getYear()
4、获取月份:date.getmonth().getValue()
5、获取日:date.getDayOfMonth
6、获取周期:date.getDayofWeek()
42、包装类
java的基本类型对应有包装类
1、包装类的作用:
(1)基本类型数据不被泛型、集合支持
(2)符合面向对象思想
(3)包装类提供了很多方法,如integer类的toHexString(int i)
2、语法
//包装类转换Wie基本类型
包装类.xxxValue
//基本类型转换包装类
new 包装类(基本类型)
43、 java.sql.Date和java.util.Date区别
java.sql.Date是java.util.Date的子类
44、java的编译流程
java源码代码编译后为.class文件,通过JVM翻译成机器码来执行
45、接口的修饰符
接口默认的修饰符为abstract,访问权限符只能是public和default
46、表示符命名规范
1、可以包含字母、数字、下划线、$
2、不能以数字开头
3、不能为java关键字
47、面向对象的理解
对Java来说一切皆为对象
对象具有属性和行为、具有变化的状态,具有唯一性
特性:封装、继承、多态
48、内存泄漏和溢出
1、内存溢出:指的是程序在申请内存时,没有足够的内存空间供其使用
2、内存泄漏:指的是程序在申请内存后,无法释放已申请到的内存空间,内存泄漏堆积导致内存占光
二、数据库
数据库看这里:数据库相关知识