25. 在调用子类构造方法之前会先调用父类没有参数 的构造方法,其目的是? 帮助子类做初始化工作。
- == 与 equals(重要) == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同 一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() 享学课堂 : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个 对象时,等价于通过“==”比较这两个对象。
情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来 两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两 个对象相等)。
举个例子:
public class test1 { public static void main(String[] args) { String a = new String("ab");
// a 为一个引用 String b = new String("ab");
// b 为另一个引用,对象的内容一样 String aa = "ab";
// 放在常量池中 String bb = "ab";
// 从常量池中查找 if (aa == bb)
// true System.out.println("aa==bb"); if (a == b)
// false,非同一对象 System.out.println("a==b"); if (a.equals(b))
// true System.out.println("aEQb");
if (42 == 42.0) { // true System.out.println("true"); } } } 说明:
String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是 比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存 在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没 有就在常量池中重新创建一个 String 对象。
- hashCode 与 equals(重要)
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?” hashCode()介绍 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整 数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode() 定义 在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函 数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应 的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象) 为什么要有 hashCode 我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断 对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如 果没有相符的 hashcode,HashSet 会假设对象没有重复出现。
但是如果发现有 相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相 等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。 如果不同的话,就会重新散列到其他位置。(摘自我的 Java 启蒙书《Head first java》第二版)。
这样我们就大大减少了 equals 的次数,相应就大大提高 了执行速度。 hashCode ()与 equals()的相关规定
-
如果两个对象相等,则 hashcode 一定也是相同的
-
两个对象相等,对两个对象分别调用 equals 方法都返回 true
-
两个对象有相同的 hashcode 值,它们也不一定是相等的
-
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
-
hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个 对象指向相同的数据)
-
为什么 Java 中只有值传递 为什么 Java 中只有值传递?
-
简述线程,程序、进程的基本概念。
以及他们之 间关系是什么 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的 过程中可以产生多个线程。
与进程不同的是同类的多个线程共享同一块内存空 间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工 作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。 程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就 是说程序是静态的代码。
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态 的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
简单来说, 一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行 着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文 件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系 统载入内存中。
线程是进程划分成的更小的运行单位。线程和进程最大的不同 在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有 可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执 行一个以上的程序段。
想要了解更多Java基础知识,可以点击评论区链接和小编一起学习java吧,此视频教程为初学者而著,零基础入门篇!给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili