Java面试题总结(一)

一、Java基础

1. Java中的基本数据类型各占多少字节?


数据类型分为基本数据类型引用数据类型

  • 基本数据类型:
    • 数值型(byte、short、int、long、float、double)
    • 字符型(char)
    • 布尔型(boolean)
  • 引用数据类型:
    • 类(class)
    • 字符串(String)
    • 数组(Array)
    • 接口(interface)
基本类型大小取值范围默认值
boolean1字节8位true/falsefalse
byte1字节8位有符号整数-128~127(byte)0
short2字节16位有符号整数-2^15 ~ 2^15-1(short)0
int4字节32有符号整数-2^31 ~ 2^31-10
long8字节64位有符号整数-2^63 ~ 2^63-10L
char2字节16位Unicode字符0-65535(2^16-1)\u0000(空,‘’)
float4字节32位浮点数1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+380.0f
double8字节64位浮点数4.9E-324 ~ 1.7E+308,-4.9E-324 ~ -1.7E+3080.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是一个轻量级的 IOCAOP 的容器框架,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个元素?

  1. 遍历法,第一次遍历确定链表总长度,第二次遍历找到倒数第N个元素。需要遍历两次

  2. N长度队列,遍历链表每个元素入队,队列满时出队,当链表遍历完毕时,队列中队首元素为倒数第N个元素。需要借助额外队列

  3. 两个距离N个元素的指针。遍历一次,空间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA开发区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值