共计 5422 个字符,预计需要花费 14 分钟才能阅读完成。
1、面向对象和面向过程的区别
面向过程 :
是剖析解决问题的步骤,而后用函数把这些步骤一步一步地实现,而后在应用的时候一一调
用则可。性能较高,所以单片机、嵌入式开发等个别采纳面向过程开发。
面向对象:是把形成问题的事务分解成各个对象,而建设对象的目标也不是为了实现一个个步骤,而是为了形容某个事物在解决整个问题的过程中所产生的行为。面向对象有封装、继承、多态的个性,所以易保护、易复用、易扩大。能够设计出低耦合的零碎。然而性能上来说,比面向过程要低。
2、一般类和抽象类的区别
- 一般类能够去实例化调用;抽象类不能被实例化
- 一般类不能包含形象办法,能够有一般办法,抽象类能够蕴含形象办法
3、接口和抽象类的区别?
- 实现:抽象类的子类只用 extends 来继承,接口必须应用 implements 来实现接口
- 构造函数:抽象类能够有多个构造函数,接口不能有
- 实现数量:类能够实现多个接口;然而只能继承一个抽象类
- 拜访修饰符:接口中的办法默认应用 public 润饰,抽象类中的办法能够是任意拜访修饰符。
4、JDK 和 JRE 有什么区别?
- JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
- JRE:Java Runtime Environment 的简称,Java 运行环境,提供了 Java 运行所需环境。
JDK 其实蕴含了 JRE、编译器、Java 源码等;JRE(Java 运行环境)蕴含 JVM 和须要运行的程序。只是运行 Java 程序,装置 JRE 就能够。日常开发须要装置 JDK。
5、重载和重写的区别
重写办法的规定:
- 参数列表:必须与被重写办法的参数列表齐全匹配。
- 返回类型:必须与超类中被重写的办法中申明的返回类型或子类型完全相同
- 拜访级别:肯定不能比被重写办法强,能够比被重写办法的弱。
- 非查看异样:重写办法能够抛出任何非查看的异样,无论被重写办法是否申明了该异样。
- 查看异样:重写办法肯定不能抛出新的查看异样,或比被重写办法申明的查看异样更广的查看异样
- 不能重写标记为 final,static 的办法
重载办法的规定:
- 参数列表:被重载的办法必须扭转参数列表。
- 返回类型:能够扭转返回类型。
- 修饰符:能够扭转修饰符
- 异样:能够申明新的或者更宽泛的异样
总结
重载和重写(笼罩)。办法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同体现。重写 Overriding 是父类与子类之间多态性的一种体现,重载 Overloading 是一个类中多态性的一种体现。如果在子类中定义某办法与其父类有雷同的名称和参数,咱们说该办法被重写 (Overriding)。
6、== 和 equals 的区别是什么?
- 根本类型:比拟的是值是否雷同。
- 援用类型:比拟的是援用是否雷同。
代码示例:
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
String d = new String("aaa");
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); // true
System.out.println(c == b); // false
System.out.println(c.equals(b)); // true
下面的代码片段 a 和 b 指向的是同一个援用,所以 == 也是 true,然而 new 每次都会从新开拓堆内存空间,所以 == 后果为 false,而 equals 比拟的始终是值,所以后果都为 true。
“==”的含意:
== 对于根本类型来说是值比拟,对于援用类型来说是比拟的是内存地址(堆内存 地址)。
equals 的含意
equals() 办法用来比拟的是两个对象的内容是否相等。援用类型默认状况下,比拟的是地址值。如果没有对 equals 办法进行重写,则比拟的是援用类型的变量所指向的对象的地址。如果对 equals 办法 equals 办法进行了重写用来比拟指向的对象所存储的内容是否相等(String 类中重写了 equals() 办法用于比拟两个字符串的内容是否相等)。
7、重写 equals()办法时,为什么必须要重写 hashCode 办法?
首先,hashCode()
的作用是 获取哈希码 ,也称为散列码;它实际上是返回一个 int 整数。这个 哈希码的作用 是确定该对象在哈希表中的索引地位。hashCode()
定义在 JDK 的 Object
类中,这就意味着 Java 中的任何类都蕴含有 hashCode()
函数。另外须要留神的是:Object
的 hashcode
办法是本地办法,也就是用 c 语言或 c++ 实现的,该办法通常用来将对象的 内存地址 转换为整数之后返回。
public native int hashCode();
散列表存储的是键值对(key-value),它的特点是:能依据“键”疾速的检索出对应的“值”。这其中就利用到了散列码!(能够疾速找到所须要的对象)
为什么肯定要有 hashCode?
咱们以“HashSet
如何查看反复”为例子来阐明为什么要有 hashCode?
当你把对象退出 HashSet
时,HashSet
会先计算对象的 hashcode 值来判断对象退出的地位,同时也会与其余曾经退出的对象的 hashcode 值作比拟,如果没有相符的 hashcode,HashSet
会假如对象没有反复呈现。然而如果发现有雷同 hashcode 值的对象,这时会调用 equals()
办法来查看 hashcode 相等的对象是否真的雷同。如果两者雷同,HashSet
就不会让其退出操作胜利。如果不同的话,就会从新散列到其余地位。(摘自我的 Java 启蒙书《Head First Java》第二版)。这样咱们就大大减少了 equals 的次数,相应就大大提高了执行速度。
为什么重写 equals
时必须重写 hashCode
办法?
如果两个对象相等,则 hashcode 肯定也是雷同的。两个对象相等, 对两个对象别离调用 equals 办法都返回 true。然而,两个对象有雷同的 hashcode 值,它们也不肯定是相等的。因而,equals 办法被笼罩过,则 hashCode
办法也必须被笼罩。
hashCode()
的默认行为是对堆上的对象产生独特值。如果没有重写hashCode()
,则该 class 的两个对象无论如何都不会相等(即便这两个对象指向雷同的数据)
为什么两个对象有雷同的 hashcode 值,它们也不肯定是相等的?
在这里解释一位小伙伴的问题。以下内容摘自《Head Fisrt Java》。
因为 hashCode()
所应用的杂凑算法兴许刚好会让多个对象传回雷同的杂凑值。越蹩脚的杂凑算法越容易碰撞,但这也与数据值域散布的个性无关(所谓碰撞也就是指的是不同的对象失去雷同的 hashCode
。
咱们刚刚也提到了 HashSet
, 如果 HashSet
在比照的时候,同样的 hashcode 有多个对象,它会应用 equals()
来判断是否真的雷同。也就是说 hashcode
只是用来放大查找老本。
更多对于 hashcode()
和 equals()
的内容能够查看:Java hashCode() 和 equals()的若干问题解答
总结
两个对象 equals 相等,则它们的 hashCode() 必须相等,反之则不肯定。
两个对象 == 相等,则其 hashcode() 肯定相等,反之不肯定成立。
此题起源:https://github.com/Snailclimb…
8、Java 的根底数据类型有哪些?什么是主动拆装箱?String 属于根底的数据类型吗?
Java 根底类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象,String 不属于根底类型。
主动装箱是 Java 编译器在根本数据类型和对应的对象包装类型之前做的一个转化。比方:把 int 转化成 Integer,double 转化成 Double,等等。反之就是主动拆箱。
final, finally, finalize 的区别
- final 用于申明属性, 办法和类, 别离示意属性不可变, 办法不可笼罩, 类不可继承。final 润饰的变量叫常量,常量必须初始化,初始化之后值就不能被批改。
- finally 是异样解决语句构造的一部分,示意总是执行.
- finalize 是 Object 类的一个办法,在垃圾收集器执行的时候会调用被回收对象的此办法,能够笼罩此办法提供垃圾收集时的其余资源回收,例如敞开文件等 JVM 不保障此办法总被调用.
9、String、StringBuffer、StringBuilder 之间有什么区别?
String 和 StringBuffer、StringBuilder 的区别在于 String 申明的是不可变的对象,每次操作都会生成新的 String 对象,而后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 能够在原有对象的根底上进行操作,所以在常常扭转字符串内容的状况下最好不要应用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程平安的,而 StringBuilder 是非线程平安的
,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下举荐应用 StringBuilder,多线程环境下举荐应用 StringBuffer。
10、String str=”i” 与 String str=new String(“i”)一样吗?
不一样,因为内存的调配形式不一样。String str=”i” 的形式,Java 虚构机会将其调配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
11、String 类的罕用办法都有那些?
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():宰割字符串,返回一个宰割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
- equals():字符串比拟。
12、深拷贝和浅拷贝的区别是什么?
- 浅拷贝 :被复制对象的所有变量都含有与原来的对象雷同的值,而所有的对其余对象的援用依然指向
原来的对象,换言之,浅拷贝仅仅复制所思考的对象,而不复制它所援用的对象。 - 深拷贝 :被复制对象的所有变量都含有与原来的对象雷同的值,而那些援用其余对象的变量将指向被
复制过的新对象,而不再是原有的那些被援用的对象,换言之,深拷贝把要复制的对象所援用的对象都
复制了一遍。
13、try catch finally,try 里有 return,finally 还执行么?
执行,并且 finally 的执行早于 try 外面的 return
论断:
- 1)不论有木有出现异常,finally 块中代码都会执行;
- 2)当 try 和 catch 中有 return 时,finally 依然会执行;
- 3)finally 是在 return 前面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保
存起来,管 finally 中的代码怎么样,返回的值都不会扭转,任然是之前保留的值),所以函数返回值是
在 finally 执行前确定的; - 4)finally 中最好不要蕴含 return,否则程序会提前退出,返回值不是 try 或 catch 中保留的返回值
14、Java 中 IO 流分类几种?
- 性能辨别:输出流(input),输入流(output)
- 类型辨别:字节流,字符流
字节流和字符流的区别是:字节流按 8 位传输以字节位单位输入输出数据,字节流按 16 位传输已字符流按 16 位传输以字符为单位输入输出数据。
15、BIO、NIO、AIO 有什么区别?
- BIO:Block IO 同步阻塞式 IO,就是咱们平时应用的传统 IO,它的特点是模式简略使用方便,并发解决能力低。
- NIO:Non IO 同步非阻塞 IO,是传统 IO 的降级,客户端和服务器端通过 Channel(通道)通信,实现了多路复用。
- AIO:Asynchronous IO 是 NIO 的降级,也叫 NIO2,实现了异步非梗塞 IO,异步 IO 的操作基于事件和回调机制。
16、Files 的罕用办法都有哪些?
- Files. exists():检测文件门路是否存在。
- Files. createFile():创立文件。
- Files. createDirectory():创立文件夹。
- Files. delete():删除一个文件或目录。
- Files.deleteIfExists():存在才删除,不存在时不会报错。。
- Files. copy():复制文件。
- Files. move():挪动文件。
- Files. size():查看文件个数。
- Files. read():读取文件。
- Files. write():写入文件。
微信搜寻【山间木匠 】,回复【 面试】即可取得面试系列电子书。
欢送关注公众号 山间木匠, 我是小春哥,从事 Java 后端开发,会一点前端、通过继续输入系列技术文章以文会友,如果本文能为您提供帮忙,欢送大家关注、点赞、分享反对,_咱们下期再见!_