IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java常见面试重点知识 ing...... -> 正文阅读

[Java知识库]Java常见面试重点知识 ing......

java基础阶段01

1.JDK 和 JRE 和 JVM的区别和联系

JVM(Java Virtual Machine),就是 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。jvm 是 Java 能够跨平台的核心。

JRE(Java Runtime Environment),就是Java 运行时环境。主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。

JDK(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。

三者的关系是:一层层的嵌套关系,JDK>JRE>JVM

2.== 和 equals 的区别

==:

  • 基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
  • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

注意:对于引用类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

equals:

???? JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是这样写的:


public boolean equals(Object obj) {
    return (this == obj);
    }

?????? 这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。
?????? 所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

总结:

?== 的作用:
  基本类型:比较的就是值是否相同。
  引用类型:比较的就是地址值是否相同。
equals 的作用:
  引用类型:默认情况下,比较的是地址值。
注:不过,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同。

面试题:请解释字符串比较之中“==”和equals()的区别?

  • ?==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较。
  • ?equals():比较的是两个字符串的内容,属于内容比较。

3.hashCode 和 equals 的区别和联系

hashcode是什么?

??? hash和hash表分别是什么?

??? hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值,这个时候,我们就需要知道另一个东西,hash表,通过hash算法得到的hash值就在这张hash表中,也就是说,hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值。

?? hashcode表示什么?

?? hashcode就是通过hash函数得来的,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应的位置。

?? 对象的hashcode怎么得来的呢

?? 首先一个对象肯定有物理地址,对象的物理地址跟hashcode地址不一样,hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址,那么对象如何得到hashcode呢?通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode,所以,hashcode是什么呢?就是在hash表中对应的位置。

?? hashcode有什么作用呢?

?? HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的

equals介绍

?? equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。

equals方法和hashcode的关系?

?? 两个对象先通过hashcode来比较,如果hashcode相等,那么就用equals方法来比较两个对象是否相等

 1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同。

 2、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置。

为什么equals方法重写的话,建议也一起重写hashcode方法?

?? 举个例子,有个A类重写了equals方法,但是没有重写hashCode方法,看输出结果,对象a1和对象a2使用equals方法相等,按照上面的hashcode的用法,那么他们两个的hashcode肯定相等,但是这里由于没重写hashcode方法,他们两个hashcode并不一样,所以,我们在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。

public class A{
    private int h=1;
    private int q=2;
    @Override
    public boolean equals(Object obj){
      //传入的对象obj是否是A类的实例
        if(obj instanceof A){
           //因为是A类的实例所以强转为A.
           A obj1=(A) obj;
           if (this.h==obj1.h && this.q==obj1.q){
             return true;
           }
        }
        return false;
    }
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
        System.out.println(a1.hashCode());//460141958
        System.out.println(a2.hashCode());//1163157884
        System.out.println(a1.equals(a2));//true
    }
}

?? 举个实例:看一下String的源码中的equals方法和hashcode方法。这个类就重写了这两个方法。

4.final 在 java 中的作用

final作为Java中的关键字可以用于三个地方。用于修饰类、类属性和类方法。

特征:凡是引用final关键字的地方皆不可修改!

(1)修饰类:表示该类不能被继承。

(2)修饰方法:表示方法不能被重写。

(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

  • 被final修饰的变量是不能够被改变的, 但是这里的"不能够被改变"对于不同的数据类型是有不同的含义的。
  • 当final修饰的是一个基本数据类型数据时, 这个数据的值在初始化后将不能被改变; 当final修饰的是一个引用类型数据时, 也就是修饰一个对象时引??? 用在初始化后将永远指向一个内存地址, 不可修改;但是该内存地址中保存的对象信息, 是可以进行修改的。
  • final修饰变量的本质: final修饰的变量会指向一块固定的内存, 这块内存中的值不能改变.
  • 引用类型变量所指向的对象之所以可以修改, 是因为引用变量不是直接指向对象的数据, 而是指向对象的引用的. 所以被final修饰的引用类型变量将永远指向一个固定的对象, 不能被修改; 对象的数据值可以被修改.

5.java 中的 Math.round()的取整规则

Math类中提供了三个与取整有关的方法:ceil、floor、round

  • ceil的英文意义是天花板,该方法就表示向上取整。
  • floor的英文意义是地板,该方法就表示向下取整。
  • round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整。
    ?
 int[] test1 = {
                Math.round(2.40f),
                Math.round(2.44f), 
                Math.round(-2.40f),
                Math.round(-2.46f),
                Math.round(3.40f),
                Math.round(3.46f), 
                Math.round(-3.40f),
                Math.round(-3.46f)};
        for(int i = 0; i< test1.length; i++)
        {  
            System.out.print(test1[i]+",");
        }  
        //输出:2,2,-2,-2,3,3,-3,-3,符合 加0.5,进行下取整;
int[] test2 = {
                Math.round(2.60f),
                Math.round(2.66f), 
                Math.round(-2.60f),
                Math.round(-2.66f),
                Math.round(3.60f),
                Math.round(3.66f), 
                Math.round(-3.60f),
                Math.round(-3.66f)};
        for(int i = 0; i< test2.length; i++)
        {  
            System.out.print(test2[i]+",");
int[] test3 = {
                Math.round(2.5f),
                Math.round(-2.5f),
                Math.round(3.5f),
                Math.round(-3.5f)};
        for(int i = 0; i< test3.length; i++)
        {  
            System.out.print(test3[i]+",");
        } 
        //输出:3,-2,4,-3,符合 加0.5,进行下取整;
     int[] test4 = {
                Math.round(2.50f),
                Math.round(2.51f),
                Math.round(2.59f),  
                Math.round(-2.50f),
                Math.round(-2.51f),
                Math.round(-2.59f),
                Math.round(3.50f),
                Math.round(3.51f),
                Math.round(3.59f),  
                Math.round(-3.50f),
                Math.round(-3.51f),
                Math.round(-3.59f),
        };
        for(int i = 0; i< test4.length; i++)
        {  
            System.out.print(test4[i]+",");
        } 
        //输出:3,3,3,-2,-3,-3,4,4,4,-3,-4,-4,符合 加0.5,进行下取整;
        //结论:Math.round()的取整规则符合加0.5,进行下取整;

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

很显然,并不是

数据类型

1、基本数据类型
???? 基本数据类型只有8种,可按照如下分类
??????? ①整数类型:long、int、short、byte
??????? ②浮点类型:float、double
??????? ③字符类型:char
??????? ④布尔类型:boolean

2、引用数据类型

???? 引用数据类型非常多,大致包括:类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型

???? 例如,String类型就是引用类型。简单来说,所有的非基本数据类型都是引用数据类型。

基本数据类型和引用数据类型的区别

1、存储位置

  • 基本变量类型

?????? 在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的。

  • 引用变量类型?

?????? 只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址(引用/句柄)。

2、传递方式

  • 基本变量类型

?????? 在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的。

  • 引用变量类型?

?????? 引用数据类型变量,调用方法时作为参数是按引用传递的。

其他总结

  • java 中String 是个对象,是引用类型 ,基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构,基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为 。
  • java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,它仅仅是一个指向堆区中某个实例的指针。
  • 基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
  • 基本类型的优势:数据存储相对简单,运算效率比较高。
  • 包装类的优势:自带方法丰富,集合的元素必须是对象类型,体现了Java一切皆是对象的思想。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:06:27  更:2021-08-11 12:10:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:55:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码