java.lang包下的类
1. Object
object是所有类的超类,所有对象都实现了这个类的方法。
所有的方法都是native方法,其中最常用的equals、toString、getClass、hashCode。
2. Number
抽象类
Number
是表示数字值可转换为基本数据类型平台类的超类.
可以看出byteValue和shortValue不是抽象方法
public byte byteValue() {
return (byte)intValue();
}
public short shortValue() {
return (short)intValue();
}
1. Integer
int类型的包装类。Integer中的方法就不展示了。但是你这就以为你很了解Integer吗?
int占用4字节,也就是-2^31 - 2^31-1。大概是21亿左右。
Integer i = 1 ;
Integer j = 1 ;
Integer o = 1000 ;
Integer p = 1000 ;
Integer m = new Integer(1) ;
Integer n = new Integer(1) ;
Integer x = new Integer(1000) ;
Integer y = new Integer(1000) ;
System.out.println(i == j);
System.out.println(o == p);
System.out.println(m == n);
System.out.println(x == y);
System.out.println(i == m);
System.out.println(o == x);
可以回答出来六个System.out.println的答案吗?如果能打出来并且和下面的答案一样,盲猜你看过源代码或者特意的了解过。
true
false
false
false
false
false
对于上述代码中,o和p不一样?这就要说到valueOf方法了!
public static Integer valueOf(int i) {
//范围是[-128,127]返回常量池中数据
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
//创建新的数据
return new Integer(i);
}
2. Long
基本数据类型long的包装类,常量池的范围一样。
long占用8字节,也就是-2^63 - 2^63-1。
Long的方法就不展示了。
3. Float和Double
float的包装类,double的包装类,这不多说了。一个占用4字节,一个占用8字节。
浮点型 float和double是表示浮点型的数据类型,他们之间的区别在于他们的精确度不同 float 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节 double 1.797693e+308~ 4.9000000e-324 占用8个字节 double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。 浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。
4. 自动装箱和自动拆箱
Integer i = 1 ; //自动装箱
int j = i ; //自动拆箱
自动装箱的方法是valueOf,自动拆箱的方法是intValue。其他的方式也是一样的。
3. String
String类型,Java中最常用的类。
1. Character和char
基本类型和包装类,这里就是声明一声他在lang包下。
2. String和char
/** The value is used for character storage. */
private final char value[];
String就是一个不可变的char数组,所以String一旦声明,就不可更改,如果更改了,那就是一个新的字符串。
3. StringBuffer和StringBuilder
StringBuffer和StringBuilder,两个可变的字符串,一个是线程安全的,一个是非线程安全的。很荣幸看过这两个的源码,简而言之就是,方法有没有synchronized修饰的问题。
4. Thread
Java的线程类,就相当于一个实例就是一个线程。
关于Thread源码介绍,已经写了。
1. Runnable
2. ThreadLocal和InherritableThreadLocal
提供线程的局部变量,只要线程存活并且ThreadLocal的实例可以访问,每个线程都保留着对其线程局部变量副本的隐式引用。线程消失后,线程所持有的副本都将会被GC回收。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//返回初始化
return setInitialValue();
}
看一下InheritableThreadLocal类
内存泄漏
线程池中会复用线程,所以可能导致原来的ThreadLocalMap继续存在,要不然取出该线程的时候,ThreadLocalMap还会继续存在,其中的ThreadLocal也存在,导致内存泄漏。
强引用、软引用、弱引用
- 强引用:对象不会被回收
- 软引用:发生gc且内存不足,才会被回收
- 弱引用:发生gc就会被回收
3. Thread.State
public enum State {
//新建
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待
WAITING,
//超时等待
TIMED_WAITING,
//执行完成
TERMINATED;
}
5. Exception
Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),他是异常处理机制的基本组成类型。
Exception和Error体现了java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常状态,不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
参考:https://blog.csdn.net/m0_37602175/article/details/80271647
6. System
一个final修饰的类,推荐一个博客:https://blog.csdn.net/QuinnNorris/article/details/71077893
7. Math和StrictMath
查看源码的时候,你会发现Math的好多方法都是StrictMath所提供的。但是StrictMath是1.3之后引入的,而Math是1.0就在的。