Math类
// Math.abs():取绝对值
System.out.println(Math.abs(-88)); //88
// Math.random(): 取[0,1)之间的随机数
System.out.println((int)( Math.random()*100) + 1);
//Math.ceil(double a): 取大于此数的最小整数,返回值为double类型
System.out.println(Math.ceil(85.5)); //86
System.out.println(Math.ceil(-33.3)); //-33
//Math.floor(double a): 取小于此数的最大整数,返回值为double类型
System.out.println(Math.floor(45.36)); //45
System.out.println(Math.floor(-5.54)); //-6
//Math.max(int a, int b)
System.out.println(Math.max(6, 9));
//Math.round(float a):按四舍五入返回最接近参数的int
System.out.println(Math.round(6.67F));
System.out.println(Math.round(6.33F));
System类
System.exit(int status): 终止当前运行的Java虚拟机,非零表示异常终止
System.out.println("开始");
//终止当前运行的java虚拟机
System.exit(0);
System.out.println("结束");
//输出:开始
System.currentTimeMillis(): 返回当前时间(以毫秒为单位)
System.out.println(System.currentTimeMillis()
*1.0/1000/60/60/24/365 + "年");
//51.639367204274485年
System.currentTimeMillis()可以用于计算程序的执行时间:
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
long end = System.currentTimeMillis();
long time = end - start;
System.out.println("共耗时" + time + "毫秒"); //共耗时49毫秒
Object类
Object的toString方法
Object类中默认的toString方法:返回类的包路径+@+一串数字
Student s = new Student();
s.setName("林青霞");
s.setAge(20);
System.out.println(s); //com.itheima.Student@1b6d3586
System.out.println(s.toString()); //com.itheima.Student@1b6d3586
在子类Student中重写toString方法:
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
再次输出Student类的对象
Student s = new Student();
s.setName("林青霞");
s.setAge(20);
System.out.println(s); //Student{name='林青霞', age=20}
System.out.println(s.toString()); //Student{name='林青霞', age=20}
Object类的equals方法
Object类中的equals方法默认比较的是地址:
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
Student s2 = new Student();
s2.setName("林青霞");
s2.setAge(30);
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //false: 比较的是s1和s2地址值,由于s1和s2都是new出来的,地址值不相同
要想比较s1和s2中的属性值,要在子类中重写equals方法:
在子类中自动生成equals方法
@Overridepublic boolean equals(Object o) { /* this --- s1 o --- s2 */ //比较地址是否相同,如果相同,直接返回true if (this == o) return true; //判断参数是否为null //判断两个对象是否来自同一个类 if (o == null || getClass() != o.getClass()) return false; //向下转型 Student student = (Student) o; //比较年龄是否相同 if (age != student.age) return false; //比较姓名内容是否相同 return name != null ? name.equals(student.name) : student.name == null;}
再次测试equals方法:
Student s1 = new Student();s1.setName("林青霞");s1.setAge(30);Student s2 = new Student();s2.setName("林青霞");s2.setAge(30);System.out.println(s1 == s2); //falseSystem.out.println(s1.equals(s2)); //true
Arrays类
Arrays.toString(int[] a): 返回指定数组的内容的字符串表示形式
Arrays.sort(int[] a): 按照数字顺序排列指定的数组
//定义一个数组int[] arr = {24, 69, 80, 57, 13};System.out.println("排序前:" + Arrays.toString(arr)); //排序前:[24, 69, 80, 57, 13]Arrays.sort(arr);System.out.println("排序后:" + Arrays.toString(arr));//排序后:[13, 24, 57, 69, 80]
Integer类
判断一个数据是否在int的范围内?
System.out.println(Integer.MAX_VALUE); //2147483647System.out.println(Integer.MIN_VALUE); //-2147483648
Integer对象创建方式
//方式1:根据构造方法创建Integer对象Integer i1 = new Integer(100); //100Integer i2 = new Integer("100"); //100Integer i3 = new Integer("abc"); //错误 NumberFormatException//方式2:静态方法获得对象Integer i1 = Integer.valueOf(100); //100Integer i2 = Integer.valueOf("100"); //100Integer i3 = Integer.valueOf("aaa"); //错误 NumberFormatException
int和String的相互转换
int — String
int num = 100;//方式1String s1 = "" + num;System.out.println(s1); //100//方式2String s2 = String.valueOf(num); //100System.out.println(s2);
String — int
String s = "100";//方式1//String --- Integer --- intInteger i = Integer.valueOf(s);int x = i.intValue();System.out.println(x);//方式2int y = Integer.parseInt(s);System.out.println(y);
字符串中的数据排序
需求:有一个字符串: “91 27 46 38 50”,请写程序实现最终输出结果是:“27 38 46 50 91”
public static void main(String[] args) { //定义一个字符串 String s ="91 27 46 38 50"; String[] s1 = s.split(" "); int[] arr = new int[s1.length]; for (int i = 0; i < s1.length; i++) { int num = Integer.parseInt(s1[i]); arr[i] = num; } Arrays.sort(arr); System.out.println("排序后:" + ArrayToString(arr));}public static String ArrayToString(int[] arr) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr.length; i++) { if (i == arr.length-1) { sb.append(arr[i]); } else { sb.append(arr[i]).append(" "); } } return sb.toString();}
自动装箱和拆箱
装箱
装箱:把基本数据类型转换为对应的包装类类型
Integer i = Integer.valueOf(100);
自动装箱:
Integer ii = 100; //底层自动调用了Integer.valueOf(100);
拆箱
拆箱:把包装类类型转换为对应的基本数据类型
ii = ii.intValue() + 200; //自动装箱
自动拆箱:
ii += 200; //内部隐含了自动拆箱和自动装箱
拆箱之前要做判断
Integer iii = null;iii += 300; //NullPointerException,iii为null,null调方法:空指针异常
所以在操作之前,应该加一个检查数据是否为空的操作:
Integer iii = null; if (iii != null) { iii += 300; //NullPointerException }
Date类
创建Date对象的方式
// Date(): 分配一个Date对象,并初始化,代表它被分配的时间,精确到毫秒Date d1 = new Date();System.out.println(d1); //Mon Aug 09 17:29:55 CST 2021// Date(long date): 分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数long date = 1000*60*60;Date d2 = new Date(date);System.out.println(d2); //Thu Jan 01 09:00:00 CST 1970:时区问题,所以是9点而不是1点
Date类的常用方法
public long getTime(): 获取的是日期对象从1970年1月1日00:00:00到现在的毫秒值
//创建日期对象Date d = new Date();System.out.println(d.getTime());System.out.println(d.getTime()*1.0/1000/60/60/24/365 + "年");
public void setTime(long time): 设置时间,给的是毫秒值
System.out.println(d); //Mon Aug 09 17:36:37 CST 2021long time = System.currentTimeMillis();d.setTime(time);System.out.println(d); //Mon Aug 09 17:36:38 CST 2021
SimpleDateFormat类
SimpleDateFormat格式化和解析日期
1.格式化(从Date到String)
format(Date date): 将日期格式化成日期/时间字符串
Date d = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String s = sdf.format(d);System.out.println(s); //2021-08-09 17:42:16
2.解析(从String到Date)
parse(String source)
String ss = "2018-08-09 11:11:11";SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date dd = sdf.parse(s);System.out.println(dd); //Mon Aug 09 17:42:16 CST 2021
日期工具类
需求:定义一个日期工具类(DateUtils),包含两个方法:把日期转换为指定格式的字符串;把字符串解析为指定格式的日期,然后定义一个测试类(DateDemo),测试日期工具类的方法
DateUtils:
public class DateUtils { private DateUtils() {} public static String DateToString(Date date, String sdfString) { SimpleDateFormat sdf = new SimpleDateFormat(sdfString); String s = sdf.format(date); return s; } public static Date StringToDate(String s, String sdfString) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(sdfString); Date date = sdf.parse(s); return date; }}
DateDemo:
public class DateDemo { public static void main(String[] args) throws ParseException { Date d = new Date(); String s1 = DateUtils.DateToString(d, "yyyy-MM-dd HH:mm:ss"); String s2 = DateUtils.DateToString(d, "yyyy-MM-dd"); String s3 = DateUtils.DateToString(d, "HH:mm:ss"); System.out.println(s3); Date date = DateUtils.StringToDate(s1, "yyyy-MM-dd HH:mm:ss"); System.out.println(date); }}
Calendar类
public int get(int field): 返回给定日历字段的值
public abstract void add(int field, int amount): 根据日历的规则,将指定的时间量添加或减去给定的日历字段
public final void set(int year, int month, int date): 设置当前日历的年月日
创建对象
//获取对象Calendar c = Calendar.getInstance(); //多态的形式System.out.println(c); //java.util.GregorianCalendar[time=1628502485406,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=7,WEEK_OF_YEAR=33,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=221,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=48,SECOND=5,MILLISECOND=406,ZONE_OFFSET=28800000,DST_OFFSET=0]
add方法
需求1:三年前的今天
c.add(Calendar.YEAR, -3); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; //month是从0开始的 int date = c.get(Calendar.DATE); System.out.println(year + "年" + month + "月" + date + "日");//2018年8月9日
需求2:十年后的五天前
c.add(Calendar.YEAR, 10); c.add(Calendar.DATE, -5); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; //month是从0开始的 int date = c.get(Calendar.DATE); System.out.println(year + "年" + month + "月" + date + "日");//2031年8月4日
二月天
需求:获取任意一年的二月有多少填
思路:
1.键盘录入任意的年份
2.设置日历对象的年、月、日
年:来自于键盘的输入
月:设置为3月,月份是从0开始的,所以设置的是2
日:设置为1日
3.3月1日往前推一天,就是2月的最后一天
4.获取这一天的输出即可
Scanner sc = new Scanner(System.in);System.out.println("请输入年份:");int year = sc.nextInt(); //2008Calendar c = Calendar.getInstance();c.set(year, 2, 1);c.add(Calendar.DATE, -1);int days = c.get(Calendar.DATE);System.out.println(year + "年的二月有" + days + "天"); //2008年的二月有29天