java.lang包下的类

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就在的。

猜你喜欢

转载自blog.csdn.net/qq_40788718/article/details/107474837