java基础面试题
什么是泛型?
- 泛型是java语言的一个特性,类,接口,方法在定义的时候指定参 数类型。
- 泛型作用是编译时候检查类型安全,避免运行时发生类型转换错误。
- 泛型擦除是泛型保留在编译时期,运行时期不会保留。
- 泛型多应用在集合,数组。
- 泛型通配符<?>,除了这个还要泛型上限通配符,泛型下限通配符。
1 | public class Box<T> { |
通配符实例
1 | public static void printList(List<?> list) { |
什么是反射?
- 反射是程序在运行时候获取类的属性和方法
- 反射作用是动态获取类的信息,动态调用对象的属性和方法,反射缺点是破坏封装。
- 反射创建对象有3种方式,类名,路径,对象,举例:类名.class,Class.forName(类路径),对象实例.getClass()
- 正射是在运行前就有了对象,反射是运行时动态创建对象。new创建对象是正射,反射比正射复杂。
- 放射应用场景有注解,切面,spring
1 | public class TestReflection { |
异常是什么?异常处理方式有哪些?
- 异常有error和Exception,它们都继承throwable,error是很严重的,系统级别的,比如栈溢出。exception是可以被处理的,异常处理方式有try catch和抛出throws
- exception分为编译时异常和运行时异常,编译异常必须显示处理,
- 编译异常有:类找不到,文件找不到,运行异常有空指针,索引越界,
- throw和throws区别是throw是人为new出来,出现在方法体,后面是new出来异常对象,throws是出现异常程序主动抛出异常,出现在方法名称后面
- try,catch,finally,try里面是可能发生异常代码,catch是出现异常执行得代码,finally是一点会执行得代码
==和equals区别?
- ==如果是基本数据类型,那么比较数值,如果是对象,那么比较对象地址
- equals是用于对象之间比较,不能比较基本数据类型,比较的是对象地址
- 提示:包装类型的String和Integer因为重写了equals和hashcode方法,所以比较内容是否相等,不是地址
stream流是什么?
stream流被称为流式编程,是一种数据处理方式,高效处理集合对象。java8新特性
创建流,中间操作处理流,收集操作收集流
1.创建流,stream()
1 | List<String> list = new ArrayList<>(); |
2.操作流有很多,过滤filter(),映射map(),匹配anyMatch()
filter()
方法接收的是一个 Predicate(Java 8 新增的一个函数式接口,接受一个输入参数返回一个布尔值结果)类型的参数,因此,我们可以直接将一个 Lambda 表达式传递给该方法,比如说 element -> element.contains("王")
就是筛选出带有“王”的字符串。
1 | public class FilterStreamDemo { |
map()
方法接收的是一个 Function(Java 8 新增的一个函数式接口,接受一个输入参数 T,返回一个结果 R)类型的参数,此时参数 为 String 类的 length 方法,也就是把 Stream<String>
的流转成一个 Stream<Integer>
的流。
1 | public class MapStreamDemo { |
anyMatch()
,只要有一个元素匹配传入的条件,就返回 true。allMatch()
,只有有一个元素不匹配传入的条件,就返回 false;如果全部匹配,则返回 true。noneMatch()
,只要有一个元素匹配传入的条件,就返回 false;如果全部不匹配,则返回 true。
1 | public class MatchStreamDemo { |
3.收集流,collect()
既然可以把集合或者数组转成流,那么也应该有对应的方法,将流转换回去——collect()
方法就满足了这种需求。
1 | public class CollectStreamDemo { |
通过 stream()
方法创建集合的流后,再通过 map(String:length)
将其映射为字符串长度的一个新流,最后通过 collect()
方法将其转换成新的集合。
Collectors 是一个收集器的工具类,内置了一系列收集器实现,比如说 toList()
方法将元素收集到一个新的 java.util.List
中;比如说 toCollection()
方法将元素收集到一个新的 java.util.ArrayList
中;比如说 joining()
方法将元素收集到一个可以用分隔符指定的字符串中。
1 | [周杰伦, 王力宏, 陶喆, 林俊杰] |
序列化和反序列化是什么?
- 序列化是将对象转化为可以存储或者传输的格式,反序列号是格式转回,java里面序列化是java对象转换为字节流,反序列化是字节流转换为java对象
- jdk自带的序列化器serializable接口不安全,serialVersionUID是反序列化时检查和类的序列化uid是不是一样
- 序列化作用:网络传输,远程调用,持久化存储,java对象转redis,文件,网络都要序列化
1 | import java.io.Serializable; |
抽象类和接口区别是什么?
抽象类是类,有构造方法,接口没有构造方法,
抽象类变量任意,接口变量默认是常量,必须赋值,
抽象类是单继承,接口是多继承
一个类只能继承一个抽象类,一个类可以实现多个接口,
抽象类是自下而上,先有基类再有共同父类,接口是自上而下,基于某些行为定义的接口,
方法重载和重写区别是什么?
方法重载是同一个类中,方法名称一样,参数不一样,方法重写是子类继承父类,重写父类的方法,实现多态,重写子类的方法参数和返回值要和父类一样,子类访问权限不能比父亲低,异常捕获不能比父亲高
什么是内部类,有什么作用?
内部类是再一个类内部定义的类,分为静态内部类,成员内部类,匿名内部类
作用是封装,简化代码
jdk8有哪些新特性?
lambda表达式,stream流,时间类,接口默认方法,optional
基本类型和包装类区别?
基本数据类型:byte(1)char(2)short(2)int(4)float(4)double(8)long(8)boolean(1),包装类型:Integer,Long,Float,Double,Character,Byte,Boolean,Short,内存占用不同,比较方式不同,基本数据类型==比较数值,包装类型==比较地址,equals比较数值,默认值不同,基本类型默认0,包装类型默认null
深拷贝和浅拷贝有什么区别?
深拷贝不仅复制对象内容,还好复制对象引用,完全独立,浅拷贝复制对象引用,修改对象会影响原来的对象,对于基本数据类型两者都会完全复制
Java的io流是什么?
io流是输入输出流,分为字节流和字符流,字节流包括InputStream及其子类,OutputStream及其子类,字符流包括Reader及其子类,Writer及其子类
Object有哪些方法?
equals(),hashcode(),toString(),getClass(),notify(),wait(),clone(),finalize()
hashcode()是什么?
hashcode是Object对象的一个方法,用于返回对象的哈希值,也就是索引,有什么用呢?举例,hashset是不允许重复,hashset首先判断存入值的hashcode是否和集合里面的某个元素哈希值一样,如果一样,再判断值是否一样,如果值也一样,就报错,hashcode相等两个对象不一定相等,hashcode相等的两个对象,值也相等,那就相等,hashcode不相等的两个对象,一定不相等
string和stringBuild和stringBuffer区别?
string是不可变的,stringBuild是可变但是线程不安全,stringBuffer是可变的,线程安全,因为加了同步锁。
bigDecimal有哪些方法?
bigDecimal是一个对象,用于处理浮点数精度丢失问题,a.compareTo(b)相等为0,不等为1,setScale()
java和c语言的区别?
都是面向对象编程,封装,继承,多态,java的类是单继承,c语言是多继承,java有内存管理机制,不用手动释放内存
++在前和++在后区别?
单独运算没有区别,参与运算,++在前会加1,在后面不变,也就是后加
先自增再赋值,先赋值再自增。
静态方法和普通方法区别?
所属内容不同,静态方法属于类,实例方法属于对象,调用方式不同,静态方法类名调用,实例方法对象名调用,访问权限不同,静态方法访问静态变量,实例方法访问成员变量
Java时间类?
早期util包下的date,随后有了calendar包,其次是time包的localDateTime年月日时分秒,当时间LocalDate.now(),指定时间,LocalDate.of(2024,11)
将对象转换为二进制流怎么实现?
用序列化方式实现



序列化与反序列化自己实现?
我会考虑用fastjson框架,因为自带的虚列化不好用,有安全问题,而且序列化的流太大。
对象从一个JVM转移到另一个JVM?
- 序列化:ObjectInputStream和ObjectOutputStream
- 消息队列:Kafka,RabbitMQ
- Rpc远程调用:
- 数据:mysql,redis
听说过stream的并行API?
将一个stream流转化为多个小一点的stream流,进行多线程操作,最后再合并计算结果。
注解原理及作用域?
内部基于动态代理
- 注解用于描述类
- 注解用于描述方法
- 注解用于描述字段
JAVA创建对象的方式?
new创建对象

反射

序列化与反序列化

克隆

new的对象什么时候被回收?
当对象没有被引用的时候,就被回收,垃圾回收期不定期检查哪些对象没有被引用,然后回收
深拷贝的3种实现方式
- 序列化
- 克隆
- 手动递归复制



父子类都有静态代码块,new子类会发生什么?
执行顺序是这样的,
先执行父类的静态代码块,
再执行子类静态代码块,
执行父类的构造函数,
执行子类的构造函数
接口可以有构造函数吗?
不能
抽象类可以实例化吗?
不能
接口可以用哪些方法?
抽象,默认(有实现),静态,私有




抽象类能加final吗?
不能
抽象类和普通类的区别?
抽象类不能实例化,普通类可以实例化
普通类的方法要有方法体,抽象类的方法可以有方法体,可以没有方法体。
哪些地方看出是多态?
方法重载,方法重写,接口与类,类向上向下转型
说一下integer的缓存?
范围-128-127,当静态缓存池数值在这个范围内会复用
integer与int的区别
- Int是基本数据类型,integer是引用数据类型必须实例化才能使用。
- integer是int的包装类,有自动拆箱装箱功能。
- integer如果没有赋值就操作,会发生空指针异常
java为什么要integer?
泛型需要,集合需要,自动装箱拆箱需要
自动装箱的弊端?
循环的时候会创建多个对象,造成浪费
装箱和拆箱是什么?
基本数据类型与包装类型的转换吗,装箱的出现是赋值和方法调用。
为什么用bigdecimal?
doubel数计算会出现精度度丢失,bigdecimal不会精度丢失


数据转化会出现什么问题?
- 数据丢失,大范围的数转为小范围的数
- 数据溢出,小范围的数转为大范围的数
- 精度丢失,浮点数类型转换
数据类型转换方式有哪些?
- 自动类型转换(隐式转换)
- 强制类型转换(显示转换)
- 数字与字符串之间的转换
Long和int可以互转吗?
可以的,但是会出现数据丢失和数据溢出
JAVA与python的区别?
JAVA是编译与解释并存的语言
Python是解释性语言,程序边执行边解释。
jvm jdk jre的关系?
JVM是JAVA虚拟机,执行已经编译好的class文件,
Jdk是JAVA工具包,例如jdk 8 jdk 17 jdk 21,包括开发,编译,调试
jre里面包括了JVM,还包括一些库,util,date,io
JAVA语言的特点?
平台无关性,面向对象,内存管理机制,多线程
逻辑与与短路与的区别?
- 共同点两边都为true,结果为true
- 短路与,左边为false,右边不参与运算
Switch能否用在byte/string/long上面?
long不可以,其他可以
break,continue,return区别?
- break跳出整个循环,
- continue跳出当前循环
- return返回结果
多态的前置条件?
- 子类继承父类
- 类重写父类方法
- 父类引用指向子类对象
访问修饰符有哪些,以及作用域?
Private,Default ,Protected,public
- Private是类内可以看见
- Default是包
- Protected是包和子类
- Public是不同包
this关键字的作用?
- this指向当前对象本身
- 类里面的方法形参与成员变量重命名,this指向成员变量,
- this引用指向本类构造方法
final关键字有什么作用?
- 修饰类不能被继承,
- 修饰方法不能被重写,
- 修饰变量不能被改变
java是值传递还是引用传递?
值传递
了解native吗?
加载外部语言的一个关键字
String str=“abc”和String str=new “abc”区别?
1 | String s1 = "zouwen"; |
String str=“abc”会直接把常量值有的值赋值给新变量。
String str=new “abc”会在堆里面创建地址,如果常量池里面有值不会创建值,如果没有会创建值。
String怎么转成Integer?
调用方法:Integer.parseInt(String s)或者Integer.valueOf(String s)
Optional了解吗?
Optional
是用于防范NullPointerException
。
1 | Optional<String> optional = Optional.of("bam"); |