提示
如果你第一次接触Java,请先按照 Java环境配置 (opens new window) 进行环境的搭建。
# 基本类型包装类
# 什么是包装类?
JAVA 为了照顾程序员的传统习惯,提供了 8 种基本类型。
又为了能够将基本类型当作 Object 使用,JAVA 提供了它们对应的包装类,具体对应关系如下:
| 基础数据类型 | 包装类 | 
|---|---|
| byte | Byte | 
| short | Short | 
| int | Integer | 
| long | Long | 
| float | Float | 
| double | Double | 
| char | Character | 
| boolean | Boolean | 
# 基本数据类型与包装类的手动转换
valueOf()
用于基本类型转包装类:
Integer integer = Integer.valueOf(123);
xxxValue()
用于包装类转基本类型:
Integer integer = Integer.valueOf(123);
int i = integer.intValue();
2
# 自动装箱和自动拆箱
自动装箱
可以将基本类型的数据直接赋给对应的包装类变量。
Integer integer = 123;
自动拆箱
可以将包装类对象直接赋值给对应的基本类型变量。
Integer integer = 123;
int i = integer;
2
# 基本类型和字符串的转换
字符串转基本类型
parseXxx()
int i = Integer.parseInt("123");
valueOf()
int i = Integer.valueOf("123");
基本类型转字符串
valueOf()
String str = String.valueOf(123);
字符串连接
String str = "" + 123;
# 数值比较
包装类和包装类之间、基本类型和包装类之间可以进行比较,比较的方法是“自动拆箱”后进行比较。
Integer integer1 = 1230;
Integer integer2 = 1240;
System.out.println(integer1 < integer2);  // true
int i = 1220;
System.out.println(i < integer2);  // true
2
3
4
5
# 判断是否相等
Integer integer1 = 1240;
Integer integer2 = 1240;
System.out.println(integer1 == integer2);  // false
System.out.println(integer1 == 1240);  // true
Integer integer3 = 124;
Integer integer4 = 124;
System.out.println(integer3 == integer4);  // false
2
3
4
5
6
7
在判断两个包装类是否相等时,仅当两个变量指向同一个实例时,JAVA 才认为它们相等。
对于 Integer integer1 = 1240;Integer integer2 = 1240; ,他们虽然数值相同,但是两个不同的实例,因此被判定为不相等。
而 Integer integer3 = 124;Integer integer4 = 124; 相等的原因在于 JAVA 的缓存机制。
# 缓存机制
JAVA 会将 -128~127 之间的整数自动装箱为 Integer 实例,并放入数组中缓存起来。
如果创建 -128~127 之间的整数,默认会直接指向数组中的元素。
因此,创建多个同等数值的 Integer 实例,它们实际上都是同一个,指向数组中的同一个元素。
# 常用类
# Object
| 方法 | 说明 | 
|---|---|
| obj1.equals(Object obj2) | 判断两个对象是否相等 | 
| toString() | 对象的字符串表示 | 
提示
通常会重写类的 equals() 和 toString()
# Objects
Objects 提供了一些工具方法用来操作对象。使用 Objects 的好处在于,防止因为对象是空指针而报错。
System.out.println(object);  // 若该对象是空指针,则会报错
System.out.println(Objects.toString(object));  // 如果该对象是空指针,输出null
2
# Arrays
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的,即所有方法都是类方法,可以由类名直接调用。
相关方法如下:
 查询元素
int binarySearch(type[] a, [int fromIndex, int toIndex,] type key)
在数组中查询元素下标,若不存在则返回负数,要求数组升序排列(只在 fromIndex 到 toIndex 中查找) 复制数组
type[] copyOf(type[] original, [int fromIndex, int toIndex,] int length)
复制 original 数组到新数组中,以方法返回值的形式返回(只复制 fromIndex 到 toIndex 中的元素)
提示
若 length 大于 original 数组长度,多余部分会置为零; 若 length 小于 original 数组长度,则只截取 length 个。
填充元素
void fill(type[] a, [int fromIndex, int toIndex,] type val)
将数组中的所有元素都赋值为 val (只填充 fromIndex 到 toIndex 中的元素)
 排序
void sort(type[] a, [int fromIndex, int toIndex])
对数组中的元素进行排序(只排序 fromIndex 到 toIndex 中的元素)
 判断是否相等
boolean equals(type[] a1, type[] a2)
判断两个数组是否相等,相等则返回 true 。
 转换为字符串
String toString(type[] a)
将数组转换为字符串,以方法返回值的形式返回。
# String
访问字符串元素
str.charAt(索引)
获得字符串长度
str.length()
字符串比较
假设有两个字符串 str1 和 str2,
- 若用 ==作比较,则比较的是指针指向的地址值
- 如果希望比较字符串的值是否相同,应该通过 equals方法进行比较
str1.equals(str2)
# StringBuffer 和 StringBuilder
什么是 StringBuffer 和 StringBuilder?
字符串在内存中会以常量的形式进行存储。如果对字符串进行“修改”,在内存中发生的情况是:新建一个“被修改”的字符串,它将于原字符串一起放置在内存之中。
如果希望对字符串进行修改,且不产生新的字符串对象,便可以使用 StringBuffer 和 StringBuilder 类,它们的对象能够被多次修改,并且不产生新的对象。
 StringBuffer 和 StringBuilder 的区别
