一、简介
Java 类库提供了不少常用类,可以在编程中直接调用使用。本节讲重点讲解 Arrays、StringBuilder、Calendar、Date、Math、System、Random 类以及类的常用方法。
知识点
- Arrays
- StringBuilder
- Calendar
- Date
- Math
- System
- Random
二、Arrays
Arrays 类包含用于操作数组的各种方法(例如排序和搜索)。还包含一个静态工厂,允许将数组转为 List。
Arrays 常用方法
一些对数组的操作
import java.util.Arrays;
import java.util.Random;
public class ArraysDemo{
public static void main(String[] args){
int [] arr = new int[10];
//将数组元素都设为9
Arrays.fill(arr,9);
System.out.println("fill:" + Arrays.toString(arr));
Random random = new Random();
for(int i = 0; i < arr.length; i++){
//使用100以内的随机数复制数组
arr[i] = random.nextInt(101);
}
//重新赋值后的数组
System.out.println("重新赋值: "+ Arrays.toString(arr));
//将索引为5的元素设为50
arr[5] = 50;
//排序
Arrays.sort(arr);
//排序后的数组
System.out.println("排序后: "+Arrays.toString(arr));
//查找50的位置
int i = Arrays.binarySearch(arr,50);
System.out.println("值为50的元素索引"+i);
//复制一份新数组
int [] newArr = Arrays.copyOf(arr,arr.length);
//比较
System.out.println("equals:"+Arrays.equals(arr,newArr));
}
}
练习
练习题
你需要完成以下需求:
- 使用 Arrays 将数组 [6, 17, 92, 32, 58, 22, 84, 66, 36, 33] 进行排序。
- 找出排序后 33 所在的位置。
- 测试一下如果不排序能否找到值 33?
import java.util.Arrays;
public class ArraysTest{
public static void main(String[] args){
int[] arr = {6,17,92,32,58,22,84,66,36,33};
// int ii_33 = Arrays.binarySearch(arr,33);
// System.out.println("33的位置ghjg: "+ii_33);
System.out.println("排序qian的数组: "+Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序后的数组: "+Arrays.toString(arr));
int i_33 = Arrays.binarySearch(arr,33);
System.out.println("33的位置: "+i_33);
}
}
StringBuilder
StringBuilder 类是可变的。它是 String 的对等类,它可以增加和编写字符的可变序列,并且能够将字符插入到字符串中间或附加到字符串末尾(当然是不用创建其他对象的)。
StringBuilder 的构造方法:
StringBuilder 类的常用方法:
StringBuilder代码练习
public class StringBuilderTest{
public static void main(String[] args){
//定和初始化一个StringBuilder类的字串s
StringBuilder s = new StringBuilder("I");
//在s后面添加字串“java”
s.append(" java");
//在s[1]的位置插入字串
s.insert(1," love");
String t = s.toString(); //转为字符串
System.out.println(t);
}
}
在这里只介绍了 StringBuilder 类常用的方法,其他方法可参照 JDK 文档。
Calendar
在早期的 JDK 版本中,Date 类附有两大功能:
1、允许用年、月、日、时、分、秒来解释日期。
2、允许对表示日期的字符串进行格式化和句法分析。
在 JDK1.1 中提供了类 Calendar 来完成第一种功能,类 DateFormat 来完成第二项功能。DateFormat 是 java.text 包中的一个类。与 Date 类有所不同的是,DateFormat 类可以接受用各种语言和不同习惯表示的日期字符串。
但是 Calendar 类是一个抽象类,它完成 Date 类与普通日期表示法之间的转换,而我们更多的是使用 Calendar 类的子类 GregorianCalendar 类。它实现了世界上普遍使用的公历系统。当然我们也可以继承 Calendar 类,然后自己定义实现日历方法。
先来看一看 GregorianCalendar 类的构造函数:
TimeZone 是 java.util 包中的一个类,其中封装了有关时区的信息。每一个时区对应一组 ID。类 TimeZone 提供了一些方法完成时区与对应 ID 两者之间的转换。
例如:
//太平洋时区的 ID 为 PST
TimeZone tz0 = TimeZone.getTimeZone("PST")
//getDefault()可以获取主机所处时区的对象
TimeZone tz1 = TimeZone.getDefault()
Locale 只是一种机制,它用来标识一个特定的地理、政治或文化区域获取一个 Locale 对象的构造方法:
//调用Locale类的构造方法
Locale l0 = new Locale(String language)
Locale l1 = new Locale(String language, String country)
Locale l2 = new Locale(String languge, String country, String variant)
//调用Locale类中定义的常量
Locale l1 = Locale.CHINA
时间函数的练习
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo{
public static void main(String[] args){
System.out.println("完整显示日期时间: ");
//字符串转日期格式
DateFormat fdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = fdate.format(new Date());
System.out.println(str);
//创建Calendar对象
Calendar calendar = Calendar.getInstance();
//初始化Calendar对象,但并不必要,除非需要重置时间
calendar.setTime(new Date());
//显示年份
System.out.println("年: "+calendar.get(Calendar.YEAR));
//显示月份
System.out.println("月:"+calendar.get(Calendar.MONTH));
//当前分钟数
System.out.println("分钟:"+calendar.get(Calendar.MINUTE));
//今年的第N天
System.out.println("今年的第 "+ calendar.get(Calendar.DAY_OF_YEAR)+"天");
//本月的第N天
System.out.println("本月的第 "+ calendar.get(Calendar.DAY_OF_MONTH)+"天");
//3小时以后
calendar.add(Calendar.HOUR_OF_DAY, 3);
System.out.println("三小时以后的时间 "+ calendar.getTime());
//格式化显示
str = (new SimpleDateFormat("yyyy_MM_dd HH:mm:ss:SS")).format(calendar.getTime());
System.out.println(str);
//重置Calendar 显示当前时间
calendar.setTime(new Date());
str = (new SimpleDateFormat("yyyy_MM_dd HH:mm:ss;SS")).format(calendar.getTime());
//创建一个calendar用于比较时间
Calendar calendarNew = Calendar.getInstance();
//设定为5小时以前,后者大,显示-1
calendarNew.add(Calendar.HOUR, -5);
System.out.println("时间比较: "+calendarNew.compareTo(calendar));
//设定7小时以后,前者大,显示1
calendarNew.add(Calendar.HOUR, +7);
System.out.println("时间比较: "+calendarNew.compareTo(calendar));
//退回2小时,时间相同,显示0
calendarNew.add(Calendar.HOUR,-2);
System.out.println("时间比较: "+calendarNew.compareTo(calendar));
//calendarNew创建时间点
System.out.println((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime()));
// calendar创建时间点
System.out.println((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime()));
System.out.println("时间比较:" + calendarNew.compareTo(calendar));
}
}
Date
Date 类表示日期和时间,里面封装了操作日期和时间的方法。Date 类经常用来获取系统当前时间。
来看看类 Date 中定义的未过时的构造方法:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
String strDate, strTime;
Date objDate = new Date();
System.out.println("今天的日期是:" + objDate);
long time = objDate.getTime();
System.out.println("自1970年1月1日起以毫秒为单位的时间(GMT):" + time);
strDate = objDate.toString();
//提取 GMT 时间
strTime = strDate.substring(11, (strDate.length() - 4));
//按小时、分钟和秒提取时间
strTime = "时间:" + strTime.substring(0, 8);
System.out.println(strTime);
//格式化时间
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(formatter.format(objDate));
}
}
Math
Math
类在 java.lang
包中,包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
public class MathDemo {
public static void main(String[] args) {
System.out.println(Math.abs(-12.7));
System.out.println(Math.ceil(12.7));
System.out.println(Math.rint(12.4));
System.out.println(Math.random());
System.out.println("sin30 = " + Math.sin(Math.PI / 6));
// 计算30°的正弦值,参数是用弧度表示的角,即π的六分之一
System.out.println("cos30 = " + Math.cos(Math.PI / 6));
// 计算30°的余弦值,这些计算三角函数的方法,其参数和返回值的类型都为double
System.out.println("tan30 = " + Math.tan(Math.PI / 6));
// 计算30°的正切值
}
}
你需要完成以下需求:
- 使用 Math.random() 生成两个随机数 a 和 b。
- 求出两个随机数中的较大值。
- 只能使用 Math 类中的方法。
public class MathTest{
public static void main(String[] args){
double a = Math.random();
double b = Math.random();
System.out.println("a: "+a+","+"b "+b);
System.out.println("最大的是" +Math.max(a,b));
}
}
System
System 类提供了以下功能:
- 标准输入,标准输出和错误输出流;
- 访问外部定义的属性和环境变量;
- 加载文件和库的方法;
- 以及用于快速复制数组的实用方法。
System 不可以被实例化,只可以使用其静态方法。
//从指定的源数组中复制一个数组,从源数组指定的位置开始,到目标数组指定的位置
public static void arraycopy(Object src,int srcPos, Object dest,int desPos,int length)
//返回以毫秒为单位的当前时间(从1970年到现在的毫秒数)
public static long currentTimeMillis()
//终止当前正在运行的Java虚拟机,status为 0时退出
public static void exit(int status)
// 运行垃圾收集器
public static void gc()
// 取得当前系统的全部属性
public static Properties getProperties()
//获取指定键的系统属性
public static String getProperty(String key)
代码实战
import java.util.Arrays;
public class SystemDemo{
public static void main(String[] args){
int[] a = {7, 8, 9, 10, 11};
int[] b = {1, 2, 3, 4, 5, 6};
//从数组a的第二个元素开始,复制到b数组的第三个位置,复制的元素长度为3
System.arraycopy(a, 1 , b, 2, 3);
//输出结果
System.out.println(Arrays.toString(b));
System.out.println("当前时间:"+System.currentTimeMillis());
System.out.println("java版本信息:"+System.getProperty("java.version"));
//运行垃圾收集器
System.gc();
//退出
System.exit(0);
}
}
你需要完成以下需求:
- 获取 Java 的安装目录 (java.home)。
- 练习 System.arraycopy 方法(自己随便复制两个数组)。
import java.util.Arrays;
public class SystemTest{
public static void main(String[] args){
int[] a = {7, 8, 9, 10, 11};
int[] b = {1, 2, 3, 4, 5, 6};
//从数组a的第二个元素开始,复制到b数组的第三个位置,复制的元素长度为3
System.arraycopy(a, 1 , b, 2, 3);
//输出结果
System.out.println(Arrays.toString(b));
System.out.println("当前时间:"+System.currentTimeMillis());
System.out.println("java安装目录:"+System.getProperty("java.home"));
//运行垃圾收集器
System.gc();
//退出
System.exit(0);
}
}
Random
import java.util.Random;
public class RandomDemo{
public static void main(String[] args){
Random random = new Random();
//随机生成一个整数int范围
System.out.println(random.nextInt());
//生成[0,n]范围的整数 设n=100
System.out.println(random.nextInt(100 + 1));
//生成[0,n]范围的整数 设n=100
System.out.println(random.nextInt(100));
//生成 [m,n] 范围的整数 设n=100 m=40
System.out.println((random.nextInt(100 - 40 + 1) + 40));
//随机生成一个整数 long范围
System.out.println(random.nextLong());
//生成[0,1.0)范围的float型小数
System.out.println(random.nextFloat());
//生成[0,1.0)范围的double型小数
System.out.println(random.nextDouble());
}
}
练习:
- 从控制台中获取 Int 数据 m,n (m < n),先输入 m,后输入 n。
- 输出一个 [m,n] 之间的随机数。
import java.util.Random;
import java.util.Scanner;
public class RandomTest{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
Random random = new Random();
int m,n;
System.out.println("输入:");
m = in.nextInt();
n = in.nextInt();
System.out.println("输出: ");
System.out.println((random.nextInt(n - m + 1) + m));
}
}