Java线程与并发编程基础面试知识点

需积分: 0 0 下载量 111 浏览量 更新于2024-08-03 收藏 17KB DOCX 举报
所有子类型",只能读取集合中的数据,不能添加数据。 2.<?superT>表示包括T在内的"所有父类型",可以添加数据,但不能确保读取的数据类型是T。 在Java中创建线程执行任务主要有四种方式: 1. 实现`Runnable`接口:这是最基础的方式,创建一个实现了Runnable接口的类实例,然后将这个实例作为参数传递给Thread类的构造器创建线程。 2. 继承`Thread`类:创建一个继承自Thread类的子类,并重写其run()方法,通过实例化这个子类来创建线程。 3. 实现`Callable`接口:Callable接口与Runnable类似,但它允许返回一个结果。通过`FutureTask`将Callable转换为Runnable,可以将其提交给ExecutorService执行。 4. 使用线程池:Java的Executor框架提供了一种更高效和灵活的线程管理方式,通过`ExecutorService`创建线程池,可以复用线程并控制并发程度,比如使用`ThreadPoolExecutor`。 线程池有五种状态: 1. Running:正常运行,接收新任务并处理队列中的任务。 2. Shutdown:不再接受新任务,但会处理队列中的任务,由调用`shutdown()`方法触发。 3. Stop:不再接受新任务,也不处理队列中的任务,由调用`shutdownNow()`方法触发。 4. Tidying:所有工作线程都已终止,正准备调用`terminated()`方法。 5. Terminated:调用`terminated()`方法后进入的状态,线程池完全关闭。 JDK、JRE和JVM之间的关系: JDK(Java Development Kit)是Java开发工具包,包含JRE(Java Runtime Environment)以及开发所需的工具,如编译器`javac`、Javadoc、JAR打包工具等。 JRE(Java Runtime Environment)是Java运行环境,用于执行Java应用程序,它包括JVM(Java Virtual Machine)和其他运行时所需的库。 JVM是JRE的一部分,它是运行Java字节码的虚拟机,负责解释和执行字节码。 `hashCode()`和`equals()`方法: `hashCode()`方法返回对象的哈希码,用于在哈希表中快速定位对象。两个对象的`hashCode()`相等并不意味着它们是同一个对象,还需通过`equals()`方法进行比较。`equals()`方法用来判断两个对象是否逻辑上相等,通常需要在重写`equals()`方法时也重写`hashCode()`,以保持一致性。 `String`、`StringBuffer`和`StringBuilder`的区别: 1. `String`是不可变对象,修改操作会创建新对象,适合不可变数据。 2. `StringBuffer`是线程安全的,适用于多线程环境下的字符串拼接。 3. `StringBuilder`是线程不安全的,性能优于`StringBuffer`,在单线程环境中更推荐使用。 泛型中的`extends`和`super`: 1. `<? extends T>`限制了类型参数只能是T或其子类,适用于读取操作,比如`List<? extends Animal>`可以赋值给`List<Dog>`,但不能向其中添加`Animal`或`Dog`。 2. `<? super T>`限制了类型参数只能是T或其父类,适用于写入操作,比如`List<? super Dog>`可以赋值给`List<Animal>`,可以向其中添加`Dog`或`Animal`,但无法读取元素的准确类型。