现在新技术迭代非常快,我们一方面要学习掌握更多的新技术,同时我们需要不断的巩固已学的知识,一点点的知识积累终会变成质的飞跃。现在我就想来总结一下java一些常用的面试题。
原文:https://blog.csdn.net/sufu1065/article/details/88051083
参考文章
一.java基础
1.JDK和JRE有什么区别?
答: JDK : JDK是Java Development Kit的缩写,JDK 是java的开发工具包,主要面向开发人员,JDK包含JRE,安装JDK的同 时会安装JRE。
JRE: JRE是Java Runtime Environment的缩写,是java程序运行环境,主要面向java程序使用者,JRE是可以在其上运行、测试和传输应用程序的Java平台。它包括Java虚拟机(jvm)、Java核心类库和支持文件。它不包含开发工 具 (JDK)–编译器、调试器和其它工具。
JVM: JVM是java的虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
详细解释:https://blog.csdn.net/chen_006/article/details/88656268
2.== 和equals()有什么区别?
答: == : 1.如果用来判断基本数据类型(也称原始数据类型)(byte,short,char,int,long,float,double,boolean)。他们之间的比较,应用双等号(==),比较的是他们的值。
2.如果用来判断引用数据类型,当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
equals() : 如果用来判断引用类类型,默认情况下比较的是地址值,也可以用来字符串是否相等,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同。
详细解释:https://www.cnblogs.com/qianguyihao/p/3929585.html
https://www.cnblogs.com/zhxhdean/archive/2011/03/26/1996468.html
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
答:不对,两个对象的 hashCode()相同,equals()不一定 true。
详细举例解释:https://blog.csdn.net/qq_35771266/article/details/91345052
4.final 在 Java 中有什么作用?
答:final关键字的用法,可以修饰类,变量,方法,表示变量不可修改,类不可以继承,方法不可覆盖。
修饰类: 当一个类被final修饰的时候,表示该类为最终类,不可被继承,比如常用的String类就是最终类。
修饰方法:当一个方法被final修饰的时候,表示该方法为最终方法,这个方法不可被子类重写,但是可被子类继承。
修饰变量: 如果该变量是基本数据类型,说明该变量为一个常量,值不可修改。 如果变量为引用数据类型,比如对象、数 组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
详细解释:https://www.cnblogs.com/chhyan-dream/p/10685878.html
https://www.cnblogs.com/tanshaoshenghao/p/10908771.html
5.Java 中的 Math.round(-1.5) 等于多少?
答: Math.round(-1.5)的返回值是-1。四舍五入的原理是在参数上加0.5然后做向下取整
6.String 属于基础的数据类型吗?
答:不属于。这里只要考察Java的基本数据类型有哪些。
Java 8种基本数据类型都有: byte char int double short long boolean float
7..java 中操作字符串都有哪些类?它们之间有什么区别?
答:Java操作字符串的类我知道的有三个,String StringBuffer StringBuilder。这三种都是通过char[]保存的字符串,
String :String修饰的是不可变的字符串,对String修饰的变量修改时相当于重新创建一个对象。
StringBuffer: 常用来操作一个可变的字符串,拼接字符串的方法是append(), StringBuffer中的方法大多是用synchronized 关键字修饰,因而是线程安全的,更加适用于多线程的情况下。
StringBuilder: 常用来操作一个可变的字符串,拼接字符串的方法是append(),StringBuffer中的方法没有用synchronized修 饰,因为是线程不安全的,效率更高,更加适用于单线程的情况下。
8.String str="i"与 String str=new String(“i”)一样吗?
答: 不一样。
String str="i" :是指将i在内存的地址指向str这个变量,如果此时有一个变量str2 的值为i 此时str 和str2共用的是一块内 存。
String str=new String("i") : 则是将new String("i");的对象地址赋给str2,需要注意的是这句话是新创建了一个对象。如果此 时 String str4= new String("i");那么相当于又创建了一个新的对象,然后将对象的地址值赋给str4,虽然str2的 值和str4的值是相同的,但是他们依然不是同一个对象了。
9.如何将字符串反转?
答: 可以使用StringBuffer StringBuilder 的reverse方法,还可以自己实现。
详细解释: 举个例子,https://blog.csdn.net/meism5/article/details/89329699
10.String 类的常用方法都有那些?
答: equals() spilt() indexOf () charAt() length() replace() trim() getBytes() toLowerCase() toUpperCase() substring()
- equals() 主要用来判断俩个字符串是否相等
- spilt() 主要是对字符串进行切割,返回字符串数组
- indexOf 主要是用来返回指定字符串的索引
- charAt() 根据指定字符得索引
- length() 主要是返回字符串的长度
- replace() 主要是用来字符串的替换
- trim() 去除字符串俩端的空白
- getBytes() 返回字符串的byte类型数组
- toLowerCase() 字符串转小写
- toUpperCase 字符串转大写
- substring 切割字符串
11.抽象类必须要有抽象方法吗?
答:不必须。
通常情况下我们使用abstract去修饰一个抽象类。
抽象类的总结:
-
1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
抽象类需要注意的点:
- 1.如果一个类包含抽象方法,那么该类必须是抽象类。
- 2.任何子类必须重写父类的抽象方法,或者声明自身为抽象类
- 3.抽象类中可以不定义抽象方法,抽象方法目的仅仅为了不让该类创建对象。
- 4.抽象关键字abstract与 final , private , static 这三个关键字不共存。
12.普通类和抽象类有哪些区别?
答:
- 抽象类不能被实例化
- 抽象类可以有抽象方法,抽象方法只需申明,无需实现
- 含有抽象方法的类必须申明为抽象类
- 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
- 抽象方法不能被声明为静态
- 抽象方法不能用private修饰
- 抽象方法不能用final修饰
13.抽象类能使用 final 修饰吗?
答:不能。
抽象类可被继承,而被final修饰的话,说明该类不可修改,不可继承。 这里的读者还可自行去看一下final关键字的用法。
14.接口和抽象类有什么区别?
抽象类和接口的区别:
接口:1.接口使用interface修饰 2.接口不能实例化 3.Java 支持单继承,即只能继承一个类,但是可以实现多个接口。
4.接口中方法是抽象方法,不能实现
抽象类:1. 抽象类使用abstract修饰 2.接口中包含抽象方法和非抽象方法 3.抽象类不可以实例化。 4. 有抽象方法的类 一 定是抽象类,抽象方法中没有具体实现。 5.如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类 可以不必是抽象类,否则就是抽象类。
15.java 中 IO 流分为几种?
答:根据流的流向分为输入流和输出流。 根据操作单元可以划分为字节流和字符流。根据流的角色可以分为节点流和处理流。
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
按照操作方式可以分为:
详细解释:https://blog.csdn.net/weixin_43643277/article/details/96282707
16.BIO、NIO、AIO 有什么区别?
答:IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
BIO: 在jdk1.4出现之前,我们建立网络连接一般使用BIO,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket 来对服务端进行通信。我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程。BIO是一个连接一个线程。
BIO适用于适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前 的唯一选择,但程序直观简单易理解。
NIO: NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题。NIO则是使用单线程或者只使用少量 的多线程,每个连接共用一个线程。NIO是一个请求一个线程。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂, JDK1.4开始支持
AIO : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去 启动线程进行处理,
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复 杂,JDK7开始支持。
详细地址: https://blog.csdn.net/skiof007/article/details/52873421
17.Files的常用方法都有哪些?
- Files.exists() 检测文件路径是否存在
- Files.createFile()创建文件
- Files.createDirectory()创建文件夹
- Files.delete() 删除文件或者目录
- Files.copy() 复制文件
- Files.move() 移动文件
- Files.size()查看文件个数
- Files.read() 读取文件
- Files.write()写入文件
后面慢慢补充。。