栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java面试题(2022)第一部分:Java基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java面试题(2022)第一部分:Java基础

掌握Java基础知识

目录
  • Java基础:
    • 0 面向对象
    • 1 JDK、JVM、JRE之间的区别与联系
    • 2 hashCode()与equals()之间的区别与联系
    • 3 String、StringBuffer、StringBuilder 之间的区别和使用场景
    • 4 泛型中的extends 与 super
    • 5 == 与 equals()之间的区别与联系
    • 6 override 与 overload
    • 7 List 与 Set
    • 8 ArrayList 与 LinkedList
    • 9 ConcurrentHashMap
    • 10 HashMap
    • 11 深拷贝与浅拷贝
    • 12 CopyOnWriteArrayList底层原理
    • 13 字节码
    • 14 Java中的异常与处理机制
    • 15 final
    • 16 接口与抽象类的区别


Java基础: 0 面向对象

面向对象是在计算机专业内,是一种编程范式。
对象是现实生活中具体的事物。而面向对象,是将现实中的事物抽象成对象,(对象有具体的数据和行为,对应就是Java中的属性(也称之为变量)和方法(也称之为函数)),以类、继承等实现数字建模。

相对于面向过程来说,面向对象关注的是具体的对象(在台湾也翻译为面向物件)。而不首先是事物的具体行为。

值得注意的是,在面向对象编程的过程中,具体类的实现,也是一个面向过程的编程。

面向对象的三大特征
有时也有一些资料将抽象作为面向对象的特征。
封装
封装,就是将对象的属性和行为(变量和方法)组织为一个类。并对外提供公共可访问的方法和属性。
目的是为了便于代码的复用和管理。

继承
子类继承父类(也称基类继承超类)的非私有属性和方法,并且拓展子类自己的属性和方法。隐藏了内部实现细节,外部调用不用关心被调用对象的具体实现过程。
目的是实现代码的复用。

多态
多态实现的前提有:

  1. 有继承
  2. 子类重写父类的方法
  3. 父类引用指向子类对象。
    实现了代码的复用和代码的灵活使用。对于同一个方法的调用,实现不同的逻辑。(子类重写了父类的方法)
// 举例
Father father = new Son();
father.sing();

可以能过父类调用不同的子类而实现同一方法的多种形式,但是父类不可以调子类特有的方法。

1 JDK、JVM、JRE之间的区别与联系

JDK
Java Development Kit 翻译过来,就是java开发的组件。

JVM
Java Virtual Machine Java虚拟机,运行在操作系统上的虚拟机,虚拟机用于解析Java字节码文件。基于Java虚拟机,java实现一次编译,到处运行的目的。也就是所谓的跨平台运行。

JRE
Java Runtime Enviroment 翻译过来,就是Java运行时的环境。是Java字子码文件(.class文件)运行的环境。

JDK包含JRE,而JRE又包含JVM。

安装JDK8后,如下结构:

JDK与JRE

JRE与JVM

2 hashCode()与equals()之间的区别与联系

hashCode(散列码)
在内存(堆)中,利用hash函数计算出来的整数值(int类型)。由这个值确认,对象在哈希表中的位置坐标。
hashCode()计算后,所得的哈希值,有三个特点:

  1. 两个对象的hashCode不同,则这两个对象肯定不同
  2. 两个对象的hashCode相同,两个对象不一定相同。
  3. 如果两个对象相等,则hashCode一定相同。

所以当我们重写了equals()这个方法,一定要重写hashCode()方法。

使用场景:
以HashSet为例,当放入一个新的对象时,就比较这个对象也原为对象的hashCode值。如果hashCode不同,则放入新的对象;如果不同,则再调用equals()方法,判断对象是否与原有对象相同。减少了调用equals()的次数,提高了执行速度。

3 String、StringBuffer、StringBuilder 之间的区别和使用场景
  1. String 被final修饰,每次改动,都会产生新的对象

  2. StringBuffer是线程安全的,StringBuilder线程不安全
    StringBuffer的方法都是被synchronized修饰的。

  3. 执行效率上来说StringBuilder > StringBuffer > String

