每日面试题

1. JDK 和 JRE 有什么区别?

JDK:Java Develepment Kit,Java开发工具包,提供了Java的开发环境和运行环境。
JRE:Java Runtime Environment,Java运行环境,为Java程序的运行提供所需的环境
JDK包含了JRE

2. == 和 equals 的区别是什么?

==对于基本数据类型比较的是值是否相同,对于引用数据类型比较的是引用的值是否相同
equals是Object类的一个方法,他的底层默认实现其实就是==,只不过一些类重写了该方法,例如String。

3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不对,两个不同的对象可能会有相同的hashCode值,但此时equals为false。
但是equals为true,则两个对象有相同的hashCode

4. final 在 java 中有什么作用?

修饰类:不可被继承
修饰方法:不可重写
修饰变量:变量不可被修改,称为常量

5. java 中的 Math.round(-1.5) 等于多少?

向上取整,-1

6. String 属于基础的数据类型吗?

不属于基本数据类型。基本数据类型有8种,分别是:byte,short,int,long,float,double,boolean,char

7. java 中操作字符串都有哪些类?它们之间有什么区别?

String、StringBuffer、StringBuilder
String与StringBuffer、StringBuilder的区别在于,String是不可变对象,每次修改String的值时都会创建新的对象。StringBuffer、StringBuilder是可变对象,每次都是在原有的基础上进行修改操作。因此当需要频繁修改字符串时,建议使用StringBuffer、StringBuilder。
StringBuffer、StringBuilder的区别在于StringBuffer是线程安全的,StringBulder是线程不安全的。因此在多线程环境下建议使用StringBuffer。同时也因为如此,StringBuffer的效率比StringBuilder的效率要低一些。

8. String str="i"与 String str=new String("i")一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。

9. 如何将字符串反转?

调用StringBuffer、StringBuilder内的reverse方法

10. String 类的常用方法都有那些?

indexOf()、charAr()、trim()、split()、length()

11. 抽象类必须要有抽象方法吗?

抽象类中可以没有抽象方法。

12. 普通类和抽象类有哪些区别?

抽象类不能被实例化、抽象类中可以有抽象方法

13. 抽象类能使用 final 修饰吗?

不能,创建抽象类就是用于被继承的,使用final修饰的话就无法被继承了。

14. 接口和抽象类有什么区别?

实现关键字:接口通过implements实现,抽象类通过extends继承
实现数目:一个类可以实现多个接口,但是只能继承一个父类
构造函数:接口不存在构造函数,抽象类存在构造函数
方法修饰符:接口内方法默认是public修饰,抽象类内方法可以是任意修饰符
main函数:接口内不能写main函数,抽象类中可以写

15. java 中 IO 流分为几种?

从功能上分可以分为:输入输出流
从类型上分为:字节流和字符流
字节流和字符流的区别在于字节流以8位为单位输入输出数据,字符流以16位为单位输入输出数据

16. BIO、NIO、AIO 有什么区别?
  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

  • NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

今日总结

数据类型默认值

  • byte、short、long、int: 0
  • float、double: 0.0
  • char: ' '
  • boolean: false
  • 引用数据类型: null

数组

  • 数组,是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行同一管理。
  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
  • 数组的长度一旦确定,就不能修改
  • 我们可以直接通过下标的方式调用指定位置的元素,速度很快

数组中常见算法

  • 1.数组元素的赋值(杨辉三角、回形数)
  • 2.最大、最小、平均、总和
  • 3.数组的复制、反转、查找
  • 4.数组的排序

衡量排序算法优劣的三个指标

  • 时间复杂度
  • 空间复杂度
  • 稳定性

排序算法的分类

  • 内部排序:整个排序过程不需要借助外部存储器(如磁盘等),所有排序操作都在内存中完成
  • 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的就是多路归并排序。可以认为外部排序是由多次内部排序组成。

十大内部排序算法

  • 选择排序:直接选择排序、堆排序
  • 交换排序:冒泡排序、快速排序
  • 插入排序:直接插入排序、折半插入排序、Shell排序
  • 归并排序
  • 桶式排序
  • 基数排序

算法的五大特征

  • 1.输入:有0个或多个输入数据,这些输入必须有清楚的描述和定义
  • 2.输出:至少有1个或多个输出结果,不可以没有输出结果
  • 3.有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
  • 4.确定性:算法的每一步都有确定的含义,不会出现二义性
  • 5.可行性:算法的每一步都是清楚且可行的,能让用户用纸笔计算而求出答案

各种内部排序方法性能比较

  • 1.从平均时间而言:快速排序最佳。但在最坏的情况下时间性能不如堆排序和归并排序
  • 2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序
  • 3.从稳定性来看:直接插入排序、冒泡排序和归并排序是稳定的;而直接选择排序、快速排序、Shell排序和堆排序是不稳定排序
  • 4.从排序的记录n的大小看,n较小时,宜使用简单排序;而n较大时宜采用改进排序。