今日学习的还是一些工具类
1.包装类
为什么为什么要有包装类
方便我们操作基本数据类型中的数据
使用这些封装好的包装类,还可以调用封装在该类中的方法和属性,不用我们去编写,十分方便。
但是要和基本数据类型区分开的是:存储的位置,包装类属于引用数据类型可以存储null,引用数据类型里存的都是地址值,在堆中开辟空间,指向栈中的值,而基本数据类型是直接在常量池中的。存的都是值的本身。
在jdk1.5后,基本数据类型与其对应的包装类可以自动转换。java根据值封装包装类对象。使用时也可以自动完成
例:Boolean b=true; Integer iil=10; Integer ii2=30; //将数据值直接写入到引用数据类型中,这种操作称为自动装箱。 system.out.println(iil+ii2); //这种操作称为自动拆箱,将包装类中的值取出来做运算
- 虽然包装类可以和基本数据类型和字符串类型相互转换,但是也要考虑到转换时是否能转换
例:String istr="aa"; Integer it2 = new Integer(istr); //报错 数字格式转换异常 NumberFormatException //字符串"aa"不能转成int类型 Integer p=null; int b=p+5; //报错 空指针异常 NullPointerException //这么写相当于 null.intValue() 把不存在的转成int类型所以报空指针
- 下面介绍一些常用的包装类的方法:
//包装类.valueOf(); 将包装类中的内容转换成基本数据类型 Short.valueOf();//想转换成什么类型前面的包装类就写什么类型,但是要注意转换前后的数据类型应该相同 //包装类.MAX_VALUE;或者包装类.MIN_VALUE; 用来获得这个包装类的最大值和最小值 Integer.MAX_VALUE;//int类型的最大值 Integer.MIN_VALUE;//int类型的最小值 //包装类中的equals方法和==和compareTo方法的区别 a1==a2//比较的是地址是否相同 a1.equals(a2)//比较的是数值是否相等 a1.compareTo(a2) //比较的也是值,但是前两个返回的是一个Boolean变量true或false //这个返回的是1或者-1或者0 //返回1说明前者大,返回-1说明后者大,返回0说明一样大
2.UUID类
- 为什么会有UUID:
uuid设计之初是想要一个不会重复的值,但是在高并发,集群运算时,会出现相同数据。所以目前分布式中已经不再使用uuid创建唯一数据
uuid的内容是一个不重复的字符串在同一台设备上创建的每个uuid对象中的内容是不一样的。
UUID uuid=UUID.randomUUID();//随机产生一个uuid对象 string uuid_value=uuid.tostring();//获取uuid对象中的数
3.数学类
- 用法
Math.方法
Math.abs(num); //num的绝对值 Math.ceil(1.8); //向上取整 Math.floor(2.9); //向下取整 Math.round(1.5); //四舍五入 Math.max(1,2); //返回大的 Math.min(1,2); //返回小的 Math.random(); //随机数[0,1)小数 Math.random()*10 //随机[0,10)的数 Math.random()*10+5 //随机[5,15)的数 Math.random()*(终点-起点)+起点 //随机[3,15)的数
4.随机类
- 随机类Random用来产生一个随机数,必须创建对象后才能使用
Random ran=new Random(); ran.nextInt(); //随机一个整数 ran.nextDouble(); //随机一个小数 ran.nextLong(); //随机一个1ong ran.nextInt(10); //返回[0,参数)间的整数没有负数 ran.nextInt(33-14)+14 //随机[14,33)间的整数 ran.nextInt(44-35+1)+35 //随机[35,44]间的整数 ran.nextInt(66-48)+48+1 //随机[14,33)间的整数
5.大整型、大浮点型
- 大整型BigInteger可以存储更多的数字,而且计算是误差极小
BigInteger bigI = new BigInteger("-563121111111111111111111111111111111"); BigInteger bigI1 = new BigInteger("10000000000000000000000000000"); //要以字符串方式赋值 System.out.println(bigI.compareTo(bigI1));//比较大小,只给结果0、1、- System.out.println(bigI.max(bigI1));//比大小,给结果(大) System.out.println(bigI.min(bigI1));//比大小,给结果(小) System.out.println(bigI.abs());//绝对值 System.out.println(bigI.add(bigI1));//加法运算 System.out.println(bigI.subtract(bigI1));//减法运算 System.out.println(bigI.multiply(bigI1));//乘法运算 System.out.println(bigI.divide(bigI1));//除法运算
- 大浮点型BigDecimal可以存储更多的小数,计算误差极小
BigDecimal bigD=new BigDecimal("1111.111111");//会造成精度丢失 BigDecimal bigD1=new BigDecimal("1000");//不会造成精度丢失,推荐使用 System.out.println(bigD.abs());//绝对值 System.out.println(bigD.add(bigD1));//加法运算 System.out.println(bigD.subtract(bigD1));//减法运算 System.out.println(bigD.multiply(bigD1));//乘法运算 System.out.println(bigD.divide(divisor, scale, roundingMode);//除法运算(除数,精度,取舍规则) //以下是大浮点型除法的一些取舍规则 round_ceiling 向上取整 round_down 向下取整(负数向上取整,趋向0) roind_floor 向下取整 round_half_down 四舍五入不包括五 round_half_even 向偶数取,整数部分为奇数向上舍,整数部分为偶数向下舍 round_half_up 四舍五入包括五 round_up 向上取整(负数向下取整,远离0)
6.日期类
- 日期类在java.util.Date包下,表示特定的瞬间、精确到毫秒
- 时间保存的格式
- long类型保存经历过的毫秒值
- date类型底层保存的是经历过的long毫秒值,以及基本的计算方法,通过一个long计算现在的年份和月份等等
- Calender类型保存着某个时间点:年月日时分秒的值,以及当时时间点的自然信息,当前月多少天,当前是第几个星期,当前是全年的第几天等等数据
- 从用途上选择:
long类型适合底层保存数据,适用于网站数据传输
date适合Java程序缓存存储,获取简单时间信息
calendar 不适合做存储,因为存储信息很多,适合做时间运算,或者特殊时间信息的获取,比如这是一年内的多少天 - 三种类型的关系long→date→calendar
public static void main(String[] args) { Date d1 = new Date(); // d1对象中保存的就是在执行new Date()方法时的系统时间 System.out.println(d1); System.out.println(d1.getTime()); long l = d1.getTime();// 获取从1970.1.1 08.00到现在的毫秒值 d1 = new Date(01);// 创建指定时间点的Date对象 System.out.println(d1); // 字符串与日期间的快速转换 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss d"); // 简单日期格式化 String str = sdf.format(new Date());// 将sdf对象将一个新的当前时间对象转换为字符串类型(日期→字符串) System.out.println(str); //字符串转化为日期 Date d2=new Date(); try { d2=sdf.parse("2019-11-25 22:15:34 25"); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(d2); System.out.println(d1.after(d2)); //日历 Calendar cal =Calendar.getInstance();//日历没有构造方法,需要用getInstance静态方法创建 //cal.add(field, amount);add方法是日历做日期计算的核心方法,括号内写单位和数,例:.add(周,14);向后加14周时间 .add(年,-4);向前加4年时间 Date date =cal.getTime();//日历类的getTime方法获得的是日期对象 cal.setTime(d2);//日历类的setTime方法是根据日期对象设定日历对象 } //日历Calendar类的getTime方法获得日期date对象,日期date类的getTime方法获得long类型的毫秒值 //long类型的毫秒值通过new Date(毫秒值);转换成一个日期date对象,也可以通过Date类型的对象调用setTime方法将毫秒值转换成日期对象 //日期Date类型通过SimpleDateFormat类进行格式化后可以通过format方法转换成字符串类型 //相同的字符串类型也可以通过parse方法转化为日期Date类型 //日期格式化可以指定格式例如年月日时分秒中间可以加什么特殊符号用以区分
7.object类
Object类是所有类的父类,所有类也都有Object类的三个方法
1.equlals方法:比较两对象(长相内容)是否相同,但里面没写任何实现
自己写完这个类后要重写equals方法书写针对这个类的标记方法,写的返回值是什么就返回什么,是开发者自己定义的
public class fulei { int a,b,c; public static void main(String[] args) { Object o=new Object(); o.equals(new Object()); o.hashCode(); o.toString(); //因为object是所有类的父类,所以所有类也都拥有这些方法, //equals 是比较两个对象是否相同,但是里面没有写任何实现、 //自己写完一个类后,要重写equals方法,书写针对这个类的标记方法, //比如上面实例变量 abc中,认为a的数据相同,那么就是相同对象,这样就可以 } public boolean equals(Object obj){ fulei d1=new fulei(); return this.a == d1.a; } // 重写了equals方法,如果里面的a值相同,那么就认为对象相同,规则是自定义的 // 所以面试题中出现了两个对象的equals的结果是true、说明是同一个对象,这个结论是错的 }
2.hashCode方法:是一种数据压缩技术,将无限增长或数据庞大的数据分组管理,又能快速找到其分组的技术,将无限的数据保存在有限的空间中
优秀的hash算法是为了能够让数据尽量均匀的分布在保存空间的各个位置
Java的hash算法是将无限的数据保存在int类型(4字节)空间中
不能将默认的hash算法改数据类型,因为,所有类是继承object类,它的方法只能重写,不能修改;但是可以创建一个类,让想使用别的数据类型的hash算法在其中,然后去继承这个类,然后重写该方法;哈希码值就是对象的地址值(十进制)。
3.toString方法:方法输出是一个对象,会调用toString方法
如果该对象的类没有重写toString方法就会输出地址信息
public class 工具类练习 { public static void main(String[] args) { 工具类练习 t1=new 工具类练习(); System.out.println(t1.toString()); } @Override public String toString() { return "hahaha"; } } //在没重写toString方法前输出的是对象的地址值,重写了toString方法后输出的是hahaha //在没重写toString方法前输出的是对象的地址值(十六进制),没重写的hashCode方法输出的也是对象的地址值(十进制)