应用场景:
如果是对于字符修改频繁,建议用StringBuilder,但是如果有线程安全需求,那用StringBuffer。(多线程共享变量)

4 泛型中的extends 与 super 5 == 与 equals()之间的区别与联系

“==”,对于基本数据类型,是存于栈中的常量,字符串中,直接写成String = “abc”;这样的形式,是存放在常量池中(位于栈中),比较的是值。而对于引用数据类型,比较的是其内存地址。
equals(),在Object类中,默认也是用双等于比较。举例如String,就不能默认用双等于,所以重写了equals方法,是将其中的每一个字符都取出来进行比较。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

6 override 与 overload

override
重写:override字面的意思,就是推翻的意思。
子类继承父类,对父类的方法作出更改。
方法名、参数列表必须相同。
返回值范围<= 父类;
抛出的异常 <= 父类;
访问修饰符范围>= 父类;子类不能重写父类private方法。
overload
重载:
在同一个类中,方法名必须相同,参数类型、个数、顺序不同。方法返回值和访问修饰符可以不同。重载发生在编译时。

7 List 与 Set
ListSet
顺序有无
重复按存入的顺序,可以重复。允许多个null不可重复,只允许有一个null
遍历可以用Iterator接口获取,也可以能过get(int index)下标获取Iterator接口获取
8 ArrayList 与 LinkedList
ArrayListLinkedList
底层结构底层是数组,内存中连续储存。适于下标访问基于链表,(链表中基于node的指针查找)在内存中可以不连续储存。
适应场景适用于随机查询或修改适用于增删。效率高。
原理底层是数组,扩容时,是新建一个新的数组。所以增删的开销大。但是如果使用尾插法,可以极大提升性能。遍历时,不能使用下标。使用iterator遍历。如果用for循环下标遍历效率很低。另外,不要使用indexOf()返回元素的下标。
9 ConcurrentHashMap 10 HashMap 11 深拷贝与浅拷贝 12 CopyOnWriteArrayList底层原理 13 字节码 14 Java中的异常与处理机制 15 final

final

  1. 修饰方法
    此方法不可以被子类重写,但是可以重载。
  2. 修饰变量
    变量一旦被赋值,就不可更改。
    -[] 修饰成员变量 (类变量static或实例变量)
    -[] 修饰局部变量 (类方法static或实例方法)

为什么局部内部类和匿名内部类只能访问局部final变量?

内部类与外部类,是同一级别的。内部类不因为定义在方法中,就随着方法执行结束而结束。
当外部类的方法结整时,局部变量变被销毁了。但是内部类对象可能还存在,而此时内部类就访问外部类方法中的局部变量时,就无法访问到。所以为解决此问是,就将局部变量复制一份作为内部类的成员变量,这样当外部类的局部变量死亡后,内部类仍然可以访问到。实际就是局部变量的一份拷贝。
为保证这两个变量的一致性,就加上final修饰。

16 接口与抽象类的区别

接口
接口是对对象共有行为的抽象,接口与对象之间的关系,是like a的关系。
可以继承多个接口。
接口中只存在抽象的方法(没有方法体)
成员变量只能是public static final的。默认不写。

抽象类
抽象类是对子类对象的共有属性或行为(类本质)的抽象,与对象间is a的关系。
只能继承一个抽象类。
可以存在普通的成员方法。
成员变量可以是各种类型

接口抽象类
继承关系可实现多个接口只可继承一个抽象类
成员方法只存在抽象的方法可以有普通成员方法
成员变量只能是public static final可以有各种类型
设计目的对类的行为约束,只约束行为的有无,不约束如何实现行为抽象类本质是代码复用。抽象类不能实例化

使用场景:
关注事物的本质的时候,用抽象类。当关注一个接口的操作的时候,用接口。
抽象类的使用代价较高。因为只可以继承一个抽象类。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948648.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号