「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
Java 中的几种基本数据类型是什么?
boolean、float、double、char、byte、short、int、long
对应的包装类型是什么?
Boolen、Float、Double、Character、Byte、Short、Integer、Long
各自占用字节
类型 | 大小 |
---|---|
boolean | - |
float | 32 |
double | 64 |
byte | 8 |
short | 16 |
int | 32 |
long | 64 |
char | 16 |
String 、 StringBuffer 和 StringBuilder 的区别是什么?
从三个层面:可变性、线程安全性、性能。
可变性
String对象不可变,StringBuilder和StringBuffer可变。
String类中使用final修饰字符数组,所以对象不可变。
StringBuilder和StringBuffer都继承了AbstractStringBuilder类,内部也是字符数组存储字符串。但是没有final修饰。
线程安全性
String、StringBuffer线程安全,StringBuilder线程不安全。
Stirng中的对象不可变,可以认识是常量,是线程安全的。
StringBuffer对方法加了同步锁,是线程安全的。
StringBuilder未对方法加同步锁,是线程不安全的。
性能
对String类型的对象进行操作时,每次修改都会生成一个新的对象,然后将引用指向新的String对象。StringBuffer对自己本身进行操作。相同情况下,StringBuilder的性能比StringBuffer高10%-15%左右。但是StringBuilder线程不安全。
总结
少量数据:String
单线程大量数据:StringBuilder
多线程大量数据:StringBuffer
String 为什么是不可变的?
因为String对象是final修饰的字符数组存储字符串。
== 与 equals?
==判断对象的地址是否相等,即判断两个对象是否是同一个对象。(基本类型比对的是值,引用类型比对的是内存地址)
equals:
- 类没有覆盖equals(),等价于==
- 类覆盖了equals(),比对两个对象的内容是否相等
锁机制
悲观锁&乐观锁
悲观锁
就是很悲观,每次操作数据的时候都假设别人也会操作。所以每次操作前都会上锁。
如 synchronized
和 ReentrantLock
、 HashTable
(使用了 synchronized 关键字的容器类) 等
乐观锁
就是很乐观,在操作数据时假设不会有人同时操作数据,所以不会上锁,在更新数据时判断是否有其他线程更新数据。
乐观锁实现方式 版本号机制 和 CAS算法。
java.util.concurrent.atomic
包下的原子类就是使用CAS 乐观锁实现。
乐观锁适用于写少读多的场景。悲观锁时候写多读少的场景
独占锁和共享锁
独占锁
锁一次只能被一个线程持有,如果一个线程对数据加上独占锁()后,别的线程不能再对此数据加任何的锁。
JDK中的synchronized
和java.util.concurrent(JUC)
包中Lock的实现类就是独占锁。
共享锁
共享锁可以被多个线程持有。如果一个线程对某个数据加了共享锁后,其他线程只能对该数据再加共享锁。获取共享锁的数据只能读数据不能修改数据。
在 JDK 中 ReentrantReadWriteLock
就是一种共享锁。
互斥锁和读写锁
互斥锁
互斥锁是独占锁的一种常规实现,指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。
读写锁
读写锁是共享锁的一种具体实现。读写锁管理一组锁,一个是只读的锁,一个是写锁。
\