本章介绍一些常用类以及常用类中的一些常用方法,本章有Scanner类、Arrays类、包装类、Integer类、Math类、Random类、System类、BigDecimal类、Date类、SimpleDateFormat类、Calendar类
Scanner类
- 概述:用于获取用户的键盘输入
- 常用方法:
(1)构造方法Scanner(InputStream source):构造一个新的Scanner,生成指定输入流扫描的值
InputStream,字节输入流,System in:标准输入流,通常,对应键盘输入
(2)nextxxx():从键盘中录入不同类型数据,xxx代表数据类型
package org.westos.test;
import java.io.InputStream;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
//获得键盘输入的值
InputStream in = System.in;
Scanner sc1 = new Scanner(in);
//通常,获得键盘输入直接写成:
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入一个数:");
//从键盘中录入不同类型的数据(以int类型为例)
int num = sc2.nextInt();
System.out.println("录入的数是:"+num);
}
}
结果:
(3)hasNextxxx()方法:判断录入的元素是否是某个类型的元素,xxx代表数据类型
package org.westos.test;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
while(true){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数:");
if(sc.hasNextInt()){
int num = sc.nextInt();
System.out.println("录入的数是:"+num);
break;
}else{
System.out.println("录入类型不正确");
}
}
}
}
Arrays类
- 概述:是一个数组工具,包含用于操作数组(如排序和查找)的各种方法
- 常用方法:
(1)二分查找(前提是数组元素有序):binarySearch(int[] arr,int key)
package org.westos.test;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
//定义一个有序的int类型数组
int[] arr = {10,20,30,40,50,60,70};
//使用二分法查找元素,并返回对应索引
int index = Arrays.binarySearch(arr,40);
System.out.println("对应的索引是:"+index);
}
}
(2)数组排序(从小到大):sort(int[] arr)
package org.westos.test;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
//定义一个int类型数组
int[] arr = {30,50,10,40,60,44,22};
//调用sort方法对数组进行从小到大的排序
Arrays.sort(arr);
//Arrays重写了toString方法,输出的是内容
System.out.println(Arrays.toString(arr));
}
}
运行结果:
(3)对比两个数组中的元素是否一样:equals(int[] arr1,int[] arr2);
package org.westos.test;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
//定义int类型数组
int[] arr1 = {30,50,10};
int[] arr2 = {30,50,10};
int[] arr3 = {30,50,10,11};
//调用equals方法对比两数组元素是否一样
//这里Arrays重写了equals方法,令它比较的是内容
boolean b = Arrays.equals(arr1,arr2);
boolean b1 = Arrays.equals(arr1,arr3);
//两个数组元素一样,所以输出true
System.out.println(b);
//两个数组元素不一样,所以输出false
System.out.println(b1);
}
}
运行代码验证:
(4)在指定范围内替换数组元素:fill(int[] arr,int fromindex,int endindex,int num)
package org.westos.test;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
//定义int类型数组
int[] arr = {30,50,60,20,10,70,90};
//调用fill方法,替换数组元素(含头不含尾)
Arrays.fill(arr,0,2,100);
System.out.println(Arrays.toString(arr));
}
}
结果:
(5)复制数组
指定长度的数组:copyOf(int[] arr,int newlength)
指定范围的数组:copyOfRange(int[] arr,int from,int to)
package org.westos.test;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
//定义int类型数组
int[] arr = {30,50,60,20,10,70,90};
//调用copyOf复制指定长度的数组,生成一个新数组
int[] newArr1 = Arrays.copyOf(arr,4);
System.out.println(Arrays.toString(newArr1));
//调用copyOfRange方法复制指定范围的数组,生成一个新数组(含头不含尾)
int[] newArr2 = Arrays.copyOfRange(arr,2,5);
System.out.println(Arrays.toString(newArr2));
}
}
包装类
- 概述:为了对基本类型进行操作,提供了对应的类类型,主要用于基本数据类型与字符串之间的转换
- 基本类型和包装类的对应
- 自动装/拆箱(以Interger为例)
自动装箱:自动将基本类型转换成它所对应的包装类型
自动拆箱:自动将包装类型转换成它所对应的基本类型
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
//自动装箱
Integer num1 = 100;
Integer num2 = 200;
//自动拆箱
int num = num1 + num2;
//手动装箱
Integer integer = Integer.valueOf(num);
//手动拆箱
int i1 = num1.intValue();
int i2 = num2.intValue();
}
}
Integer类
- 概述:基本类型int对应的包装类型,该类提供多个方法,能在int和String类型之间转换
- Integer类的常用方法
(1)构造方法
public Integer(int value):构造一个新分配的Integer对象,表示指定的int值
public Integer(String s):构造一个新分配的Integer对象,表示String参数所指示的int值
(2)int类型的值转换成二进制,八进制,十六进制:toBinaryString(int num);toOctalString(int num);toHexString(int num);返回字符串类型
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
int num = 100;
//将100转换成二进制
String s1 = Integer.toBinaryString(num);
System.out.println(s1);
//将100转换成八进制
String s2 = Integer.toOctalString(num);
System.out.println(s2);
//将100转换成十六进制
String s3 = Integer.toHexString(num);
System.out.println(s3);
}
}
(3)equals方法,这里Integer类重写了equals方法,比较的是值
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
//==比的是地址值,这里是两个对象,所以地址值不一样
System.out.println(i1==i2);//false
//equals被重写,比的是值
System.out.println(i1.equals(i2));//true
System.out.println("---------");
Integer i3 = 127;
Integer i4 = 127;
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i3==i4);
System.out.println(i5==i6);
}
}
看看运行结果:
这里注意一下,==比较的是两者的地址值,new两个对象不用多说,地址值肯定不一样,但使用自动装箱需要注意,在给包装类对象赋值时,如果在包装类对应的基本类型一个字节范围内,第二次给包装类赋值相当于把第一次的地址值重新给它,因为方法区里有一个字节常量池,所以两者比较地址值是一样的,就比如此处int类型的一个字节范围是-128到127,所以把127给两个包装类对象,它们的地址值是一样的;当然,一个字节范围外就还是两个对象
- int和String类型的相互转换
int–>String
(1)和空串拼接
(2)转换成包装类,在调用toString方法
(3)调用valueOf方法
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
int num = 100;
//拼接空串
String s1 = num + "";
//通过包装类,调用toString方法
Integer integer = new Integer(num);
String s2 = integer.toString();
//通过valueOf方法
String s3 = String.valueOf(num);
}
}
String–>int
(1)通过包装类调用intValue方法
(2)通过调用parseInt方法
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
String str = "200";
//通过包装类调用intvalue方法
Integer integer = new Integer(str);
int num1 = integer.intValue();
//通过调用parseInt方法
int num2 = Integer.parseInt(str);
}
}
Math类
- 概述:包含用于执行基本数学运算的方法,方法都是静态的,可直接通过类名调用
- 成员变量:
public static final double E :自然底数
public static final double PI:圆周率
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
double pi = Math.PI;
System.out.println(pi);
double e = Math.E;
System.out.println(e);
}
}
3. 常用方法:
public static int abs(int a) : 取绝对值
public static double ceil(double a):向上取整
public static double floor(double a):向下取整
public static int max(int a ,int b):获取最大值
public static int min(int a ,int b):获取最小值
public static double pow(double a,double b):获取a的b次幂
public static double random():获取随机数,范围0到1
public static int round(float a):四舍五入
public static double sqrt(double a):获取正平方根
演示:
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
//取绝对值
int num1 = -1;
System.out.println(Math.abs(num1));
//向上取整
double num2 = 3.4;
System.out.println(Math.ceil(num2));
//向下取整
System.out.println(Math.floor(num2));
//四舍五入(返回整数)
System.out.println(Math.round(num2));
//获取最大值
System.out.println(Math.max(num1,num2));
//获取最小值
System.out.println(Math.min(num1,num2));
//获得a的b次幂
System.out.println(Math.pow(2,3));
//获得正平方根
System.out.println(Math.sqrt(16));
//获得随机数
System.out.println(Math.random());
}
}
运行结果:
Random类
- 概述:此类用于产生随机数
- 常用方法:
public Random():没有给定种子,产生默认随机数
public Random(long seed):给定一个long类型种子,每次产生的随机数都是相同的
public int nextInt():没有参数,随机数范围是int类型的范围
public int nextInt(int n):指定随机数范围
package org.westos.test;
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
Random random = new Random();
//不给参数,生成的就是int类型的范围
int num1 = random.nextInt();
System.out.println(num1);
//如果要获得1-100的随机数,只需修改一下参数
//参数给100,生成0-99随机数,在+1,即生成1-100随机数(含头不含尾)
int num2 = random.nextInt(100)+1;
System.out.println(num2);
//给定种子,每次生成的随机数都是一样的
Random r = new Random(1L);
int a = r.nextInt(10);
System.out.println(a);
}
}
运行两边代码:
由结果可看出,前两次没有给出种子,所以每次生成的随机数都是不一样的,而第三次给出了种子,所以每次生成的随机数都是一样的
System类
- 概述:包含一些有用的类字段和方法,不能被实例化
- 常用方法:
public static void gc():调用垃圾回收器
public static void exit(int status):退出java虚拟机,参数0为正常退出,非0为强制退出
public static long currentTimeMillis():获取当前时间的毫秒值
package org.westos.test;
public class Test2 {
public static void main(String[] args) {
//1970 01 01 00:00:00----当前系统时间的间隔的毫秒值
//1s = 1000ms
long time = System.currentTimeMillis();
System.out.println(time);
int[] arr = new int[5];
arr=null;//手动置空
//催促垃圾回收器回收垃圾,但并不是马上执行
System.gc();
System.out.println("---------");
System.out.println("---------");
//参数0,正常退出,后面的语句不执行
System.exit(0);
System.out.println("---------");
System.out.println("---------");
}
}
这里注意下,在调用gc方法时,是催促垃圾回收器回收垃圾,并不是马上执行,这里涉及JVM垃圾回收的算法,有两种,简单介绍一下:
BigDecimal类
- 概述:为了精确表示计算浮点数,因为float和double类型容易丢失精度
- 常用方法:
public BigDecimal(String val):构造方法
public BigDecimal add(BigDecimal augend):加法运算
public BigDecimal subtract(BigDecimal subtrahend):减法运算
public BigDecimal multiply(BigDecimal multiplicand):乘法运算
public BigDecimal divide(BigDecimal divisor):除法运算
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):scale小数点后面保留几位
package org.westos.test;
import java.math.BigDecimal;
public class Test2 {
public static void main(String[] args) {
//double类型除法精度不准确
double num1 = 10;
double num2 = 3;
System.out.println(num1/num2);
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
//如果不能整除,决定保留多少位,然后在规定取舍模式
//roundingMode 取舍模式,比如四舍五入
BigDecimal divide = a.divide(b,30,BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
}
}
Date类
-
概述:类Datev表示特点的瞬间,精确到毫秒
-
构造方法:
public Date()
public Date(long date):把一个long类型的毫秒值转换成一个日期对象 -
成员方法
public long getTime():获取一个日期对象对象毫秒值
public void setTime(long time):给一个日期对象设置指定的毫秒值
演示:
package org.westos.demo;
import java.util.Date;
public class MyTest {
public static void main(String[] args) {
//通过空参构造直接创建对象
Date date = new Date();
System.out.println(date);
//年份由y-1900表示
int year = date.getYear();
System.out.println(year);
//月份由0-11,0代表一月,11代表12月
int month = date.getMonth();
System.out.println(month);
//获取1970到现在的时间毫秒值,等同于System类里的currentTimeMillis方法
long time = date.getTime();
//给起始元年设置一定的时间量
date.setTime(1000*60*60);
System.out.println(date);
}
}
- Date和long类型之间的转换
Date–>long
调用getTime方法:long time = date.getTime();
long–>Date
(1)使用构造方法
(2)调用setTime方法
SimpleDateFormat类
- 概述:把一个日期对象格式化成一个字符串,也可以把一个日期字符串解析成一个日期对象
- 构造方法:
public SimpleDateFormat():使用默认的模式创建对象
public SimpleDateFormat(String pattern):使用指定的模式(例如yyyy:MM:dd HH:mm:ss)创建对象
package org.westos.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyTest {
public static void main(String[] args) {
//创建日期对象
Date date = new Date();
//日期格式化,调用format方法
SimpleDateFormat dateFormat = new SimpleDateFormat();
String format = dateFormat.format(date);
System.out.println(format);
}
}
- 成员方法:
public String format(Date date):把一个日期对象格式化成一个字符串
package org.westos.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyTest {
public static void main(String[] args) {
//创建日期对象
Date date = new Date();
//按照自己的格式,格式化日期
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E ");
String format1 = simpleDateFormat.format(date);
System.out.println(format1);
}
}
public Date parse(String dateStr):把一个日期字符串解析成一个日期对象
package org.westos.demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyTest {
public static void main(String[] args)throws ParseException {
String str = "2019年10月23日 20:40:48";
//把日期字符串转成日期类型
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = simpleDateFormat.parse(str);
System.out.println(date);
}
}
这里有个异常,在调用parse方法时会出现解析失败异常,在方法声明上抛出即可
Calendar类
- 概述:本身是一个抽象类,无法直接创建对象,通过它的静态方法getInstance方法获取它的对象,它主要是为YEAR、MONTH等日历字段提供一些方法
- 成员方法:
public static Calendar getInstance():使用默认时区和语言环境获得一个日历对象
public int get(int field):获得给定日历字段对应的值
package org.westos.demo;
import java.util.Calendar;
public class MyTest {
public static void main(String[] args) {
//调用getInstance方法获取日历
Calendar instance = Calendar.getInstance();
//获取年月日
int year = instance.get(Calendar.YEAR);
System.out.println(year);
//月份输出0-11,分别对应1-12月
int month = instance.get(Calendar.MONTH);
System.out.println(month);
int day = instance.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
}
}
除了年月日,Calendar类还有很多字段的定义,这里就不一一演示了,感兴趣可以再去写写
public void add(int field,int amount):根据日历的规则,为给力的日历字段添加或减去指定的时间量
public final void set(int year,int month,int date):设置年月日
package org.westos.demo;
import java.util.Calendar;
public class MyTest {
public static void main(String[] args) {
//调用getInstance方法获取日历
Calendar instance = Calendar.getInstance();
//设置时间量,给年份增加2年
instance.add(Calendar.YEAR,2);
int year1 = instance.get(Calendar.YEAR);
System.out.println(year1);
//再给年份减少四年,调用的是同一个方法
instance.add(Calendar.YEAR,-4);
int year2 = instance.get(Calendar.YEAR);
System.out.println(year2);
//自己设置日期
Calendar calendar1 = Calendar.getInstance();
//设置日期为2020年10月1日
//月份0-11分别代表1-12月
instance.set(2020,9,1);
//获得设置的年月日
int year = instance.get(Calendar.YEAR);
System.out.println(year);
int month = instance.get(Calendar.MONTH);
System.out.println(month);
int day = instance.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
}
}
本章介绍就到这里,常用类有很多种,每个类里的方法也有很多个,这里也仅介绍了部分,在个人的需求下,也要自己去学习类和方法的使用,这就需要我们会查API文档,根据其中的介绍自己学习