【java】第九章、Java常用类


在这里插入图片描述

整数类型包装类

问题:无法计算一个整数的哈希值,这样就会导致程序中的很多比较操作无法进行下去
在这里插入图片描述
解决这种问题最好的方式:数据类型封装到一个类中,再创建这个类的对象
(封装数据类型的这个类就叫包装类)
在这里插入图片描述
在这里插入图片描述
它的构造方法像这样:可以用一个int型的数字作为参数,也可以用String字符串作为参数,然后
创建一个等于参数字面值的一个Integer对象**

package Integer_packaging_class;

public class Demo {

	public static void main(String[] args) {
		System.out.println("int类型的最大值为:" + Integer.MAX_VALUE);
		System.out.println("int类型的最小值为:" + Integer.MIN_VALUE);
		System.out.println("int类型的长度:" + Integer.SIZE);
		System.out.println("int类型的类型:" + Integer.TYPE);
		System.out.println("----------------------------");
		
		Integer inte1 = new Integer(123);
		System.out.println(inte1);
		
		Integer inte2 = new Integer("1234567");
		System.out.println(inte2);
		
		Integer inte3 = Integer.valueOf("987654");
		System.out.println(inte3);
		
		int num1 = Integer.parseInt("876");
		System.out.println(num1 + 2);
		
		int num2 = inte2.intValue();
		System.out.println(num2 - 10);
		
		String str1 = Integer.toBinaryString(11);
		System.out.println("11的二进制表示为:" + str1);
		
		String str2 = Integer.toHexString(11);
		System.out.println("11的十六进制表示为:" + str2);
		
		String str3 = Integer.toOctalString(11);
		System.out.println("11的八进制表示为:" + str3);
		
		String str4 = Integer.toString(1111, 15);
		System.out.println("11的十五进制表示为:" + str4);
		
		Byte b1 = new Byte("123");
		Byte b2 = new Byte((byte)124);
		
		Short s1 = new Short((short)345);
		Short s2 = new Short("532");
		
		Long l1 = new Long("678");
		Long l2 = new Long(999);
	}
}

在这里插入图片描述
包装类还提供了很多强大的功能:
通过两种构造方法创建Integer的对象,还可以调用Integer自带的一个方法valueOf()(里面的参数可以是整数,也可以是字符串)
上面两种方法是将字符串转换成Integer,那如何将它转换成int的值呢:去调用Integer提供的方法parseInt
另外,可以调用intValue()方法,我们就可以获取到integer的int类型的返回值

还有3个方法可以将我们的整数转换成其他进制的数字它转换的结果需要保存在一个字符串中
其实,我们也可以**自定义它转换的进制****
(直接调用toString方法)
总结:这就是Integer的一些常用方法:进制转换和数字和字符串之间的转换

浮点类型包装类

Double类和Float类分别是对Double和Float这两个基本数据类型进行了封装,都是对小数的操作,所以他们的方法基本是相同的。我们以Double类为例进行介绍
在这里插入图片描述

package double_packaging_class;

public class Demo {

	public static void main(String[] args) {
		System.out.println("double类型的最大值:" + Double.MAX_VALUE);
		System.out.println("double类型的最小值:" + Double.MIN_VALUE);
		System.out.println("double类型的长度:" + Double.SIZE);
		System.out.println("double类型的类型:" + Double.TYPE);
		
		Double num1 = new Double(11.23);
		Double num2 = new Double("11.23");
		System.out.println(num1);
		System.out.println(num2);
		
		Double num3 = Double.valueOf("12.34");
		System.out.println(num3);
		
		System.out.println(num3 + "是否是非数字:" + Double.isNaN(num3.doubleValue()));
		System.out.println(num3 + "转换为int值:" + num3.intValue());
		System.out.println(num3 + "的十六进制表示:" + Double.toHexString(num3.doubleValue()));
	}
}

在这里插入图片描述

布尔类型包装类

一个布尔类型的对象只包含一个类型为布尔的字段,此外,这个类还为布尔值和String提供了一个互相转换的方法
这个布尔类型包装类也提供了很多常量和方法
在这里插入图片描述

package boolean_packaging_class;

public class Demo {

