Surpass Day——Java 包装类、对时间的处理、Sytem类、数字格式化、高精度BigDecimal、随机数、枚举、异常处理基础

114 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

1、包装类

1.1 引入包装类的目的

假设有一个方法的参数是Object类型的,现在需要传入一个整数,如何解决?

这时候把100这个 数字经过构造方法包装成对象

MyInt myint = new MyInt(100);

上面MyInt就是一个自定义的包装类

1.2 关于包装类

Java中除了8种基本数据类型之后又有8种包装类型,这八种包装类型属于引用数据类型

基本数据类型

基本数据类型                                  包装类型
byte                                    java.lang.Byte(父类NUmber)
short                                   java.lang.Shrot(父类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 关于部分包装类的父类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的形式返回指定的值 

这些方法其实所有子类中都有

1.4 Integer类的构造方法

将整形转换成Integer包装类型 Integer(int)

将String类型转换成Integer类型 Integer(String)

1.5 自动装箱/拆箱

自动装箱 int --> Integer Integer x = 100;

自动拆箱 Integr --> int int y = x;

//z保存的是内存地址
Integer z = 100;//等同于 Intteger z = new Integer(100);
System.out.println(z + 1);//这里z自动拆箱

注意:java中为了提高程序的执行效率,将【-128到127】之间所有的包装对象提前创建好,放到一个方法区的"整数型常量池"当中了,目的是只要在这个区间的数据都不需要再new了,直接从整数型常量池当中取出来

Integer a =128;//Intteger a = new Integer(128;
Integer b =128;//Intteger b = new Integer(128;
System.out.println(a == b);//false
​
Integer x =127;
Integer y =127;//x,y当中保存的内存地址是一样的
System.out.println(x == y);//true

​编辑

1.6 数字格式化异常

之前所学的经典异常

1)空指针异常 NullPointerException

2)类型转换异常 ClassCastException

3)数组下标越界异常 ArrayIndexOutOgBoundsException

4)数字格式化异常 NumberForematException

Integer a = new Integer("中文");//编译没问题,运行时出现数字格式化异常

1.7 Integer中常用方法

1.7.1 Integer的String转int方法

parseInt()方法

static int parseInt(String s)

用途:网页上文本框输入的100实际上是字符串"100",而后台数据库要求存储100数字,这时候需要将"100"转换成100

唯一静态方法,传String,返回int

int retvalue = Integer.parseInt("123");

double retvalue = Double.parseInt("3.14");

1.7.2 十进制转二进制

Integer.toBinaryString(3);//11

1.7.3 十进制转十六进制

Integer.toHexString(16)//10

1.7.4 十进制转八进制

Integer.toOctalString(8)//10

1.7.5 valueOf方法

静态的 int——>Integer

static Integer valueOf(int i)

静态的 String——>Integer

static Integer valueOf(String i)

2、String、int、Integer三者的互相转换

​编辑

 //String ——> int
int i = Integer.parseInt("100");//i是100数字
System.out.println(i+1);//101
​
//int ——> String
String s = i + "";//"100"字符串
System.out.println(s+1);//"1001"
​
//int ——> Ingeter
//自动装箱
Integer x = 1000;
    
//Integer ——> int
//自动拆箱
int y = x;
​
//String ——> Integer
Integer k = Integer.valueOf("123");
​
//Integer ——> String
String e = String.valueOf(k);

​​

1、对时间的处理

1.1 获取系统当前时间(精确到毫秒的系统当前时间)

直接调用无参数构造方法就行

Date nowTime = new Date( )
System.out.println(nowTimw);

java.utill.Date类的toString()方法已经被重写了,输出的应该不是一个对象的内存地址,应该是一个日期字符串

1.2 日期格式化

1)将日期类型Date,按照指定的格式进行转换:Date——>String

SimpleDateFormat是java.text包下的,专门负责日期转换的

yyyy 年(年是4位)
MM  月(月是2位)
dd  日
HH  时
mm  分
ss  秒
SSS 毫秒(毫秒3位,最高999,1000毫秒代表1秒)

注意:在日期格式化中,除了y M d H m s S这些字符不能随便写之外,剩下的符合格式自己随意组织

Date nowTime = new Date( )
System.out.println(nowTimw);
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss SSS");//日期格式化
String nowTimeStr = sdf.format(nowTime);//Date类型转换成String类型
System.out.println(nowTimwStr);

