类型
基本数据类型
总览
类型后面的数字代表占用的字节
数。
整数类型:byte1 short2 int4 long8
浮点数类型:float4 double8
字符类型:char2
布尔类型:boolean //注意:虽然布尔类型理论上只需要1字节,一般JVM会将boolean表示为4个字节的整数
整型
byte占用1个字节,即8个二进制位,所以表示的范围为-128~127
short 2 16 -32768~32767
int 4 32 -2147483648~2147483647
long 8 64 -9223372036854775808 ~ 9223372036854775807
浮点型
float 最大表示3.4*10^38
double 1.79*10^308
字符类型
- 字符类型char 一个字符类型的变量只能保存一个Unicode字符
- 如果要显示某个字符的Unicode编码,只需要将char变量直接赋值给int即可。
- 可以使用\u + Unicode编码表示一个字符【例:char c = '\u0041'表示字符A】
数据类型小技巧
当输入一个比较长的数字,可以加下划线便于读位,2_000_000_000
0x代表16进制
0b代表二进制
long l = 9000000000000000000L;//long型变量的结尾需要加L
float f1 = 3.14f;//float型变量的结尾需要加上f后缀
char类型使用单引号
字符串类型才使用双引号【注:字符串类型不是基本数据类型,而是引用类型】
基本类型的强制转换
:
-
手动强制转换
正数和负数都是将小数部分直接略去,如下:
a = (int) -12.7; System.out.println(a);
返回结果为
-12
而不是13。
-
强制转换超范围:
如果某数太大,超过了某需要强制转换的类型的最大值,那么就返回该强制类型的最大值。
-
利用强制转换实现四舍五入:
如果需要进行四舍五入,在原数基础上统一加上0.5后强制转换为int。
基本类型的自动转换
-
简单运算 & 复杂运算
简单运算可以自动转换,但是复杂的四则运算不会出现自动提升的情况
double = 1.2 + 24 / 5;
运算结果为
5.2
是因为24/5计算为4,如果需要精确结果,需要将24/5变成24.0/5
引用类型
字符串类型String:
-
使用格式:
String s = "..."
转义:"
\
"-
字符串的连接:
-
JVM13之前:
一般采用
+
进行连接。对于多行字符串的连接,只使用“+
”,会不方便,例如String s = "first line\n" + "second line\n" + "end";
- 字符串变量可以合并之后再打印,
String a,b,c; c = a + " " + b; System.out.println(c);
- 字符串变量可以合并之后再打印,
-
Java13之后:
采用三对双引号
"""..."""
String s = """ first line second line end """ //代码占位4行,因为结尾的"""没跟end写在同一行,那么就相当于在end后面加了个\n。
像这种java13的新特性,在编译的时候,需要给编译器加上参数:
java --source 13 --enable-preview Main.java
-
-
基本类型
自动转换
成字符串类型:如果字符串和其他类型的变量进行连接,其他类型的变量会自动转为字符串。
-
内存地址问题:
字符串定义后,就固定在了内存地址中的某个地方。再给String类型的s变量赋值时,可以赋值成功,但是只是将s这个指针指到别的内存地址中去了,原字符串的数据还在原来的内存地址中。
数组类型和字符串类型都是引用类型,其本身不会发生变化,动的只是指针,如果将ns[1]修改了值,不是原地址的值发生了改变,而是ns[1]指向了个新的地址。
-
空值 & 空字符串
完全不同,空值null表示不存在,没有分配内存地址。空字符串,已经分配了内存地址,只是内部存储的数据是空的。
-
小技巧:
- 想让字符连接成字符串,需要在打印的语句中,包含”“空字符串,然后就能将所有的字符变量升级成为字符串变量。用到了上面提到了基本类型自动转换。
数组类型
-
默认值:
数组变量未初始化时,
整型(byte, short, int, long)默认为0
浮点型(float, double)默认为0.0
布尔型默认为false
-
创建方法:
创建数组变量的时候,需要
new
一个数组变量int[] ns = new int[5];
-
索引:
创建好了之后,可以根据索引,改变数组中元素的值,索引从0开始。
-
常用方法:
获取数组元素的个数采用方法
.length
int[] ns = new int[5]; ns.length;
-
初始化数组有三种方法
int[] ns = new int[]; ns = {1,3,5,7,9};
int[] ns = new int[] {1,3,5,7,9};
int[] ns = {1,3,5,7,9};
-
小技巧:
- new数组的时候,不必手动写出数组的大小,而可以在new后边写一个集合,由编译器自动推算数组元素个数。
数组详解
-
一维数组:
遍历打印数组有一个好的方法
import java.util.Arrays; public class Main{ public static void main(String[] args){ int[] ns = {1, 1, 2, 3, 5, 8}; System.out.println(Arrays.toString(ns)); } }
打印数组,利用Array包中的.toString方法。
-
一维数组排序:
可以手动写算法,也可以用JDK提供的Arrays.sort()方法进行排序。
import java.util.Arrays; public class Main{ public static void main(String[] args){ int[] ns = {28,12,89,73,65,18,96,50,8,36}; Arrays.sort(ns);//先排序(该方法是升序排列) System.out.println(Arrays.toString(ns));//后打印 } }
【注】:对数组排序,数组本身就发生了变化(某地址中存储的值发生了交换),对字符串进行排序,只是指针的指向发生了改变。
-
多维数组:
用.length
方法时,多维数组显示的是高维数组的的个数,不是所有元素的个数。例如:
int[][] = { {1,2,3,4}, {5,6}, {7,8,9} };
输出多维数组可以使用双层for循环,然后进行打印,也可以用Arrays方法中的
.deepToString()
方法进行打印。
判断引用类型变量是否相等:
-
“
==
”“
==
”可以判断值类型的变量是否相等,但是用在引用类型身上,却只能判断其是否指向同一个对象。 -
equals()
如果要判断引用类型变量的值是否相等,就需要使用
equals()
方法。if (s1.equals(s2)) System.out.println("xxx");
包装类型
包装类型的引入
引用类型可以赋值为
null
,但是基本类型不可以。-
有时候想将基本类型变成引用类型,从而生成实例,但基本类型是没办法生成实例的。为了解决这个问题,java提供了一种
包装类
,可以将基本类型包装成引用类型。如下代码创建了一个int
类型的包装类:public class Integer{ private int value; public Integer(int value){ this.value = value; } public int intValue(){ return this.value; } }
Integer就叫做基本类型int的包装类。
包装类型的种类
-
Java核心库为每种基本类型都提供了对应的包装类型:
boolean & java.lang.Boolean
byte & java.lang.Byte
short & java.lang.Short
int & java.lang.Integer
long & java.lang.Long
float & java.lang.Float
double & java.lang.Double
char & java.lang.Character
可以直接使用,不用自行定义。
自动装箱与拆箱
- 基本类型自动变成包装类型,称为自动装箱
Auto Boxing
.将Integer
自动变成int
,称为自动拆箱Auto Unboxing
。自动装箱与自动拆箱会影响代码的执行效率。如果将包装类赋值为null
,再拆箱为基本类型,会报NullPointerException
.
包装类型的特点
-
不变类:所有的包装类型都是不变类(不可继承,不可重新赋值),
Integer
的源码中,其核心代码为public final class Integer{ //不可继承 private final int value; //不可重新赋值 }
注:对
Integer
等引用类型的实例进行比较,不可使用“==
”,而要使用.equal()
包装类Integer中的常用方法
-
Integer
类本身提供了大量方法,最常用的静态方法parseInt()
可以把字符串解析为一个整数。里面是可变参数,一个字符串,一个进制数。-
toString()
还可以将整数格式化为指定进制的字符串。还有toHexString()
toOctalString()
toBinaryString()