Java面试题总结(一)
一、Java基础
1. Java中的基本数据类型各占多少字节?
数据类型分为基本数据类型和引用数据类型
- 基本数据类型:
- 数值型(byte、short、int、long、float、double)
- 字符型(char)
- 布尔型(boolean)
- 引用数据类型:
- 类(class)
字符串(String)
- 数组(Array)
- 接口(interface)
基本类型 | 大小 | 取值范围 | 默认值 |
---|---|---|---|
boolean | 1字节8位 | true/false | false |
byte | 1字节8位有符号整数 | -128~127 | (byte)0 |
short | 2字节16位有符号整数 | -2^15 ~ 2^15-1 | (short)0 |
int | 4字节32有符号整数 | -2^31 ~ 2^31-1 | 0 |
long | 8字节64位有符号整数 | -2^63 ~ 2^63-1 | 0L |
char | 2字节16位Unicode字符 | 0-65535(2^16-1) | \u0000(空,‘’) |
float | 4字节32位浮点数 | 1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38 | 0.0f |
double | 8字节64位浮点数 | 4.9E-324 ~ 1.7E+308,-4.9E-324 ~ -1.7E+308 | 0.0d |
2. String类能被继承吗?为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
String str=“abc”
和String str=new String(“abc”);
产生几个对象?
1. 前者1或0,后者2或1,先看字符串常量池,如果字符串常量池中没有,都在常量池中创建一个,如果有,前者直接引用,后者在堆内存中还需创建一个“abc”实例对象。
2. 对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
3. 为了提升jvm(JAVA虚拟机)性能和减少内存开销,避免字符的重复创建 项目中还是不要使用new String去创建字符串,最好使用String直接赋值。
3. String、StringBuffer、StringBuilder的区别?
String 字符串常量(final修饰,不可被继承),String是常量,当创建之后即不能更改。(可以通过StringBuffer和StringBuilder创建String对象)
- StringBuffer 字符串变量(线程安全):其也是final类别的,不允许被继承,其中的绝大多数方法都进行了同步处理,包括常用的Append方法也做了同步处理(synchronized修饰)。其自jdk1.0起就已经出现。其toString方法会进行对象缓存,以减少元素复制开销。
- StringBuilder 字符串变量(非线程安全):其zijdk1.5起开始出现。与StringBuffer一样都继承和实现了同样的接口和类,方法除了没使用synch修饰以外基本一致,不同之处在于最后toString的时候,会直接返回一个新对象。
4. ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口,有以下的不同点:
1、ArrayList是基于索引的数据接口,它的底层是数组
。它可以以O(1) 时间复杂度对元素进行随机范文。与此对应,LinkedList是以元素列表
的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起
,在这种情况下, 查找某个元素的时间复杂度是O(n)。
2、相对于ArrayList,LinkedList的插入,添加,删除操作速度更快
,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者更新索引。
3、LinkedList比ArrayList更占内存
,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个 指向下一个元素。
5. 讲讲类的实例化顺序?
此题考查的是类加载器实例化时进行的操作步骤(加载->连接->初始化)
父类静态变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造方法、
子类非静态变量(子类实例成员变量)、
子类构造方法。
6. HashMap和HasnTable的区别?
都数据Map接口的类,实现了将唯一键映射到特定的值上。都是双列集合,底层都是哈希算法
HashMap线程不安全,HashMap是数组+链表+红黑树(jdk1.8增加了红黑树部分)实现的,采用哈希表来存储的,HashMap允许键和值为null,效率高。
HashTable线程安全,但是不允许key和value为null,它比HashMap慢,因为它是同步的。
- HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过他们都同时实现了map、Cloneable、Serializable这三个接口。
- Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16.之后每次扩充,容量变为原来的2倍。因为Hashtable侧重点是哈希的结果更加均匀,减少哈希冲突。当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀。HashMap的更侧重于效率,在取模计算时,如果模数时2的幂,那么我们可以直接使用位运算来得到结果,效率要大大高于做触发。
- 计算hash值的方法不同
为了得到元素的位置,首先需要根据元素的key计算出一个hash值,然后再用这个hash值计算得到最终的位置。Hashtable直接使用对象的hashCode,Hashtable在计算元素的位置时需要进行一次除法运算,而除法运算是比较耗时的。HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模运算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。
7. 抽象类和接口的区别?
1、抽象类和接口都不能直接实例化,如果实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。但是jdk1.8之后接口可以通过default关键字做方法实现。
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量就是普通变量
5、抽象类里的抽象方法必须全部被子类实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如果不能全部实现接口的方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abs(){};
7、抽象类里面可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现、所以不能是静态的,也不能是私有的
10、接口可继承接口,并可多继承接口,但类只能单继承
8. Spring和SpringBoot的区别
-
Spring
是一个轻量级的IOC
和AOP
的容器框架,Spring框架为开发Java应用程序提供了全面的基础架构支持。它包含了一些很好的功能,如依赖注入和开箱即用的模块,如:Spring JDBC、Spring MVC、Spring Security、Spring AOP、Spring ORM、Spring Test,这些模块缩短应用程序开发时间,提高了应用开发的效率,例如:在Java Web开发的早期阶段,我们需要编写大量的代码来将记录插入到数据库中。但是通过使用Spring JDBC模块的JDBC Template,我们可以将操作简化为几行代码。 -
Spring Boot
基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的XML配置,为更快,更高效的开发生态系统铺平了道路。
SpringBoot框架中还有两个重要的策略:开箱即用和约定优于配置- 开箱即用,Outofbox,是指在开发过程中,通过Maven项目的pom文件中添加相关依赖包,然后使用对应注解来替代繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。
- 约定优于配置,Convention over configuration,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
-
SpringBoot中,约定大于配置可以从以下两个方面来理解:
1、 开发人员仅需规定应用中不符合约定的部分
2、在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想
总的来说,上面两条都遵循了推荐默认配置的思想。当存在特殊需求的时候,自定配置即可。这样可以大大的减少配置工作,这就是所谓的“约定”。
SpringBoot 中的一些特征:
1、创建独立的Spring应用
2、嵌入式Tomcat、Jetty、Undertow容器(无需部署war文件)
3、提供的starters 简化构建配置
4、尽可能自动配置spring应用
5、提供生产指标,例如指标、健壮检查和外部化配置
6、完全没有代码生成和XML配置要求
9. 算法-找到单链表的倒数第N个元素?
-
遍历法,第一次遍历确定链表总长度,第二次遍历找到倒数第N个元素。需要遍历两次
-
N长度队列,遍历链表每个元素入队,队列满时出队,当链表遍历完毕时,队列中队首元素为倒数第N个元素。需要借助额外队列
-
两个距离N个元素的指针。遍历一次,空间复杂度为O(1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现