2)将String类型转换成日期类型Date:String——>Date

Date nowTime = new Date( )
String time = "2008-08-08 08:08:08 888";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss SSS");//日期格式化
Date dataTime = sdf2.parse(time);//String类型转换成Date类型
System.out.println(dataTime);

注意:字符串的日期格式和SimpleDateFormat对象的日期格式要相同

3)获取自1970-1-1 00:00:00 000当当前系统时间的总毫秒数

long nowTimeMillis = System.currentTimeMills();
​
System.out.println(nowTimeMillis);

解决的需求:可以计算一个方法调用的方法耗用的时间

4)Date(long date)【距离1970-1-1 08:00:00 000多少毫秒的日期】

Date time = new Date(1)//参数是一个毫秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
System.out.println("sdf.format(time)");

2、System类

System.out 【out是System类的属性】

System.out.println( ) 【println( )方法不是System类的方法,是PrintStream类的方法】

System.gc( ) 【建议启动垃圾回收器】

System.currentTimeMillis() 【获取自1970年一月一日到系统当前时间的总毫秒数】

System.exit(0) 【退出JVM】

3、*数字格式化

1)java.text.DecimalFormat专门负责数字格式化的【转成字符串】

format()方法

DecimalFormat df = new DecimalFormat("数字格式");

2)数字格式有哪些?

#   代表任意数字
,   代表千分位
.   代表小数点
0   代表不够时补0
DecimalFormat df = new DecimalFormat("###,###.###");
String s = df.format(1234.56);
System.out.println(s);//1,234.56
​
DecimalFormat df2 = new DecimalFormat("###,###.0000");//表示保留四位小数,不够时补0
String s2 = df2.format(1234.56);
System.out.println(s2);//1,234。5600

4、高精度BigDecimal

1)java.math.BigDecimal

2)属于一个大数据,精度极高,不属于基本数据类型,属于java对象(引用数据类型),用在财务软件当中(double不够用)

BigDecimal v1 = new BigDecimal(100);
BigDecimal v2 = new BigDecimal(100);
BigDecimal v3 = v1.add(v2);//调用方法求和,不能用v1 + v2;
System.out.println(s3);//300

5、随机数

随机产生int取值范围内的随机数

//创建随机数对象
Random random = new Random();
//随机产生一个int类型取值范围内的数字
int num1 = random.nextInt();
System.out.println(num1);
//产生【0-100】之间的随机数。不能产生101
int num2 = random.nextInt(101);//nextInt翻译为:下一个int类型的数据是101,表示只能取到100,不包括101
System.out.println(num2);

6、枚举类型的使用

1)枚举:一枚一枚可以列举出来的,才建议使用枚举类型

枚举编译之后也是生成class文件

枚举是一种引用数据类型

枚举中的每一个值可以看作是常量

enum Result//枚举{
    //SUCCESS 是枚举Result类型中的一个值
    //FAIL是枚举Result类型的一个值
    SUCCESS,FAIL//枚举值1,枚举值2
}

2)结果只有两种情况的,建议使用布尔类型,结果超过两种的建议使用枚举类型,例如:颜色、天气、星期

3)高版本JDk swith支持int、String、枚举类型、【byte、short、char】也可以,因为存在自动类型转换

switch(Season.AUTUMN){
    case SPRING:    ;break;//不能加Season.
    case SUMMER:    ;break;
    case AUTUMN:    ;break;
    case WINTER:    ;break;
}
enum Season{
    SPRING,SUMMER,AUTUMN,WINTER
}

7、异常处理基础

7.1  什么是异常,java提供异常处理机制有什么用?

以下程序执行过程中发生了不正常的现象,而这种不正常的情况称为异常

java把异常信息打印到控制台,供程序员参考,程序员看到异常信息之后可以对其进行修改,使程序更加健壮

public static int divide(int a,int b){
    try{
        int c = a / b;
        //程序执行到此处表示以上代码没有发生异常,表示执行成功
        return 1;
    }catch(Exception e){
        //程序执行到此处表示以上程序出现了异常
        //表示执行失败
        return 0;
    }
}

7.2  异常信息如何产生的?

JVM虚拟机在处理到异常的时候会new一个异常对象,并且JVM将new的异常对象抛出,打印输出到控制台了;