Stage02 每日一考总结

Day01

 

1.请描述你理解的IO流的作用

在Java中,是通过完成对数据的读、写(存储)操作。

2.请描述I/O流的体系结构

3.请描述什么情况下需要写出/读取一个字节数组

加快文件的读取速度

4.数据读写操作后,为什么要关闭流资源

如果不关闭,程序就不会释放资源,就无法对文件进行其他操作,不关闭的话程序的数据也是无法写入文件的

5.字节输入流读取文件时,需要注意什么?

①要指明文件位置

②读取时要注意文件的编码格式

③读完之后要释放资源

6..请总结字节流与字符流的区别

字节流适用于处理图像、音频、视频、文本文件等二进制数据,处理原始字节数据,不关心字符编码。对于文本数据,需要手动处理字符编码的转换。

字符流适用于文本数据,对于对于处理字符编码和字符集更加方便,可以自动处理字符编码转换。

7.请描述字符流的原理

字符流可以直接处理字符数据,而无需直接操作字节,它对字符数据和字符编码的高级处理。通过字符流,Java 提供了更加方便、稳定地处理文本数据的方式,能够自动进行字符编码的转换和处理。

8.请描述字节、字符各自的输入流中read(无参)、read(有参)返回值有什么不同

字节输入流:read() 方法(无参)返回一个字节的整数值(0 到 255),或者在遇到文件末尾时返回 -1。这个方法适用于读取二进制数据,通常会在一个字节一个字节地读取文件内容。

read(byte[] buffer) 方法(有参)会将读取的字节数据填充到提供的字节数组 buffer 中,并返回实际读取的字节数。如果到达文件末尾,返回 -1。

字符输入流:read() 方法(无参)返回一个字符的整数值,或者在遇到文件末尾时返回 -1。这个方法适用于读取文本数据,它会读取一个字符(可能是多个字节表示的字符)。

read(char[] buffer) 方法(有参)会将读取的字符数据填充到提供的字符数组 buffer 中,并返回实际读取的字符数。如果到达文件末尾,返回 -1。

要注意的是,字符输入流(Reader)在读取文本数据时,会自动进行字符编码的转换。这就是为什么 read() 方法返回一个字符而不是字节。Reader 会根据字符编码将字节数据转换为相应的字符。

9.flush()和close()的区别

flush:刷新之后,还可以在文件中继续写出数据

close:断开通道,无法再文件中写出数据

10.请描述你理解的转换流

转换流可实现字节流转换为字符流

11.请描述你理解的字节缓冲流

字节缓冲流是 Java I/O 中的一种流,用于提高字节输入和输出的效率。它通过在内存中创建一个缓冲区来减少对底层数据源(如文件或网络连接)的直接读写操作,从而减少了频繁的 I/O 操作,从而提高了读写的效率。

12.请描述你理解的字符缓冲流

用于提高字符输入和输出的效率。它通过在内存中创建一个缓冲区来减少对底层数据源(如文件或网络连接)的直接读写操作,从而减少了频繁的字符编码和解码操作,提高了读写的效率。

字符缓冲流也能显著提高 I/O 操作的性能。由于字符缓冲流会处理字符编码和解码,它能够有效地处理从底层数据源读取的字节数据并将其转换为字符数据,或者将字符数据转换为字节数据写入到底层数据目标。

13.谈谈Java IO里面的常用类,字节流,字符流

常用类:

File:用于表示文件或目录的抽象路径名。

InputStream:字节输入流的基类,用于从数据源读取字节数据。

OutputStream:字节输出流的基类,用于向目标写入字节数据。

Reader:字符输入流的基类,用于从数据源读取字符数据。

Writer:字符输出流的基类,用于向目标写入字符数据。

字节流:

FileInputStream:从文件中读取字节数据的输入流。

FileOutputStream:向文件写入字节数据的输出流。

ByteArrayInputStream:从字节数组中读取数据的输入流。

ByteArrayOutputStream:向字节数组写入数据的输出流。

BufferedInputStream:带缓冲区的字节输入流。

