Java基础知识(一)

111 阅读3分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

Java 中的几种基本数据类型是什么?

boolean、float、double、char、byte、short、int、long

对应的包装类型是什么?

Boolen、Float、Double、Character、Byte、Short、Integer、Long

各自占用字节

类型大小
boolean-
float32
double64
byte8
short16
int32
long64
char16

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(),比对两个对象的内容是否相等

锁机制

悲观锁&乐观锁

悲观锁

就是很悲观,每次操作数据的时候都假设别人也会操作。所以每次操作前都会上锁。

synchronizedReentrantLockHashTable(使用了 synchronized 关键字的容器类) 等

乐观锁

就是很乐观,在操作数据时假设不会有人同时操作数据,所以不会上锁,在更新数据时判断是否有其他线程更新数据。

乐观锁实现方式 版本号机制CAS算法

java.util.concurrent.atomic包下的原子类就是使用CAS 乐观锁实现。

乐观锁适用于写少读多的场景。悲观锁时候写多读少的场景

独占锁和共享锁

独占锁

锁一次只能被一个线程持有,如果一个线程对数据加上独占锁()后,别的线程不能再对此数据加任何的锁。

JDK中的synchronizedjava.util.concurrent(JUC)包中Lock的实现类就是独占锁。

共享锁

共享锁可以被多个线程持有。如果一个线程对某个数据加了共享锁后,其他线程只能对该数据再加共享锁。获取共享锁的数据只能读数据不能修改数据。

在 JDK 中 ReentrantReadWriteLock 就是一种共享锁。

互斥锁和读写锁

互斥锁

互斥锁是独占锁的一种常规实现,指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。

读写锁

读写锁是共享锁的一种具体实现。读写锁管理一组锁,一个是只读的锁,一个是写锁。

\