Java基础笔记整理

因为学校课堂正在学Java,距离自己刚接触Java也过去一年了,所以也正好作为复习,写了这个笔记(实时更新)

Java中的包装类和原生类型

一、基本类型和包装类的介绍

8个基本类型(也称原生类型):byte, short, int, long, float, double, char, boolean
对应的8个包装类:Byte, Short, Integer, Long, Float, Double, Character, Boolean

二、自动转换与强制转换

1、自动转换原则(由低精度到高精度):byte,short,char (同级)-> int -> long -> float -> double

    byte b = 1;
    char c = 1;
    short s = 1;
    int i = 1;

    c = b;  // Error,同级
    c = s;  // Error,同级
    s = c;  // Error,同级
    i = c;  // OK
    int i = 1long t = 1;
    float f = 1;
    double d = 1;

    f = i;  //  Ok
    f = t;  //  Ok
    d = f;  // Ok

2、强制转换
强制转换的格式是在需要转型的数据前加上 “( )”, 然后在括号内加入需要转化的数据类型

 byte b = 3;
 int i = 3;
 long t = 3;
 float f = 3;
 char c = 3;
 short s = 3;

 i = (int) f;  // OK,由高精度向低精度转换
 t = (long) f;  // OK,由高精度向低精度转换
 b = (byte) i;  // OK,由高精度向低精度转换

 i = b; // OK,由低精度向高精度转换,自动转型
 System.out.println(c==s);  // OK,true,c 和 s 自动转型为int,然后比较

 b = (byte) s;  // OK,一种类型到另一种类型转换
 c = (char) b;  // OK,一种类型到另一种类型转换
 c = (char) s;   // OK,一种类型到另一种类型转换

三、自动装箱与拆箱

1、将基本类型转换为包装类
方法一:可以通过对应的包装类的构造函数完成
在这里插入图片描述
方法二:包装类中提供的静态函数
在这里插入图片描述

package august;

public class IntegerTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义一个double类型的数据
		double d=123.12;
		//1.通过构造函数把基本数据类型转换为对应的包装类型
		Double d1 = new Double(d);
		System.out.println(d1);     //123.12
		//2.使用包装类中的静态方法来完成
		Double d2 = Double.valueOf(d);
		System.out.println(d2);     //123.12
	}
}

2、将包装类型转换为基本类型
只能使用包装类中提供的函数:xxxValue,(xxx代表要转换的类型)
在这里插入图片描述
3、自动装箱:就是自动将基本类型转换为包装类型。拆箱:就是自动将包装类型转换为基本类型。
在Java SE5之前,如果要装箱,必要要先创建一个包装类对象,而在Java SE5之后,不需要这样做。可以直接这样:

Integer i = 10;  //装箱
int n = i;   //拆箱

原理在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。对于其他的包装器类,比如Double、Character,也同样适用。

*但是要注意:如果整型字面值在[-128,127]之间,便不创建对象直接返回,其余的都会在valueOf()方法中重新创建对象。看代码

public class Main {
    public static void main(String[] args) {

        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1==i2);       // true因为100在[-128,127]之间,所以没有重新创建对象,返回值为true
        System.out.println(i3==i4);       // false因为200不在此区间,所以两者均重新创建了新的对象,所以返回值为false
    }
}
public class Main {
    public static void main(String[] args) {

        Double i1 = 100.0;
        Double i2 = 100.0;
        Double i3 = 200.0;
        Double i4 = 200.0;

        System.out.println(i1==i2);          // false
        System.out.println(i3==i4);          // false
        //四者均为double类型的值,直接都创建新的对象
    }
}

总结:
1、Integer、Short、Byte、Character、Long 这几个类的valueOf方法的实现是类似的,有限可列举,共享[-128,127];
2、Double、Float的valueOf方法的实现是类似的,无限不可列举,不共享;
3、Boolean的valueOf方法的实现不同于以上的整型和浮点型,只有两个值,有限可列举,共享;

另外,Integer i = new Integer(xxx); 不会触发自动装箱。而Integer i = xxx; 会触发自动装箱;第二种方式的执行效率和资源占用在一般性情况下([-128,127])要优于第一种情况(注意这并不是绝对的)。

详细参考:https://blog.csdn.net/justloveyou_/article/details/52651211https://www.jianshu.com/p/f00b3e5d3142

发布了7 篇原创文章 · 获赞 0 · 访问量 233

猜你喜欢

转载自blog.csdn.net/weixin_44847031/article/details/104418222