视频链接:https://www.bilibili.com/video/BV1Rx411876f?p=1
视频范围P606 - P628
1.基础类型对应的八个包装类
- java中为8种基本数据类型又对应准备了8种包装类型,8种包装类属于引用数据类型,父类是Object
- 疑问:为什么要再提供8种包装类?
答:因为8种基本数据类型不够用,所以SUN又提供对应的8种包装类型
1.1 概念
需求:调用doSome()方法的时候需要传一个数字进去,但是数字属于基本数据类型,而doSome()方法参数的类型是Object 解决方案:传一个数字对应的包装类进去
自定义的包装类:
package String.integer;
public class MyInt {
int value;
public MyInt() {
}
public MyInt(int value) {
this.value = value;
}
public String toString(){
return String.valueOf(value);
}
}
测试类:
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
MyInt myInt = new MyInt(100);
doSome(myInt);
}
private static void doSome(Object obj) {
System.out.println(obj);
}
}
总结:上面的包装类是自己写的,实际开发种不需要自己写,8种基本数据类型对应的8种包装类,SUN公司已经写好了,直接用!
1.2 八个包装类
基本数据类型 | 包装类型 |
---|
byte | java.lang.Byte(父类Number) | short | java.lang.Short(父类Number) | int | java.lang.Integer(父类Number) | long | java.lang.Long(父类Number) | float | java.lang.Float(父类Number) | double | java.lang.Double(父类Number) | boolean | java.lang.Boolean(父类Object) | char | java.lang.Character(父类Object) |
1.3 装箱和拆箱
- 八种包装类种其中6个都是数字对应的包装类,她们的父类都是Number,可以先研究Number中公共的方法
- Number是一个抽象类,无法实例化对象
- Number类中有下面的方法,这些方法其实所有的数字包装类的子类都有,这些方法是负责拆箱的
修饰符 | 类型 | 方法 | 描述 |
---|
| byte | byteValue() | 返回指定号码作为值 byte ,这可能涉及舍入或截断 | abstract | double | doubleValue() | 返回指定数字的值为 double ,可能涉及四舍五入 | abstract | float | floatValue() | 返回指定数字的值为 float ,可能涉及四舍五入 | abstract | int | intValue() | 返回指定号码作为值 int ,这可能涉及舍入或截断 | abstract | long | longValue() | 返回指定数字的值为 long ,可能涉及四舍五入或截断 | | short | shortValue() | 返回指定号码作为值 short ,这可能涉及舍入或截断 |
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer i = new Integer(123);
float f = i.floatValue();
System.out.println(f);
int retValue = i.intValue();
System.out.println(retValue);
}
}
1.4 以Integer包装类和Double包装类为例
Integer类的构造方法有两个:Integer(int)、Integer(String)
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer x = new Integer(100);
System.out.println(x);
Integer y = new Integer("211");
System.out.println(y);
Double z = new Double(1.11);
System.out.println(z);
Double e = new Double("3.14");
System.out.println(e);
}
}
1.5 通过常量获取最大值和最小值
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
System.out.println("int的最大值:" + Integer.MAX_VALUE);
System.out.println("int的最小值:" + Integer.MIN_VALUE);
System.out.println("byte的最大值:" + Byte.MAX_VALUE);
System.out.println("byte的最小值:" + Byte.MIN_VALUE);
}
}
1.6 自动拆箱和自动装箱
- 在JDK1.5之后,支持自动拆箱和自动装箱
- 自动装箱:基本数据类型自动转换成包装类
- 自动拆箱:包装类自动转换成基本数据类型
- 有了自动拆箱之后,Number类中的方法就用不着了
- 自动拆箱和自动装箱的优点:方便编程
代码实例一:
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer x = 100;
int y = x;
}
}
代码实例二:
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer z = 1000;
System.out.println(z + 1);
}
}
代码实例三:
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b);
}
}
内存分析图: 代码实例四:
- java中为了提高程序的执行效率,将【-128~127】之间所有的包装对象提前创建好,放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要再new了,直接从整数型常量池当中取出来!
- Integer类加载的时候会初始化整数型常量池:256个对象
- 池:cache,就是缓存机制
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
Integer x = 127;
Integer y = 127;
System.out.println(x == y);
}
}
内存分析图:
1.7 Integer中常用方法
1.7.1 intValue()方法
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer x = new Integer(1000);
int y = x.intValue();
System.out.println(y);
}
}
1.7.2 Integer包装异常
不是一个数字无法包装成Integer
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer a = new Integer("123");
Integer b = new Integer("中文");
}
}
总结之间所学的经典异常:
- 空指针异常:NullPointerException
- 类型转换异常:ClassCastException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 数字格式化异常:NumberFormatException
1.7.3 static int parseInt(String s)
- 静态方法,传参String,返回int
- 网页上文本框中输入的100实际上是“100”字符串,后台数据库中要求存储100数字,此时java程序需要将“100”转换成100
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
int retValue = Integer.parseInt("123");
System.out.println(retValue + 100);
}
}
照葫芦画瓢:
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
double retValue2 = Double.parseDouble("3.14");
System.out.println(retValue2 + 1);
float retValue3 = Float.parseFloat("1.0");
System.out.println(retValue3 + 1);
}
}
1.7.4 将十进制字符串转换为二、八、十六进制字符串
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
String binaryString = Integer.toBinaryString(3);
System.out.println(binaryString);
String octalString = Integer.toOctalString(8);
System.out.println(octalString);
String hexString = Integer.toHexString(16);
System.out.println(hexString);
}
}
1.7.5 valueOf方法
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer i1 = Integer.valueOf(100);
System.out.println(i1);
Integer i2 = Integer.valueOf("100");
System.out.println(i2);
}
}
1.7.6 String、Integer、int三种类型的互相转换
String—> int
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
int i1 = Integer.parseInt("100");
System.out.println(i1 + 1);
}
}
int—>String
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
int i1 = Integer.parseInt("100");
String s2 = i1 + "";
System.out.println(s2 + 1);
}
}
int—>Integer
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer x = 1000;
}
}
Integer—> int
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer x = 1000;
int y = x;
}
}
String—> Integer
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer k = Integer.valueOf("123");
System.out.println(k);
}
}
Integer—> String
package String.integer;
public class IntergerTest01 {
public static void main(String[] args) {
Integer k = Integer.valueOf("123");
String e = String.valueOf(k);
System.out.println(e);
}
}
2.日期相关类
- 获取系统当前时间
- String—>Date
- Date—>String
2.1 日期Date概念
package date;
import java.util.Date;
public class DataTest01 {
public static void main(String[] args) {
Date nowTime = new Date();
System.out.println(nowTime);
}
}
2.2 日期格式化
- 将日期类型Date,按照指定的格式进行转换:Date–转换成具有一定格式的日期字符串–>String
- SimpleDateFormat是java.text包下的,专门负责日期格式化
package date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataTest01 {
public static void main(String[] args) {
Date nowTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String nowTimeStr = sdf.format(nowTime);
System.out.println(nowTimeStr);
}
}
2.3 将日期字符串String转为Date类型
package date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataTest01 {
public static void main(String[] args) throws Exception{
String time = "2022-02-02 02:02:02 222";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
Date dateTime = sdf.parse(time);
System.out.println(dateTime);
}
}
2.4 获取总毫秒数:currentTimeMillis()
获取自1970年1月1日 00:00:00 000 到当前系统时间的总毫秒数
package date;
public class DataTest01 {
public static void main(String[] args) throws Exception{
long nowTimeMillis = System.currentTimeMillis();
System.out.println(nowTimeMillis);
}
}
统计一个方法执行所消耗的时长
package date;
public class DataTest01 {
public static void main(String[] args) throws Exception{
long begin = System.currentTimeMillis();
print();
long end = System.currentTimeMillis();
System.out.println("耗费时长" + (end - begin) + "毫秒");
}
public static void print(){
for (int i = 0; i < 10000; i++) {
System.out.println("i = " + i);
}
}
}
2.5 System类的相关属性和方法
属性和方法 | 备注 |
---|
System.out | out是System类的静态变量 | System.out.println() | println()方法不是System类的,是PrintStream类的方法 | System.gc() | 建议启动垃圾回收器 | System.currentTimeMillis() | 获取自1970年1月1日 00:00:00 000 到当前系统时间的总毫秒数 | System.exit(0) | 推出JVM |
2.6 Date(long date)
获取从1970年1月1日 00:00:00 000后的1毫秒:
package date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataTest01 {
public static void main(String[] args){
Date time = new Date(1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String strTime = sdf.format(time);
System.out.println(strTime);
}
}
获取昨天的此时的时间:
package date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DataTest01 {
public static void main(String[] args){
Date time = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String strTime = sdf.format(time);
System.out.println(strTime);
}
}
3.数字相关类
3.1 DecimalFormat
java.text.DecimalFormat:专门负责数字格式化的
package number;
import java.text.DecimalFormat;
public class DecimalFormatTest01 {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("###,###.##");
String s1 = df.format(1234.56);
System.out.println(s1);
String s2 = df.format(1234.56123456);
System.out.println(s2);
DecimalFormat df1 = new DecimalFormat("###,###.0000");
String s3 = df1.format(1234.56);
System.out.println(s3);
}
}
3.2 BigDecimal
- java.math.BigDecimal
- 属于大数据,精度极高,不属于基本数据类型,属于java对象(引用数据类型),这是SUN提供的一个类,专门用于财务软件当中
- 财务软件中的double是不够的
package number;
import java.math.BigDecimal;
public class BigDecimalTest01 {
public static void main(String[] args) {
BigDecimal v1 = new BigDecimal(100);
BigDecimal v2 = new BigDecimal(200);
BigDecimal v3 = v1.add(v2);
System.out.println(v3);
BigDecimal v4 = v2.divide(v1);
System.out.println(v4);
}
}
4.Random
4.1 生成随机数
package random;
import java.util.Random;
public class RandomTest01 {
public static void main(String[] args) {
Random random = new Random();
int sum1 = random.nextInt();
System.out.println(sum1);
int sum2 = random.nextInt(101);
System.out.println(sum2);
}
}
4.2 代码实训:生成五个不重复的随机数
需求:编写程序,生成5个不重复的随机数[0-100],重复的话,重新生成。最终生成的5个随机数放到数组中,要求数组中这5个随机数不重复
package random;
import java.util.Arrays;
import java.util.Random;
public class RandomTest01 {
public static void main(String[] args) {
Random random = new Random();
int[] array = new int[5];
for (int i = 0; i < array.length; i++) {
array[i] = -1;
}
int index = 0;
while (index < array.length){
int num = random.nextInt(101);
if (!contains(array,num)){
array[index++] = num;
}
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
public static boolean contains(int[] array,int key){
for (int i = 0; i < array.length; i++) {
if (array[i] == key){
return true;
}
}
return false;
}
}
注意:测试的时候,将int num = random.nextInt(101);改为int num = random.nextInt(6);测试其效果好不好!
5.Enum
- 枚举是一种引用数据类型
- 枚举语法定义:
enum 枚举类型名{
枚举值1,枚举值2
}
- 结果只有两种情况的,建议使用布尔类型,结果超过两种并且还是可以一枚一枚列举出来的,建议使用枚举类型,例如:颜色,四季,星期等都可以使用枚举类型
5.1 没有使用枚举的情况
下面代码中需要判断divide函数是否成功运行:
package enum2;
public class EnumTese01 {
public static void main(String[] args) {
int retValue = divide(10,2);
System.out.println(retValue == 1?"计算成功":"计算失败");
int retValue1 = divide(10,0);
System.out.println(retValue1 == 1?"计算成功":"计算失败");
}
public static int divide(int a,int b){
try {
int c = a / b;
return 1;
}catch (Exception e){
return 0;
}
}
}
上面代码中的设计缺陷:
- divide函数返回值为Int不恰当,既然最后的结果只是成功和失败,最好使用布尔类型。
- 返回"1"或者"0"偏离了需求,实际上已经出错了,但是编译器没有检查出来
- 我们一直想追求的是:所有的错误尽可能让编译器找出来,所有的错误越早发现越好!
改正后:
package enum2;
public class EnumTese01 {
public static void main(String[] args) {
boolean success = divide(10,2);
System.out.println(success?"计算成功":"计算失败");
}
public static boolean divide(int a,int b){
try {
int c = a / b;
return true;
}catch (Exception e){
return false;
}
}
}
思考:当一个方法的执行结果包括三种及以上的时候(每一个都是可以数清楚的,一枚一枚都是可以列举出来的),就需要使用枚举类型!
5.2 使用枚举方法一
package enum2;
public class EnumTese02 {
public static void main(String[] args) {
Result r = divide(10,2);
System.out.println(r == Result.SUCCESS?"计算成功":"计算失败");
}
public static Result divide(int a, int b){
try{
int c = a / b;
return Result.SUCCESS;
}catch (Exception e){
return Result.FATL;
}
}
}
enum Result{
SUCCESS,FATL
}
5.3 使用枚举方法二
- switch语句支持枚举类型
- switch也支持String,int
- 低版本的JDK,只支持int
- 高版本的JDK,支持int,String,枚举
- byte,short,char也可以,因为存在自动类型转换
枚举类:
package enum2;
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER
}
测试类:
package enum2;
public class SwitchTest {
public static void main(String[] args) {
switch (Season.SPRING){
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("春天");
break;
case AUTUMN:
System.out.println("春天");
break;
case WINTER:
System.out.println("春天");
break;
}
}
}
|