面试高频问题—-6

作者 : admin 本文共1798个字,预计阅读时间需要5分钟 发布时间: 2024-06-10 共2人阅读

一、String、StringBuffer、StringBuilder

1.String:

***string类是java中用于表示不可变字符序列的类。

***string对象是不可变的,一旦创建,其值就不能被改变。每次对string对象的修改操作都会生成一个新的string对象。

***由于string的不可变性,在频繁修改字符串情况,可能会产生大量的临时对象,导致性能下降。

***string对象是线程安全的,因为它们的值不会被修改。

2.Stringbuffer:

***stringbuffer表示可变的字符序列,可以对字符串内容进行增删。

***stringbuffer对象是可变的,即其内容可以被修改,而不像string那样生成新的对象。

***stringbuffer在处理大量字符串修改时具有更高的性能,因为它避免了频繁的对象创建和垃圾回收。

***stringbuffer是线程安全的,它的方法都是同步的,可以在多线程环境下安全地使用。

3.Stringbuilder:

***stringbuilder也表示可变字符序列,与stringbuffer类似,但它不是线程安全地

***与stringbuffer相同,stringbuilder对象的内容是可变的

***stringbuilder的性能通常优于stringbuffer,因为它不需要同步,所以在单线程环境中使用stringbuilder通常会有更好的性能。

***stringbuilder通常用于单线程环境中需要高效修改字符串的场景

二、BIO、NIO、AIO

BIO:阻塞IO,当应用程序通过socket等API发送或接收数据时,线程会被阻塞,直到数据被读取或者写入完毕。

***优点:简单易用;可靠性好(数据在读取写入时能明确地告知操作成功或失败);

***缺点:效率低(每个IO操作都会导致线程的阻塞,BIO模型的效率很低;当并发量很大时,线程的创建和销毁会占用系统资源,性能下降);不适合处理大量连接(BIO模型遇到大量连接时会导致服务器阻塞,无法快速响应请求);

NIO:非阻塞IO,当数据准备完毕时,线程才会去读取或者写入数据。

***优点:高效(IO操作时不会阻塞线程,可以快速处理请求);可以大量连接(NIO使用单线程来处理多个请求,可以通过事件驱动方式,很容易地处理大量连接);更灵活(NIO提供选择器和通道等操作,可以根据需要精确地控制读写操作);

***缺点:编码复杂(NIO编程难度高,需要处理不同地操作系统底层细节和协议);可靠性低(NIO使用了非阻塞IO方式,不太容易知道IO操作的成功与失败);

AIO:异步IO,与IO操作相关的线程会在完成操作后通知相应的应用程序。

***优点:异步性(AIO模型允许应用程序在等待IO操作完成期间执行其他任务,提高了应用程序的响应能力和吞吐量);高效率(由于使用了异步处理,AIO能更好地利用系统资源,减少了不必要的线程切换和阻塞);

***缺点:实现复杂;

对于处理大量并发连接的应用程序,NIO和AIO模型通常更为合适;而对于简单的IO操作或者小型应用程序,BIO更为简单和直接。

三、ConcurrentHashMap、HashMap

1.ConcurrentHashMap:

  • 扩容机制:当某个桶中的元素个数超过阈值时,会触发扩容操作,且扩容过程高效。
  • 数据结构:ConcurrentHashMap采用数组、链表和红黑树来实现哈希表,以提高查询效率。
  • 线程安全性:通过分段锁和CAS操作来保证线程安全,提高并发性能。

               ***整个哈希表被分为若干个段(Segment),每个段都是一个独立的哈希表,拥有自己的锁。不同的线程可以并发地访问不同的段,从而提高了并发性能。

              ***ConcurrentHashMap使用了CAS(Compare-And-Swap)操作来更新数据,从而减少了锁的争用,提高了并发度。

2.HashMap:

HashMap 的实现原理基于哈希表,通过哈希函数将键映射到桶的索引上,并使用链表或红黑树来处理哈希冲突。随着键值对的增加,HashMap 会进行扩容操作以提高性能。 HashMap 不是线程安全。

四、创建线程的几种方式

1.继承Thread类并重写run方法

2.实现runnable接口并重写run方法

3.实现callable接口并重写run方法

本站无任何商业行为
个人在线分享 » 面试高频问题—-6
E-->