- StringBuilder 的方法不是线程安全的(不能同步访问)
- StringBuilder 相较于 StringBuffer 有速度优势
- 多数情况下建议使用 StringBuilder
常用方法
将指定的字符串追加 StringBuilder 到对象中
public StringBuilder append(String s)
将 StringBuilder 对象反转
public StringBuilder reverse()
将 StringBuilder 对象转化为字符串
public String toString()
# Math
| 方法 | 说明 | 
|---|---|
| Math.abs(int a) | 返回绝对值 | 
| Math.round(float a) | 返回最接近的整数 | 
| Math.ceil(double a) | 返回大于等于参数的整数(以 double 类型返回) | 
| Math.floor(double a) | 返回小于于等于参数的整数(以 double 类型返回) | 
| Math.max(int a, int b) | 返回较大值 | 
| Math.min(int a, int b) | 返回较小值 | 
| Math.pow(double a, double b) | 返回 a 的 b 次方 | 
| Math.sqrt(double a) | 返回算术平方根 | 
| Math.random() | 返回随机数,范围在 0 ~ 1 之间 | 
# Random 和 ThreadLocalRandom
常用方法
| 方法 | 说明 | 
|---|---|
| nextDouble() | 生成 0~1 的伪随机 double 数 | 
| nextFloat() | 生成 0~1 的伪随机 float 数 | 
| nextInt() | 生成伪随机 int 数 | 
| nextInt(num) | 生成 0~num 的伪随机 int 数 | 
什么是 Random?
Random 用于生成伪随机数。
 构造方法
使用当前的时间作为种子
Random rand = new Random();
指定 long 数值作为种子
Random rand = new Random(num);
伪随机
Random 生成数值是一种伪随机,当两个 Random 对象的种子相同,且调用方法的顺序也相同,则它们会产生相同的数字序列。
 ThreadLocalRandom
是 Random 的增强版,在并发访问的环境下,使用 ThreadLocalRandom 可以减少多线程资源竞争,从而保证系统具有更好的线程安全性。
 BigDecimal
为了解决 float、double 精度丢失的问题。
double num = 0.1;
提示
此时 num 并不等于 0.1,而是近似于 0.1,这是由浮点数的底层存储方式决定的。
JAVA 提供了 BigDecimal 类,它提供了大量的构造器,可以通过基本类型、数值字符串、数值数组等创建 BigDecimal 对象。通过 BigDecimal 可以实现不丢失精度的计算。
需要注意的是:如果希望通过浮点数创建 BigDecimal 对象,应该通过 valueOf 方法,或先将浮点数转化为字符串后再进行创建。
# System
| 方法 | 说明 | 
|---|---|
| System.currentTimeMillis() | 获取系统当前时间(毫秒值) | 
| System.exit(0) | 结束程序,0 表示正常退出 | 
| System.gc() | 提醒虚拟机调用垃圾回收器 | 
# Scanner
| 方法 | 说明 | 
|---|---|
| next() | 获得下一个输入项,作为字符串处理 | 
| nextXxx() | 获得下一个 Xxx 类型输入项 | 
| nextLint() | 获取下一行输入项,作为字符串处理 | 
| hasNext() | 判断是否有下一个输入项 | 
| hasNextXxx() | 判断是否有下一个 Xxx 类型输入项 | 
| hasNextLine() | 判断是否有下一行输入 | 
| useDelimiter(String pattern) | 用于设置读取数据时的分隔符 | 
提示
默认情况下,Scanner 读取数据以空格、Tab、回车作为分隔;使用 nextLine 时,Scanner 以回车作为分隔
# 日期、时间
# Date
常用方法
| 方法 | 说明 | 
|---|---|
| date1.after(Date date2) | 判断 date1 是否在 date2 之后 | 
| date1.before(Date date2) | 判断 date1 是否在 date2 之前 | 
| date.getTime() | 返回日期对应的 long 整数 | 
| date.setTime(long time) | 设置时间 | 
什么是 Date?
Date 既可以用来处理日期,也可以用来处理时间。因为历史悠久,很多方法都已经过时,不再推荐使用。
 构造器
生成一个代表当前日期时间的 Date 对象:
Date()
根据参数生成 Date 对象:
提示
参数应该是 long 类型,为指定时间和"时间纪元"相差的毫秒数
Date(long time)
# Calendar
什么是 Calendar?
Calendar 是一个抽象类,用于表示日历,它是所有日历类的模板。JAVA 本身提供了 GregorianCalendar 类,对应公历。
新建 Calendar 对象:
Calendar calendar = Calendar.getInstance()
# Calendar 与 Date 的互相转换
常用方法
| 方法 | 说明 | 
|---|---|
| get(字段) | 获得指定字段的值 | 
| add(字段, int amount) | 将指定字段添加指定的时间量 | 
| set(int year, int month, int date) | 设置当前日期的年、月、日 | 
Calendar 转 Date
Date date = calendar.getTime()
Date 转 Calendar
Calendar calendar = Calendar.getInstance()
calendar.setTime(date)
2
← vuex详解 Java基础-数据类型 →