BufferedOutputStream:带缓冲区的字节输出流。

字符流:

FileReader:从文件中读取字符数据的输入流。

FileWriter:向文件写入字符数据的输出流。

CharArrayReader:从字符数组中读取数据的输入流。

CharArrayWriter:向字符数组写入数据的输出流。

BufferedReader:带缓冲区的字符输入流。

BufferedWriter:带缓冲区的字符输出流。

字节流主要用于处理二进制数据,而字符流则专门用于处理文本数据,能够更好地处理字符编码和国际化。缓冲流则能够提高读写操作的性能,减少频繁的底层 I/O 操作。

14.Java 中有几种类型的流?JDK为每种类型的流提供一些抽象类以供继承,请说出他们分别是哪些类?

Java 中的流可以分为两种主要类型:字节流和字符流。每种类型都有对应的抽象类作为基类,用于派生具体的流类。以下是这些抽象类:

字节流的抽象类:

InputStream:字节输入流的基类,提供了读取字节数据的基本方法。

OutputStream:字节输出流的基类,提供了写入字节数据的基本方法。

字符流的抽象类:

Reader:字符输入流的基类,提供了读取字符数据的基本方法。

Writer:字符输出流的基类,提供了写入字符数据的基本方法。

15.OutputStream里面的write()是什么意思?

用于将数据写入文件

16.BufferedReader属于哪种流?他主要是用来做什么的?

字符缓冲流,用来读取文件中的数据

17.什么是缓冲区?有什么作用?

它是一块临时的内存区域,用于临时存储数据。缓冲区在数据传输和处理过程中起到了重要的作用,可以提高数据的读写效率和整体性能

18.字节流和字符流是什么?怎么转换?

字节流(Byte Streams)和字符流(Character Streams)是 Java I/O(Input/Output)机制中的两种不同类型的流,用于在程序和外部数据源之间进行数据的输入和输出操作。它们的主要区别在于处理的数据单位和用途。

InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(writer, "UTF-8");

19.请描述你对System.out.println();的理解

是 Java 中用于在控制台输出文本信息的语句。它是 System 类的一个静态成员,表示标准输出流。System.out 对应于标准输出流,而 println() 是一个方法,用于将文本信息输出到标准输出流(通常是控制台窗口)并自动换行。

20.请描述如何完成对象数据的读写

使用序列化流,通过使用 ObjectOutputStream 和 ObjectInputStream,可以将对象写入流中并从流中读取对象,实现对象数据的读写操作

21.如何完成对象的深拷贝

通过实现Serializable接口,利用对象的序列化实现克隆,可以实现真正的深克隆。

22.在代码断端要求较为方便地完成数据的换行,写入。该用那种流

字符缓冲输入流和字符缓冲输出流

Day02

1.请描述你对线程的理解

线程包含在进程中,线程是进程的一条执行路径。

2.请描述你对并发和并行的理解

并发指在一段时间内宏观上同时(交替执行的)去处理多个任务。

指同一个时刻,多个任务确实真的同时运行。 -在同一时刻,多个人同时的做多件事情

3.请描述线程的创建方式及目前你理解的他们之间的区别

①继承Thread类

②实现Rannable接口,可以实现共享一个线程对象

③实现Callable接口,可以在主线程得到子线程的返回值

④线程池

4.请描述线程的常用方法

构造方法:public Thread() :分配一个新的线程对象。

public Thread(String name) :分配一个指定名字的新的线程对象。

public Thread(Runnable target) :指定创建线程的目标对象,它实现了Runnable接口中的run方法

public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。

其他方法:public void run() :里面写此线程要完成的任务代码

public void start() :启动线程

public String getName() :获取当前现成的名字

public void setName(String name):设置当前线程的名字

public static Thread currentThread() : 获取当前线程

public static void sleep(long millis) :使当前线程睡眠多少秒

void join() :等待该线程终止。

void join(long millis) :等待该线程终止的时间最长为 millis 毫秒。如果millis时间到,将不再等待。

void join(long millis, int nanos) :等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

4.请描述给线程赋值名字的方式

