回顾总结12
常用类
Math
常用方法
- bas:绝对值
- pow:求幂
- ceil:向上取整
- floor:向下取整
- round:四舍五入
- sqrt:开方
- random:随机数[0~1)之间
- max:最大值
- min:最小值
Arrays
常用方法
arrays类包含了一系列静态方法,用于管理或操作数组(排序和搜索)
-
toString:返回数组的字符串形式
-
sort:自然排序,默认为升序
还可以定制排序,通过传入一个接口Comparator实现匿名内部类,如果返回大于0,升序,返回小于0,降序 -
binarySearch:二分搜索法进行查找,要求有序,如果存在返回数组所在下标,如果不存在,返回-(该数据应该所在的位置下标+1)
-
copyOf(arr,newArr.length):当newArr.length > arr.length时,增加null,newArr.length < arr.length时,只拷贝前newArr.length个数据。
-
fill(arr,填充值):数组填充,把数组用给的参数填充
-
equals:数组元素一样时,返回true
-
asList:将数组转换成List
List asList = Arrays.asList(2,3,4,5,6,1);asList的编译类型是List,运行类型是Arrays下的静态内部类ArraysList
System
常用方法
-
exit:退出当前程序,0表示正常退出
-
arraycopy:复制数组元素,比较适合底层调用,一般使用Arrays.copyOf方法完成数组复制
System.arraycopy(src,0,dest,0,3); //参数1:源数组,被拷贝的 //参数2:拷贝的源数组的起始位置(索引下标) //参数3:目标数组,拷贝到 //参数4:拷贝的目标数组的起始位置(索引下标) //参数5:拷贝个数 -
currentTimeMillens:返回当前时间距离1970-1-1的毫秒数
-
gc:运行垃圾回收机制
BigInteger和BigDecimal
BigInteger
比较大的整数
BigInteger bigIntrger = new BigInteger(String s)
//s就是需要存储的数字
BigDecimal
比较大的小数
BigDecimal bigDecimal = new BigDecimal(String s)
//s就是需要存储的数字
常用方法
- add:加
- subtract:减
- multiply:乘
- divide:除
- BigDecimal的devide方法可能会抛出异常,因为无限小数。所以我们可以为它指定精度,如bigDecimal1.divide(bigDecimal2, BigDecimal.ROUND_CEILING),会保留分子的精度
日期类
Date(日期)
第一代日期类
获取当前系统时间
java.util包下
日期格式直接输出是国外的方式,所以要对格式进行转换,使用SimpleDateFormat类 ,把日期转换成相应的字符串形式输出。
SimpleDateFormat对象是用来转换日期格式的
Date d1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");//分别输出年月日,时分秒,星期
String format = sdf.format(d1);
Calendar(日历)
第二代日期类
是一个抽象类,构造器是protected的,通过getInstance方法来获取实例。主要提供大量字段和方法
为特定瞬间与一组如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(如获取下星期的日期)提供了一些方法
Calendar c = Calendar.getInstance();
c.get(Calendaer.YEAR);
c.get(Calendaer.MONTH)+1;//MONTH是从0开始计算
c.get(Calendaer.DAY_OF_MONTH);
c.get(Calendaer.HOUR);//12小时制,24小时制是HOUR_OF_DAY
c.get(Calendaer.MINURE);
c.get(Calendaer.SECOND);
Calendar没有专门的格式化类,所以需要程序员自己来组合显示
LocalDate、LocalTime、LocalDateTime
第三代日期,JDK8时加入
弥补前两代日期的不足
历史:JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类后被弃用了。Calendar存在的问题
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都是从0开始
- 格式化:格式化只对Date有用,Calendar没有
- 安全性:它们不是线程安全的,不能处理润秒等(每隔两天,多出1秒)
LocalDate(日期)
LocalDate只包含日期,可以获取日期字段(年月日)
LocalTime(时间)
LocalTime只包含时间,可以获取时间字段(时分秒)
LocalDateTime(时间日期)
LocalDateTime包含日期和时间,可以获取日期和时间字段(年月日 时分秒)
//1
LocalDateTime ldt = LocalDateTime.now();//返回当前日期时间的对象实例
ldt.getYear();
ldt.getMonth();
ldt.getMonthValue();
ldt.getDayOfMonth();
ldt.getHour();
ldt.getMinute();
ldt.getSecond();
//2
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dtf.format(ldt);
Instant时间戳
java.time.Instant类
可以和第一代的Date进行转换
类似于Date,提供了一系列和Date类转换的方式
Instant------------>Date:Date date = Date.from(instant)
Date------------>Instant:Instant instant = Date.toInstant()
//3
Instant now = Instant.now();
Date date = Date.from(now);
Instant instant = date.toInstant();
总结
第一代Date是通过new获取的日期和格式类,不安全。第二代Calendar改进,通过静态类调用getInstance方法获取日期,但是没能处理润秒等的问题,而且没有对应的格式化类。第三代LocalDate、LocalTime、LocalDateTime通过静态类调用now方法获取日期,处理了以上几代的缺陷。有格式化类DateTimeFormatter,通过静态类调用ofPattern方法进行日期的格式化操作
常用类作业
1. String_toCharArray
要求:将字符串中指定部分进行反转,比如将"abcdef"反转为"aedcbf",编写方法public static String reverse(String str, int start,int end)
思考:使用String的substring截取子串,用一个String接收,然后定义一个相同长度的新的String,进行交互数据,最后把反转过的String用StringBuffer的replace替换掉原有的数据。
优化:直接在原有的String上操作,只用生成一个新的String对象。先使用String的toCharArray把字符串转换成字符数组,然后在数组里操作。也不用新建数组进行end-start次交换,在原有数组上进行交换,能减少一半的次数。有两个变量记录开始和结束,每一次交换结束就前进一步,当差值不大于1的时候,说明交换完毕。然后新建一个String接收转换后的数组输出即可。
public static void main(String[] args) { String str1 = reverse("abcdef",1,4); System.out.println(str1.toString()); }public static String reverse(String str,int start,int end){ char[] chars = str.toCharArray(); char temp = ' '; for(;start < end;start++,end--){ temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; }}
2. 异常处理
要求:输入用户名、密码、邮箱,如果信息录入正确,则提示注册成功,否则生成对应的异常对象
- 用户名长度为2或3或4
- 密码长度为6,并且要求全是数字
- 邮箱中包含@和.符号,并且@要在.的前面
编写一个验证方法userRegister
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); do { System.out.print("请输入用户名"); String name = scanner.next(); System.out.print("请输入密码"); String pwd = scanner.next(); System.out.print("请输入邮箱"); String email = scanner.next(); try { userRegister(name,pwd,email); System.out.println("注册成功"); return; } catch (Exception e) { System.out.println(e.getMessage()); return; } }while(true);}public static void userRegister(String name ,String pwd ,String email){ //第一关 用户名 if(!(name.length() >=2 && name.length() <= 4)){ throw new RuntimeException("账户名长度要在2到4之间"); } //第二关 密码 这里出现了要判断字符是否为数字,代码太长,不便于写在这, //我们封装成一个方法,专门用来判断是不是数字,然后在这里调用它 if(!(pwd.length() == 6 && isDigital(pwd))){ throw new RuntimeException("密码必须为数字组合"); } //第三关 邮箱 int i = email.indexOf("@"); int j = email.indexOf("."); if(!(i >0 && j > i)){ throw new RuntimeException("邮箱@和.的格式不对"); }}public static boolean isDigital(String pwd){ for (int i = 0; i < pwd.length(); i++) { if(Character.isDigit(pwd.charAt(i))){ return true; } } return false;}
3. String_split
要求:输入形式为:"Willian Jefferson Clinton",输出形式为:Clinton,Willian .J
public static void main(String[] args) { printName("Willian Jefferson Clinton");}public static void printName(String str){ if(str == null){ System.out.println("不能为空"); return; } String[] names = str.split(" "); if(!(names.length == 3)){ //(names.length != 3) System.out.println("输入的字符串格式不对"); return; } //System.out.println(names[2]+","+names[0]+" ."+names[1].charAt(0)); String format = String.format("%s,%s.%c",names[2],names[0],names[1].toUpperCase().charAt(0)); System.out.println(format); }

浙公网安备 33010602011771号