学习java基础知识的第三天

1、什么是Java中的集合框架?它有哪些常见的实现类?

Java集合框架包括以下接口和类:

Collection:是所有集合类的根接口,用于存储一组对象。

List:是有序的集合,可以重复存储对象。常用实现类有ArrayList和LinkedList。

Set:是无序的集合,不可以重复存储对象。常用实现类有HashSet和TreeSet。

Queue:是一种先进先出的数据结构。常用实现类有LinkedList和PriorityQueue。

Map:是一种存储键值对的数据结构,键和值都可以是任意类型的对象。常用实现类有HashMap和TreeMap。

Stack:是一种后进先出的数据结构。常用实现类有Stack。

除了以上的集合接口和类,Java还提供了一些辅助类,如Arrays和Collections等,用于对集合进行排序、查找、替换等操作。

2、如何创建和启动线程?

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。一个java程序中至少有一个主线程,是通过JVM(Java虚拟机)启动的。
要创建并启动一个线程,Java提供了两种方法:
1)继承Thread类并重写run()方法

public class MyThread extends Thread {
   public void run() {
      // 线程执行的代码
   }
}

MyThread myThread = new MyThread();
myThread.start();

2)实现Runnable接口。这种方法更灵活,因为它允许一个类实现多个接口,从而避免了Java单继承的限制。

public class MyRunnable implements Runnable {
   public void run() {
      // 线程执行的代码
   }
}

MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

无论哪种方法,一旦线程被创建并启动,它将执行run()方法中的代码,并在完成任务后自动结束。可以使用join()方法来等待线程执行完成,并使用sleep()方法来使线程休眠一段时间。还有其他一些方法可以用来控制线程的执行,例如yield()、interrupt()等。

3、什么是Java中的反射?它有什么作用?

Java中的反射(Reflection)是指在程序运行时可以访问、检测和修改它本身的状态和行为。通过java反射机制,我们可以在运行时获取类的信息,并可以调用类的方法、获取和设置类的属性。Java反射机制可以大大增强程序的灵活性和扩展性,使程序更加可扩展和可重用。

Java反射机制的主要作用如下:

在运行时获取类的信息:通过反射机制,可以在运行时获取类的名称、父类、接口、方法、属性等信息。

动态创建对象:通过反射机制,可以在运行时创建一个对象,而不需要在编译时指定对象的类型。

调用类的方法:通过反射机制,可以在运行时调用一个类的方法,可以调用私有方法和重载方法。

获取和设置对象的属性:通过反射机制,可以在运行时获取和设置一个对象的属性,可以访问私有属性。

在运行时处理注解:通过反射机制,可以在运行时处理注解,以实现自定义注解的功能。

Java反射机制在一些框架和工具中得到广泛应用,如Spring、Hibernate等

4、什么是线程死锁?

线程死锁是指两个或两个以上的线程在执行过程中同时被阻塞,它们中的某个或者全部都在等待某个资源被释放,由于线程被无限地阻塞,系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程被称为线程死锁。
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对⽅的资源,所以这两个线程就会互相等待⽽进⼊死锁状态。
在这里插入图片描述

5、产生死锁必须具备的四个条件:

1)互斥条件:该资源任意一个时刻都只能由一个线程占用。
2)请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放
3)不剥夺条件:当一个进程已经获得的资源在未使用之前不能强行被其他线程所剥夺,智能由自己使用完毕后主动释放资源
4)循环等待条件:若干进程之间存在着一种头尾相接的循环等待资源关系。

6、如何避免线程死锁?

避免线程死锁:只需要破坏产生死锁的四个条件中的任意一个即可。
1)破坏互斥条件:无法破坏,因为使用锁的目的本身就是使得他们互斥
2)破坏请求与保持条件:一次性申请所有的资源
3)破坏不剥夺条件:占用部分资源的线程在申请其他资源时,若申请不到,则可以主动释放其占有的资源。
4)破坏循环等待条件:按照一定的顺序来申请资源。

7、简述sleep()方法和wait()方法的共同点和区别。