继承 Thread 类并重写其构造函数,其中调用父类的构造函数来设置线程的名字。

实现 Runnable 接口的类可以在创建线程对象时,通过 Thread 类的构造函数设置线程的名字。

5.new Thread(Runnable)为什么可以接收一个FutureTask参数?

FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值

6..请描述目前你理解的线程生命周期

7.请描述你理解的等待与唤醒机制

一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。

当前线程执行过程中遇到遇到Object类的wait,Thread类的join,LockSupport类的park方法,并且在调用这些方法时,没有指定时间,那么当前线程会进入WAITING状态,直到被唤醒。

通过Object类的wait进入WAITING状态的要有Object的notify/notifyAll唤醒;  

通过Thread类的join进入WAITING状态,只有调用join方法的线程对象结束才能让当前线程恢复;

8.请描述你理解的同步和异步

同步(Synchronous):

在同步操作中,任务按照顺序依次执行,一个任务完成后,才会开始执行下一个任务。

同步操作通常是阻塞的,即任务的执行会阻塞当前线程,直到任务完成才继续执行后续操作

异步(Asynchronous):

在异步操作中,任务可以在后台并行执行,不需要等待前一个任务完成。

异步操作通常是非阻塞的,即任务的执行不会阻塞当前线程,可以同时执行其他操作。

适用于需要同时处理多个任务、提高系统的并发性能,或者避免长时间等待的情况。

9.请描述你对临界区的理解

临界区(Critical Section)是指在多线程编程中的一个特定代码段,它是一段会被多个线程访问的共享资源,可能会导致数据竞争和并发问题的区域。在临界区内,每一时刻只能有一个线程执行其中的代码,以保证数据的正确性和一致性。

10.请描述你对Synchronized的理解

内置锁:同步锁对象可以是任意类型,但是必须保证竞争“同一个共享资源”的多个线程必须使用同一个“同步锁对象”。

对于同步代码块来说,同步锁对象是由程序员手动指定的(很多时候也是指定为this或类名.class),但是对于同步方法来说,同步锁对象只能是默认的:

静态方法:当前类的Class对象(类名.class)

非静态方法:this

11.如果把 synchronized(obj) 放在 for 循环的外面,如何理解?

只有一个线程可以同时进入整个 for 循环的代码块。避免了多线程访问共享资源时的数据竞争和并发问题。

但是,将整个 for 循环放在一个大的同步块内可能会影响程序的性能。

12.如果 t1 synchronized(obj1) 而 t2 synchronized(obj2) 会怎样运作?

并发执行

13.如果 t1 synchronized(obj) 而 t2 没有加会怎么样?如何理解?

并发执行

14.请描述你对线程安全问题的理解

当我们使用多个线程访问同一资源(可以是同一个变量、同一个文件、同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题。但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题。

15.请描述你对线程同步的理解

线程同步机制就是一套协调多个线程操作共享数据时,用于保证数据安全的一种机制(工具)。

线程同步机制(工具)包括: 锁, 等待/唤醒机制, volatile关键字, final关键字等(final修饰的变量一旦初始化就不能重新赋值,具有天然的线程安全性; )

16.请描述你对内置锁的理解

不需要显式的开和关的

17.继承Thread类和是实现Runnable接口有什么区别?

继承 Thread 类适合简单的多线程操作,但不适合复用线程逻辑。

实现 Runnable 接口更加灵活,允许多个线程共享同一个 Runnable 实例,也可以复用线程逻辑。

通常推荐使用实现 Runnable 接口的方式,因为它避免了单继承限制,更符合面向对象设计原则。

18.锁块中的锁对象有什么注意事项

1) Java中任意一个对象都有一个内置锁, 所以任意一个对象都可以作为锁对象

2) 同步代码块就是操作共享数据的代码, 也称为临界区代码

3) 注意: 线程想要同步, 必须使用同一个锁对象; 同样,只要使用了同一个锁对象的同步代码块就可以实现同步

4) 注意: 不仅在修改数据时需要同步, 在读取共享数据时也需要同步

