提示
如果你第一次接触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基础-数据类型 →