# Java基础之数组 **Repository Path**: fpfgitmy_admin/java-base-array ## Basic Information - **Project Name**: Java基础之数组 - **Description**: java数组的简述 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 类型介绍 #### java基本类型:   java中基本数据类型有8种,可分为三类,布尔类型 *boolean*,字符类型*char*,数值类型。数值类型又分为整数类型*byte、short、int、long*,浮点类型*float、double*。 名称|类型|字节|范围|表现方式|包装类 --|:--|:--:|:--:|:--:|--: byte|最小类型|1|-128~127|byte a=0;|Byte short|短整型|2|-32768~32717|short a=0;|Short int|整型|4|-32768~32717|int a=0;|Integer long|长整型|8|-2^63~2^63-1|long a=0L;|Long double|双精度浮点型|8|*|double a=0.00;|Double float|浮点型|4|6~7|float a=0.0f;或float a=0.0F;|Float char|字符型|2(1字符为2字节)|0~65535|char a='a';|Character boolean|布尔类型|1|-|boolean a=false;|Boolean ***注意:8位(bit)为1字节*** **声明转义字符: char a = '\n';表示换行的意思** --- #### 引用类型:   java中引用类型:一切对象(class、interfac、array)皆为引用类型。 ### 内存分配 #### 基本含义:   1.基本数据类型直接存储在栈内,数据本身的值也存在栈空间内,而8种数据类型就是它们的存储模型。   2.引用类型是按照存储对象的内存模型来进行数据存储的,其中"引用"存储在有序的内存栈上,对象本身的值存储在内存堆上。   3.从中我们可以看出基本类型和引用类型的区别主要在于堆栈分配上。从下方代码示例来进行更为直观的感受。 #### 代码示例: ``` String a=new String("abc"); String b=new String("abc"); System.out.println(a==b); System.out.println(a.equals(b)); ```   上述代码中打印的结果为*false,true*,因为我们知道在java中==如果是基本类型比较两者的数值,如果是引用类型比较的是两者的内存地址,而equals()则比较的是两者的数据,所以在上述代码中创建了两个String对象,用了两种方法进行比较得出基本类型和引用类型的堆栈区别。 ### 自动拆箱、自动装箱 #### 基本含义:   java在1.5之后引入了自动拆箱和自动装箱,基本类型自动转化成为包装类型称之为自动装箱,包装类自动转化为基本类型称之为自动装箱。 #### 代码示例: ``` Integer a=3; // 自动装箱 int b=a; //自动装箱 ``` #### 缺点:   1.由于装箱会隐式的创建对象,在创建对象的同时会增加垃圾回收器(GC)的压力,影响程序的性能,所以尽量避免使用包装类进行循环运算。   2.拆箱过程中可能会产生空指针异常。 #### 示例代码: *装箱错误的示范!* ``` Integer sum=0; for(int i=0;i<100;i++){ sum+=i; } ``` *装箱正确的示范!* ``` int sum=0; for(int i=0;i<100;i++){ sum+=i; } ``` *拆箱错误示范!* ``` Object obj=null; int i=(Integer)obj; ``` *拆箱正确示范!* ``` Object obj=1; int i=(Integer)(obj==null?0:obj); ``` ### 包装类和String类型转化的方法 #### 简单介绍:    包装类型和String都有其对应的.valueOf()方法,并且Byte、Short、Integer、Long、Char这几个包装类的valueOf()方法都会做缓存,因为为他们的范围个数是有限的,但Float、Double这两个浮点数不是。或者进行强制类型转换(包装类之间不能进行强制类型转换)。 #### 代码示例: ``` Short a = 1; Integer b=Integer.valueOf(a); //通过方法进行类型转换 Integer b= (int)a;//进行强制转换。 // Integer.valueOf()的源码 @HotSpotIntrinsicCandidate public static Integer valueOf(int i) { return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i); } ``` ### 基本类型自动转化 #### 前提和原因:   1.两者类型彼此兼容。2.目的类型的空间范围一定大于转化的源类型。 #### 正向转化: 由低字节向高字节自动转换 ``` //byte->short->int->long->float->double long a=1; float b=a; //正确 int b=a; //错误 ``` #### 逆向转化:使用强制转化可能丢失精度: ` int a = (int)(3.14); `