19.请就线程提升效率问题谈谈你的理解

使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类),更体现面向对象。

20.显示锁Lock在使用时,需要注意什么?

需要通过lock和unlock手动上锁和手动开锁,lock是接口不能直接实例化,采用他的实现类Reentrantlock来实例化Reentrantlock的构造方法。

Day03

1.请描述线程池存在的意义

让创建好的线程得以复用,避免由于频繁的创建销毁线程对系统的资源消耗。

2.请描述线程生命周期的各个状态的作用及转换流程

3.请描述notify()和notifyAll()的区别

notify()唤醒一个线程

notifyAll()唤醒多个线程

4.请描述线程池的工作流程

创建线程池  提交任务  任务队列管理  线程分配任务  执行任务  线程复用 线程回收  关闭线程池

5.请描述线程池的工作原理

 

1.客户端每次提交一个任务,线程池就会在核心线程池中创建一个工作线程来执行这个任务。当核心线程池中的线程已满时,则进入下一步操作。

2.把任务试图存储到工作队列中。如果工作队列没有满,则将新提交的任务存储在这个工作队列里,等待核心线程池中的空闲线程执行。如果工作队列满了,则进入下个流程。

3.线程池会再次在非核心线程池区域去创建新工作线程来执行任务,直到当前线程池总线程数量超过最大线程数时,就是按照指定的任务处理策略处理多余的任务。

6.请描述ThreadPoolExecutor的参数的作用

corePoolSize(核心线程数) maximumPoolSize(最大线程数)

 keepAliveTime(线程空闲时间) unit(时间单位) workQueue(任务队列)  threadFactory(线程工厂) handler(拒绝策略)

7.请描述自定义线程池的过程

8.请描述JDK中常见线程池的创建

Day04

1.请描述JDK中线程池中的线程是如何创建的

在 JDK 中,线程池中的线程是通过线程工厂(Thread Factory)来创建的。线程工厂负责创建新线程,并在需要时初始化线程的属性,如名称、优先级等。线程池在需要创建新线程时,会调用线程工厂的方法来创建线程。

2.请描述你理解的sleep()和wait()方法的区别

1) Sleep() 是 Thread类下的 方法,而 wait() 是 Object类的 的方法

2) sleep() 不需要强制和 synchronized 配合使用,但 wait() 需要和 synchronized 一起用

3)sleep() 在睡眠的同时,不会释放对象锁的,但 wait() 在等待的时候会释放对象锁

4)它们状态 TIMED_WAITING

3.请描述你对线程变量的安全性分析

在分析变量的线程安全性时,需要考虑以下几个方面:

①可见性:在多线程环境下,一个线程对共享变量的修改是否能被其他线程立即看到。如果不同线程对同一个变量进行读写,而且没有适当的同步措施,可能导致可见性问题。

②原子性:在多线程环境下,一个操作是否是原子的,即不可被中断的单一操作。如果多个线程同时修改同一个变量,没有保护措施可能导致竞争条件,从而破坏数据的正确性。

③有序性:在多线程环境下,指令重排可能导致代码的执行顺序与预期不符。适当的同步措施可以确保代码按照预期的顺序执行。

常见的线程安全性问题和解决方法:

①不可变对象:如果一个对象在创建后就不再发生变化,它是线程安全的。例如,String 就是一个不可变对象。

②加锁:通过使用锁(如 synchronized 或 ReentrantLock)来确保对共享资源的互斥访问,避免竞争条件。

③使用线程安全的数据结构:例如,ConcurrentHashMap、CopyOnWriteArrayList 等,它们提供了内部同步机制以保证线程安全。

④使用原子类:java.util.concurrent.atomic 包中提供了一些原子类,如 AtomicInteger、AtomicLong 等,可以执行原子操作,避免竞争条件。

⑤使用并发工具类:JDK 中提供了诸如 CountDownLatch、Semaphore、CyclicBarrier 等工具类,用于实现线程间的同步和协作。

⑥避免线程间共享:尽量减少多个线程之间共享的数据,如果可以,通过线程局部变量等方式避免共享。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值