包装类、日期、数字、枚举
包装类
因为8种基本数据类型不够使用,比如说要将一个数字作为参数传入一个方法中,而方法的形参是Object类型。
java为8种基本数据类型对应准备了8种包装类型。8种包装类型属于引用数据类型。
1. 八个包装类
基本数据类型 | 包装类型 |
---|---|
btye | 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) |
八种包装类中其中六个都是数字对应的包装类,父类都是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 }