共同点:两者都可以暂停线程的执行。
区别:最主要的区别是sleep() ⽅法没有释放锁,⽽ wait() ⽅法释放了锁。wait()方法通常被用于线程之间的交互和通信;sleep()常被用于暂停执行。wait()方法被调用之后,线程不会自动苏醒,需要别的线程调⽤同⼀个对象上的 notify() 或者 notifyAll() ⽅法。 sleep() ⽅法执⾏完成后,线程会⾃动苏醒。或者可以使⽤ wait(longtimeout) 超时后线程会⾃动苏醒。

8、 为什么我们调⽤ start() ⽅法时会执⾏ run() ⽅法,为什么我们不能直接调⽤ run() ⽅法?

调用start()方法可以启动线程,并且使得线程进入到就绪状态,到那时如果直接执行run()方法的话则不会以多线程的方式去执行。

9、为什么要使用CPU高速缓存(cache)呢?

CPU高速缓存是为了解决CPU处理速度和内存处理速度不匹配的问题。

10、什么是内存泄漏?

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

11、什么是进程的上下文切换?

各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,则一个进程切换到另一个进程运行,称为进程的上下文切换。

12、简述一下java对象的创建过程

1)类加载检查:当虚拟机遇到一条new指令时,首先去检查该对象的类是否已经被加载,如果没有加载过,则需要先进行类的加载。
2)分配内存:在类加载检查通过后,接下来就需要为新生对象分配内存。当类加载完成后,对象所需的内存大小便可确定了,给对象分配内存空间等等与java堆中划分出一块大小确定的内存。**分配的方式有两种,一是“指针碰撞”,二是“空闲列表”。**选择哪种分配⽅式由 Java 堆是否规整决定,⽽ Java堆是否规整⼜由所采⽤的垃圾收集器是否带有压缩整理功能决定。
3)初始化零值:分配完内存后,虚拟机需要将分配到的内存空间都初始化为零值。
4)设置对象头:虚拟机对对象头进行一些必要的设置,例如,这个对象是哪个类的实例,对象的hashCode,对象的GC分代以及年龄,等等这些都存放在对象头中。
5)执行init方法:当以上所有的工作都完成之后,从虚拟机的角度来看,新的对象已经产生了,但是从java程序的角度来看,对象创建才刚刚开始, ⽅法还没有执⾏,所有的字段都还为零。所以⼀般来说,执⾏ new 指令之后会接着执⾏ ⽅法,把对象按照程序员的意愿进⾏初始化,这样⼀个真正可⽤的对象才算完全产⽣出来。

13、对象的访问定位有哪两种方式?

主流的访问定位方式是:1)使用句柄 2)直接指针
1)使用句柄:在java堆中划分出一块内存作为句柄池,reference中存储的即为对象的句柄地址,句柄中包含了对象的实例数据与类型数据各自的具体地址信息。
2)直接指针:如果使⽤直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,⽽reference 中存储的直接就是对象的地址

14、如何判断对象是否死亡?

1)引用计数法
给对象添加一个引用计数器,每当有一个地方引用它时,计数器加1;反之,当引用失效时,计数器就减1;无论何时,只要计数器的值为0,则说明该对象不可能再被使用。
2)可达性分析法
基本思想:将一系列的“GC Roots”的对象作为起点,从这些节点开始向下搜索,节点所走过的路径被称为引用链,当一个对象到GC Roots没有任何引用链相连的话,则说明该对象是不可用的。

在这里插入图片描述

15、如何判断一个类是无用的类?

满足无用类的三个条件:
1)该类所有的实例都被回收,即java堆中,不存在该类的任何实例
2)加载该类的ClassLoader已经被回收
3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

16、如何判断一个常量是废弃的常量?

假如在常量池中存在字符串 “abc”,并且当前没有任何String对象引⽤该字符串常量的话,就说明常量 “abc” 就是废弃常量,如果这时发⽣内存回收的话⽽且有必要的话,“abc” 就会被系统清理出常量池。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值