JAVA基础知识点辨析

系列文章目录

Java基础知识点汇总(个人向)

持续更新中~~

目录

系列文章目录

前言

一、JAVA基础

== 和 equals 的区别是什么?

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

什么是反射

深拷贝和浅拷贝区别是什么?

并发和并行有什么区别?

构造器能不能被重写?

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

Java 静态变量和成员变量的区别。

静态(static)方法可以调用非静态(non-static)方法吗?

初始化考察,请指出下面程序的运行结果

重载(Overload)和重写(Override)的区别?

为什么不能根据返回类型来区分重载?

抽象类(abstract class)和接口(interface)有什么区别?

阐述 final、finally、finalize 的区别

try、catch、finally 考察,请指出下面程序的运行结果

try、catch、finally 考察2,请指出下面程序的运行结果

try、catch、finally 考察3,请指出下面程序的运行结果

wait() 和 sleep() 方法的区别

线程的 sleep() 方法和 yield() 方法有什么区别?

线程的 join() 方法是干啥用的?

编写多线程程序有几种实现方式?

Thread 调用 start() 方法和调用 run() 方法的区别

线程的状态流转

synchronized 和 Lock 的区别

synchronized 各种加锁场景的作用范围

如何检测死锁?

怎么预防死锁?

为什么要使用线程池?直接new个线程不是很舒服?

线程池的核心属性有哪些?

说下线程池的运作流程

线程池有哪些拒绝策略?

List、Set、Map三者的区别?

ArrayList 和 LinkedList 的区别

ArrayList 和 Vector 的区别

介绍下 HashMap 的底层数据结构

 为什么要改成“数组+链表+红黑树”?

那在什么时候用链表?什么时候用红黑树?

HashMap 的默认初始容量是多少?HashMap 的容量有什么限制吗?

HashMap 的插入流程是怎么样的?

HashMap 的扩容(resize)流程是怎么样的?

 除了 HashMap,还用过哪些 Map,在使用时怎么选择?

 HashMap 和Hashtable 的区别?

Java 内存结构(运行时数据区)

什么是双亲委派模型?

Java虚拟机中有哪些类加载器?

类加载的过程

介绍下垃圾收集机制(在什么时候,对什么,做了什么)?

GC Root有哪些?

垃圾收集有哪些算法,各自的特点?

二、使用步骤

1.引入库

2.读入数据

总结


前言

最近,已经在深入学习数据库交互了,反过头来发现基础甚至还很薄弱,写下这篇帖子,权当作复习和拓展,你我皆凡人,积极向上吧

提示:以下是本篇文章正文内容,下面案例可供参考

一、Java 面试题

== 和 equals 的区别是什么?

==:运算符,用于比较基础类型变量和引用类型变量。

对于基础类型变量,比较的变量保存的值是否相同,类型不一定要相同。

short s1 = 1; long l1 = 1;
// 结果:true。类型不同,但是值相同
System.out.println(s1 == l1);

对于引用类型变量,比较的是两个对象的地址是否相同。

Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
// 结果:false。通过new创建,在内存中指向两个不同的对象
System.out.println(i1 == i2);

equals:Object 类中定义的方法,通常用于比较两个对象的值是否相等。

equals 在 Object 方法中其实等同于 ==,但是在实际的使用中,equals 通常被重写用于比较两个对象的值是否相同。

Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
// 结果:true。两个不同的对象,但是具有相同的值
System.out.println(i1.equals(i2));
 
// Integer的equals重写方法
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        // 比较对象中保存的值是否相同
        return value == ((Integer)obj).intValue();
    }
    return false;
}

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对。hashCode() 和 equals() 之间的关系如下:

当有 a.equals(b) == true 时,则 a.hashCode() == b.hashCode() 必然成立,

反过来,当 a.hashCode() == b.hashCode() 时,a.equals(b) 不一定为 true

什么是反射

反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为反射机制。

深拷贝和浅拷贝区别是什么?

数据分为基本数据类型和引用数据类型。基本数据类型:数据直接存储在栈中;引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存里。

浅拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。

深拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。

深拷贝相比于浅拷贝速度较慢并且花销较大。

并发和并行有什么区别?

并发:两个或多个事件在同一时间间隔发生。

并行:两个或者多个事件在同一时刻发生。