	public static void main(String[] args) {
		System.out.println(Boolean.FALSE);
		System.out.println(Boolean.TRUE);
		System.out.println("------------------");
		
		Boolean b1 = new Boolean(true);
		
		Boolean b2 = new Boolean("false");
		Boolean b3 = new Boolean("123de");
		Boolean b4 = new Boolean("      ");
		
		System.out.println(b1);
		System.out.println(b1.toString());
		System.out.println(b2);
		System.out.println(b3);
		System.out.println(b4);
		System.out.println("------------------");
		
		Boolean b5 = Boolean.valueOf(false);
		Boolean b6 = Boolean.valueOf("true");
		System.out.println(b5);
		System.out.println(b6);
		
		Boolean bool = Boolean.parseBoolean("true");
		if(bool) {
			System.out.println("bool为真");
		}else {
			System.out.println("bool为假");
		}
		
	}
}

在这里插入图片描述
这个构造方法有一个特点:如果我们将参数写成任意一个不是true的字符串,它返回的仍是false(只要我们输入的参数不是true,它就默认是false
这个包装类还提供了一个将布尔值与字符串互相转换的方式

字符类型包装类

在这里插入图片描述
在这里插入图片描述
在构造方法中,参数是一个char字符,我们将需要包装的字符当成参数传入到构造方法中

package char_packaging_class;

public class Demo {

	public static void main(String[] args) {
		Character c = new Character('a');
		System.out.println("字符:" + c);
		
		System.out.println("是大写字母吗?" + Character.isUpperCase(c));
		System.out.println("是小写字母吗?" + Character.isLowerCase(c));
		
		System.out.println("转换为大写的结果:" + Character.toUpperCase(c));
		System.out.println("转换为小写的结果:" + Character.toLowerCase(c));
		
		System.out.println("这个字符是字母吗?" + Character.isLetter(c));
		System.out.println("这个字符是数字吗?" + Character.isDigit(c));
	}
}

在这里插入图片描述

Number类

在这里插入图片描述
它包装的是数值,那什么样的是数值呢?
Number类就是这些数值包装类的共同父类,很显然它不代表任何数字,所以它是一个抽象类(它不能被实例化,但是它的子类可以创造它的对象和实现它所有的方法)
在这里插入图片描述
就是返回它不同子类类型的值

package number_class;

public class Demo {

	public static void main(String[] args) {
		Number num = new Double(12000.34);
		
		System.out.println(num);
		System.out.println(num.doubleValue());
		System.out.println(num.intValue());
		System.out.println(num.byteValue());
	}
}

在这里插入图片描述
bytevalue()方法返回的值是一个负数的原因:**12000长度已经超出了我byte值的取值范围,所以值溢出,**等于-64

自动装箱和自动拆箱

装箱就相当于将基本数据类型都放到了箱子里,拆箱就相当于把这基本数据从箱子里拿了出来
装箱和拆箱就是包装类和基本数据类型之间互相的转换,这与之前讲的数据类型自动转换很像

手动调用方法实现:

在这里插入图片描述
把int值当成参数,这样就创建出了一个对应的Integer对象了
调用Integer的一个intValue()方法,就返回了一个对应的Int值

自动调用方法实现:

在这里插入图片描述

package automatic_packing_and_unpacking;

public class Demo {

	public static void main(String[] args) {
		Integer num = 123;            //自动装箱
		int i = new Integer(123);     //自动拆箱
		
		//特殊情况
		Integer a1 = 200;
		Integer a2 = 200;
		System.out.println(a1 == a2);
		
		Integer a3 = 12;          //byte -> Byte对象
		Integer a4 = 12;          //byte -> Byte对象
		System.out.println(a3 == a4);
		
		Boolean b1 = false;
		Boolean b2 = false;
		System.out.println(b1 == b2);
	}
}

在这里插入图片描述
因为在JDK1.5之后,java虚拟机会将 相同的布尔值和相同的byte值保存在同一个包装对象中。若一个整数的取值范围在byte的取值范围之内,则它会自动保存在一个Byte值的对象中

java虚拟机会将这两个相同的byte值 保存在同一个Byte对象里,所以这两个对象一比较的时候,他们指向的是同一个Byte对象,结果就会变成true(byte值会保存在同一个包装对象中,布尔值也一样

这就是java虚拟机的一个优化,它会将很小的值(byte)和布尔值保存在同一个包装对象中

Math类

在这里插入图片描述
在这里插入图片描述
因为Math类提供的都是静态方法,也就是说我们可以通过Math.的方式,直接调用这些方法,大大减少了我们编写的代码量
在这里插入图片描述

package math_class;

public class Demo {

	public static void main(String[] args) {
		System.out.println("圆周率Π的值为:" + Math.PI);
		
		//三角函数
		System.out.println("90度的正弦值:" + Math.sin(Math.PI/2));
		System.out.println("0度的余弦值:" + Math.cos(0));
		
		//指数运算
		System.out.println("e的平方值:" + Math.exp(2));
		System.out.println("以e为底的2的对数值:" + Math.log(2));
		System.out.println("以10为底的2的对数值:" + Math.log10(2));
		
		System.out.println("4的平方根:" + Math.sqrt(4));
		System.out.println("8的立方根:" + Math.cbrt(8));
		
		System.out.println("2的五次方:" + Math.pow(2, 5));
		System.out.println("------------------------------");
		
		//比较运算
		System.out.println("4和8较大的是:" + Math.max(4, 8));
		System.out.println("4和8较小的是:" + Math.min(4, 8));
		System.out.println("-7的绝对值是:" + Math.abs(-7));
		System.out.println("------------------------------");
		
		//四舍五入
		System.out.println("使用floor方法的效果:" + Math.floor(2.6));
		System.out.println("使用round方法的效果:" + Math.round(2.4));
		System.out.println("------------------------------");
		
		//Math.round(x) = (int)Math.floor(x + 0.5F);
		System.out.println(Math.round(15.5));
		System.out.println(Math.round(-15.5));
		System.out.println(Math.round(-15.51));
		
		System.out.println(Math.floor(-15.5 + 0.5f));    //  -15   >= -15
		System.out.println(Math.floor(-15.51 + 0.5f));   //  -15.1 >= -16		
	}
}

在这里插入图片描述
floor()是向下取整,round()才是真正的四舍五入
但是需要注意的是:来计算负数的近似值时会出现上面这样一个特殊情况

随机数(上:Math.random()方法)

Math.random()方法会返回一个double值,这个double值就是一个随机数
在这里插入图片描述
在这里插入图片描述

package guess_number;

import java.util.Scanner;

public class Demo {

	public static void main(String[] args) {
		System.out.println("--------猜数字-----------");
		int num = (int)(Math.random() * 100);
		int guess;
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你猜的数字:");
		guess = sc.nextInt();
		
		while(guess != num) {
			if(guess < num) {
				System.out.println("太小,重新输入:");
				guess = sc.nextInt();
			}else if(guess > num) {
				System.out.println("太大,重新输入:");
				guess = sc.nextInt();
			}
		}
		System.out.println("恭喜你,你赢了,猜中的数字是" + num);	
	}
}

在这里插入图片描述
Scanner扫描器去扫描我的控制台

随机数(下:Random类)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package grab_a_red_envelope;

import java.util.Random;
import java.util.Scanner;

public class Demo {

	public static void main(String[] args) {
		System.out.println("------------微信抢红包------------");
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请输入红包的总金额(元):");
		double total = sc.nextDouble();
		
		System.out.println("请输入红包的总个数(个):");
		int bagCount = sc.nextInt();
		
		double min = 0.01;           //红包的最小金额
		Random c = new Random();
		
		for(int i = 1; i < bagCount; i++) {
			/*
			 * 本次红包可以用的最大金额 = 可分配的金额 - (红包个数 - 已发出的红包数)* 红包的最小金额 
			 */
			double max = total - (bagCount - i) * min;
//			double bound = max - min;           //13.21 * 100 = 1321
			
			double safe = (double)c.nextInt((int)((max + 0.01) * 100)) / 100;  //因为我用c.nextInt()
			                                  //生成的结果为[0,max),我取不到那个最大值,所以在max的基础+0.01
			double money = safe + min;
			
			total = total - money;
			System.out.println("第" + i + "个红包:" + String.format("%.2f", money) + "元");
		}
		System.out.println("第" + bagCount + "个红包:" + String.format("%.2f", total) + "元");
		sc.close();
	}
}

在这里插入图片描述

Date类

也就是说32位系统,每隔68年就会发生一次时间归零的问题
所以我们将计算机的纪元时间,也就是时间起点定位到了1970年1月1日0时0分0秒
在这里插入图片描述
在这里插入图片描述
同时,要注意的是,在java.sql这个包下,也有Date类,它是用于包装数据库中的时间类型的,与我们常用的Date有很大区别,引入包的时候要注意

package date_class;

import java.util.Date;

public class Demo {

	public static void main(String[] args) {
		//无参构造
		Date date = new Date();
		System.out.println(date);
		
		long value = date.getTime();
		System.out.println("到现在经历的毫秒数:"+ value);
		
		//有参构造
		long time = 5 * 24 * 60 * 60 * 1000;
		Date date2 = new Date(time);
		System.out.println(date2);
	}
}

在这里插入图片描述

DateFormat类

在这里插入图片描述
在这里插入图片描述
DateFormat类不仅解决了格式的问题,还解决了时区的问题
Date是不能区分时区的,但是DateFormat类是可以的

package dateformat_class;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Demo {

	public static void main(String[] args) {
		Date date = new Date();
		DateFormat df;
		
		df = new SimpleDateFormat("yyyy-MM-dd");
		System.out.println(df.format(date));
		
		df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(df.format(date));
		
		df = new SimpleDateFormat("yyyy-MM-dd a HH:mm:ss");
		System.out.println(df.format(date));
		
		df = new SimpleDateFormat("yyyy-MM-dd E");
		System.out.println(df.format(date));
		
		df = new SimpleDateFormat("yyyy年MM月dd日 E");
		System.out.println(df.format(date));
		
		df = new SimpleDateFormat("MM/dd/yyyy");
		System.out.println(df.format(date));
		
		TimeZone z = TimeZone.getTimeZone("GMT+8");
		df = new SimpleDateFormat("HH:mm:ss");
		df.setTimeZone(z);
		System.out.println(df.format(date));
		
		TimeZone z2 = TimeZone.getTimeZone("GMT+9");
		df = new SimpleDateFormat("HH:mm:ss");
		df.setTimeZone(z2);
		System.out.println(df.format(date));
		
		TimeZone z3 = TimeZone.getTimeZone("GMT+4");
		df = new SimpleDateFormat("HH:mm:ss");
		df.setTimeZone(z3);
		System.out.println(df.format(date));
	}
}

在这里插入图片描述

Calendar类(上:常用方法)

Date类很多方法已经过时了,因为年、月、日、时、分、秒是我们人类的时间,计算机的时间不是这样的。(计算机以毫秒作为计时单位,这个值与时区无关,不管在哪个区下,我们使用new关键字创造出来的Date对象它的时间都是相同的,这就造成了无法国际化的问题;而且Date类提供的方法已经不能满足用户需求了)
在这里插入图片描述
它本身提供了一个方法,来返回一个通用的对象
在这里插入图片描述

package calendar_class;

import java.util.Calendar;

public class Demo {

	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		c.set(2021, 5, 12, 22, 6, 4);
		
		System.out.println("设置的年为:" + c.get(Calendar.YEAR));
		System.out.println("设置的月为:" + c.get(Calendar.MONTH));
		System.out.println("设置的日为:" + c.get(Calendar.DAY_OF_MONTH));
		
		System.out.println("设置的小时为:" + c.get(Calendar.HOUR_OF_DAY));
		System.out.println("设置的分为:" + c.get(Calendar.MINUTE));
		System.out.println("设置的秒为:" + c.get(Calendar.SECOND));
		
		/*
		 * add() 和 roll()
		 */
		c.set(2021, 5, 12);
		c.add(Calendar.MONTH, 8);
		System.out.println("add方法:更改的日期:" + c.get(Calendar.YEAR) +"年" +c.get(Calendar.MONTH) + "月");
		
		c.set(2021, 5, 12);
		c.roll(Calendar.MONTH, 8);
		System.out.println("roll方法:更改的日期:" + c.get(Calendar.YEAR) +"年" +c.get(Calendar.MONTH) + "月");	
	}
}

在这里插入图片描述
因为它是一个抽象类,所以我们要用它的方法来获取它的对象
add() 和roll() 这两个方法都是添加时间量,一个会进位,一个不会进位**(roll()方法不会进位)**

Calendar类(下:冬奥会倒计时)

在这里插入图片描述

package calendar_class;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Countdown_to_winter_Olympics {

	public static void main(String[] args) {
		System.out.println("------------冬奥会倒计时---------------");
		Date date = new Date();
		SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
		System.out.println("今天是:" + s.format(date));
		long time1 = date.getTime();
		
		Calendar c = Calendar.getInstance();
		c.set(2022, 2-1, 4);
		long time2 = c.getTimeInMillis();
		
		long day = (time2 - time1) / (24 * 60 * 60 * 1000);
		System.out.println("距离2022年张家口冬奥会还有" + day + "天");
	}
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值