Java基础整理(十三)

包装类、日期、数字、枚举


包装类

因为8种基本数据类型不够使用,比如说要将一个数字作为参数传入一个方法中,而方法的形参是Object类型。

java为8种基本数据类型对应准备了8种包装类型。8种包装类型属于引用数据类型。

1. 八个包装类

基本数据类型包装类型
btyejava.lang.Byte(父类Number)
shortjava.lang.Short(父类Number)
intjava.lang.Integer(父类Number)
longjava.lang.Long(父类Number)
floatjava.lang.Float(父类Number)
doublejava.lang.Double(父类Number)
booleanjava.lang.Boolean(父类Object)
charjava.lang.Character(父类Object)

八种包装类中其中六个都是数字对应的包装类,父类都是Number,它是一个抽象类,无法实例化对象

下面以Integer代表来学习,其他与其类似


2. 装箱和拆箱

  • 基本数据类型 —> 引用数据类型(装箱)

    Integer i = new Integer(123); //手动装箱 过时
    Integer i = 123; //已经可以自动装箱
    
  • 引用数据类型 —> 基本数据类型(拆箱)

    int retValue = i.intValue();// 手动拆箱 过时
    int retValue = i;  //自动拆箱
    
  • “+”两边要求是基本数据类型的数字,那么分析下面代码为什么没有报错呢?

    Integer z = 1000;
    System.out.println(z+1);
    

    z是包装类,不是基本数据类型,这里会自动拆箱,将z转换成基本数据类型

  • "=="运算符不会自动拆箱,只用“*”,“/”,“+”,“-”等运算的时候才会

    Integer a = 1000;  //a是一个引用,保存的内存地址指向对象
    Integer b = 1000;
    System.out.println(a==b) //false 
    
  • 既然“==”不是自动拆箱,那么分析一下代码

    Integer x =127;
    Integer y =127;
    System.out.println(x==y); //true
    
    Integer x =128;
    Integer y =128;
    System.out.println(x==y); //false
    

    java中为了提高程序的执行效率,将[-128,127]之间所有的包装对象都提前创建好,放到一个方法区的“整数型变量池”当中了,目的是只要用这个区间的数据不需要再new了,直接从整数型常量池当中取出。所以这里的x=127,y=127中,x变量中保存的对象的内存地址和y变量中保存的对象的内存地址是一样的

    在这里插入图片描述


3. Integer构造方法

Integer构造方法中可以传入int类型,也可以传入字符串,都会被包装成Integer类型

Integer x = new Integer(100);
Integer y = new Integer("100");

===注意:==如果传入的字符串不是对应数字类型,那么会出现NumberFormatException异常

Integer y = new Integer("你好"); //异常
Integer y = new Integer("100.1"); //异常

4. 包装类常量

通过包装类获取最大值和最小值

int i = Integer.MAX_VALUE; //2147483647
int y = Integer.MIN_VALUE; //-2147483648

5. 进制转换

  • 十进制转换成二进制

    //static String toBinaryString(int i)
    String binaryString = Integer.toBinaryString(3);
    System.out.println(binaryString) //"11"
    
  • 十进制转换成十六进制

    //static String toHexString(int i)
    String hexString = Integer.toHexString(16);
    System.out.println(hexString) //"10"
    
  • 十进制转换成八进制

    //static String toOctalString(int i)
    String octalString = Integer.toOctalString(8);
    System.out.println(octalString) //"10"
    

6. String int Integer转换

在这里插入图片描述


日期

1. Date

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

    Date nowTime = new Date(); //获取当前时间
    

    Date类的toString()方法已经被重写

  • 也可以在构造方法中传入值,该值是毫秒,会在1970-01-01 00:00:00 000上累加

    Date time = new Date(1); //输出的是1970-01-01 08:00:00 001 因为北京时差 差八小时
    

2. 日期格式化SimpleDateFormat

  • SimpleDateFormat是java.text包下的

  • Date —> String (format)

    Date nowTime = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");//年-月-日 时:分:秒 毫秒
    String nowTimestr = sdf.format(nowTime);
    
  • String —> Date (parse)

    String time = "2008-08-08 08:08:08 888";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
    Date dateTime = sdf.parse(time);
    

    ==注:==这里传入SimpleDateFormat的格式需要与String给的格式一致,否则会出现java.text.ParseException异常


3. currentTimeMillis

  • 获取自1970年1月1日 00:00:00 000到当前系统时间的总毫秒数

    long nowTimeMills = System.currentTimeMillis();
    
  • 可以用来记录一个方法的执行时间

    long begin = System.currentTimeMillis();
       //执行一个方法
    long end = System.currentTimeMillis();
    long time = end - begin; //方法耗时 毫秒
    
  • 获取昨天此时的时间

    Date d = new Date(System.currentTimeMillis() - 1000*60*60*24);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
    String strTime = sdf.format(d);
    

数字

1. DecimalFormat

数字格式化:

#代表任意数字
代表千分位
,代表小数点
0代表不够时补0
  • DecimalFormat df = new DecimalFormat("###,###.##");
    String s = df.format(1234.56789);  //会四舍五入
    System.out.println(s); //1,234.57
    
  • DecimalFormat df = new DecimalFormat("###,###.0000");
    String s = df.format(1234.5);  //自动补0
    System.out.println(s); //1,234.5000
    

2. BigDecimal

BigDecimal属于大数据,精度极高。不属于基本数据类型,是引用数据类型

BigDecimal v1 = new BigDecimal(100);
BigDecimal v2 = new BigDecimal(200);
BigDecimal v3 = v1.add(v2);  //v1 v2 是引用 不可以直接加
System.out.println(v3); //300

3. Random

  • 随机产生一个int类型取值范围内的数字

    Random r = new Random();
    int num = r.nextInt();
    
  • 产生[0,100]之间的随机数

    Random r = new Random();
    int num = r.nextInt(101); //不包括101
    

枚举

  • 枚举是一种引用类型

  • 枚举类型的定义

    enum 枚举类型名{
        枚举值1,枚举值2
    }
    
  • 结果只有两种情况的,建议使用布尔类型。

    结果超过两种情况并且可以一枚一枚列举出来的,建议使用布尔类型,例如颜色、四季、星期可以使用枚举类型

  • public class Demo{
        
        public static void main(String[] args) {
    
            Season season = judge(12);
            System.out.println(season);
    
        }
    
        public static Season judge(int month){   //注意方法的返回值类型
            if(month>=1&&month<=3)
                return Season.SPRING;
            else if(month>=4&&month<=6)
                return Season.SUMMER;
            else if(month>=7&&month<=9)
                return Season.AUTUMN;
                return Season.WINTER;
    
        }
    }
    
    public enum Season {
        SPRING, SUMMER, AUTUMN, WINTER
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值