并行是真正意义上,同一时刻做多件事情,而并发在同一时刻只会做一件事件,只是可以将时间切碎,交替做多件事情。

构造器能不能被重写?

Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

值传递。Java 中只有值传递,对于对象参数,值的内容是对象的引用。

Java 静态变量和成员变量的区别

public class Demo {
    /**
     * 静态变量:又称类变量,static修饰
     */
    public static String STATIC_VARIABLE = "静态变量";
    /**
     * 实例变量:又称成员变量,没有static修饰
     */
    public String INSTANCE_VARIABLE = "实例变量";
}

成员变量存在于堆内存中。静态变量存在于方法区中。

成员变量与对象共存亡,随着对象创建而存在,随着对象被回收而释放。静态变量与类共存亡,随着类的加载而存在,随着类的消失而消失。

成员变量所属于对象,所以也称为实例变量。静态变量所属于类,所以也称为类变量。

成员变量只能被对象所调用 。静态变量可以被对象调用,也可以被类名调用。

静态(static)方法可以调用非静态(non-static)方法吗?

两种情况:发出调用时是否创建了对象实例。

1)没创建对象实例:不可以调用,非静态方法只能被对象所调用,静态方法可以通过对象调用,也可以通过类名调用,静态方法被调用时,可能还没创建实例对象, 如果通过静态方法内部发出对非静态方法的调用,可能无法知道非静态方法属于哪个对象。

public class Demo {
    public static void staticMethod() {
        // 直接调用非静态方法:编译报错
        instanceMethod();
    }
    public void instanceMethod() {
        System.out.println("非静态方法");
    }
}

2)创建了对象实例:可以调用,在静态方法中创建对象实例,可以正常调用非静态方法。

public class Demo {
    public static void staticMethod() {
        // 先创建实例对象,再调用非静态方法:成功执行
        Demo demo = new Demo();
        demo.instanceMethod();
    }
    public void instanceMethod() {
        System.out.println("非静态方法");
    }
}

初始化考察,请指出下面程序的运行结果

public class InitialTest {
    public static void main(String[] args) {
        A ab = new B();
        ab = new B();
    }
}
class A {
    static { // 父类静态代码块
        System.out.print("A");
    }
    public A() { // 父类构造器
        System.out.print("a");
    }
}
class B extends A {
    static { // 子类静态代码块
        System.out.print("B");
    }
    public B() { // 子类构造器
        System.out.print("b");
    }
}

执行结果:ABabab,两个考察点:

1)静态变量只会初始化(执行)一次。

2)当有父类时,完整的初始化顺序为:父类静态变量(静态代码块)->子类静态变量(静态代码块)->父类非静态变量(非静态代码块)->父类构造器 ->子类非静态变量(非静态代码块)->子类构造器 。

一道有意思的“初始化”面试题_程序员囧辉-CSDN博客

重载(Overload)和重写(Override)的区别?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)。

重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。

为什么不能根据返回类型来区分重载?

如果我们有两个方法如下,当我们调用:test(1) 时,编译器无法确认要调用的是哪个。

// 方法1
int test(int a);
// 方法2
long test(int a);

方法的返回值只是作为方法运行之后的一个“状态”,但是并不是所有调用都关注返回值,所以不能将返回值作为重载的唯一区分条件

抽象类(abstract class)和接口(interface)有什么区别?

抽象类只能单继承,接口可以多实现。

抽象类可以有构造方法,接口中不能有构造方法。

抽象类中可以有成员变量,接口中没有成员变量,只能有常量(默认就是 public static final)

抽象类中可以包含非抽象的方法,在 Java 7 之前接口中的所有方法都是抽象的,在 Java 8 之后,接口支持非抽象方法:default 方法、静态方法等。Java 9 支持私有方法、私有静态方法。

抽象类中的抽象方法类型可以是任意修饰符,Java 8 之前接口中的方法只能是 public 类型,Java 9 支持 private 类型。

设计思想的区别:

接口是自上而下的抽象过程,接口规范了某些行为,是对某一行为的抽象。我需要这个行为,我就去实现某个接口,但是具体这个行为怎么实现,完全由自己决定。

抽象类是自下而上的抽象过程,抽象类提供了通用实现,是对某一类事物的抽象。我们在写实现类的时候,发现某些实现类具有几乎相同的实现,因此我们将这些相同的实现抽取出来成为抽象类,然后如果有一

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值