一、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方法
标签:string,stringbuffer,----,面试,线程,IO,操作,高频,NIO From: https://blog.csdn.net/chenDR333/article/details/139545535