Java中API之常用工具类Arrays,Calendar,System,Date,Math,Random

本文深入讲解Java中的Arrays、Calendar、System、Date、Math和Random类的功能及应用,包括数组操作、日期时间处理、数学运算和随机数生成等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Arrays类

 

 

(1)Arrays:针对数组操作的工具类  (提供了一些针对数组排序和二分搜索法)
   public static String toString(int[] a):可以将int类型的数组转换成字符串 ([元素1,元素2,元素3...])
   public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序
   public static int binarySearch(int[] a,int key):二分搜索法: 在int类型的数组中查找key元素的索引

//测试类
public static void main(String[] args) {
		
		//定义一个数组:静态初始化
		int[] arr = {24,69,80,57,13} ;
		
		//public static String toString(int[] a):可以将int类型的数组转换成字符串 ([元素1,元素2,元素3...])
		//直接用Arrays去调用
		String str = Arrays.toString(arr) ;
		System.out.println("str:"+str);
		//[24, 69, 80, 57, 13]
		
		System.out.println("-----------------------");
		//public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序
		Arrays.sort(arr);
		String str2 = Arrays.toString(arr) ;
		System.out.println("str2:"+str2);//[13,24,57,69,80]
		System.out.println("-----------------------");
		
		//public static int binarySearch(int[] a,int key):二分搜索法: 
		//在int类型的数组中查找key元素的索引
		//需求:查找57元素对应的索引
		Arrays.sort(arr);
		int index = Arrays.binarySearch(arr, 57) ;
		System.out.println("index:"+index);//2
		int index2 = Arrays.binarySearch(arr, 577) ;
		System.out.println("index2:"+index2);//-6
		
	}

 

 

(2)两个常用方法的源码分析 

    1)public static String toString(int[] a)     //toString(int[] a)的源码

public static String toString(int[] a) {
        if (a == null) //对数组进行非空判断
            return "null";
        int iMax = a.length - 1; //最大索引:arr.length-1   //a--->arr
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();  //创建了一个字符串缓冲区
        b.append('[');			//先追加了左中括号:[
        for (int i = 0; ; i++) {
            b.append(a[i]);		//给缓冲区中追加数组中的元素
            if (i == iMax)
                return b.append(']').toString();	//返回并且并追加了右中括号:]并且将数据元素转换字符串
            b.append(", ");	//如果不是最后一个索引,那么中间追加逗号
            
            //if(i == iMax){
            //	 return b.append(']').toString();
            //}else{
            	// b.append(", ");
            //}
        }
    }

 

[注意]以后在实际开发中,只要有引用类型,在对引用类型数据进行操作的时候,对引用类型的对象进行非空判断,防止空指针异常(NullPointerException)!

      如果遇到空指针异常,打断点,跑一下,看对象的值是否存在!

 

   2) public static int binarySearch(int[] a,int key)
    //binarySearch的源码

public static int binarySearch(int[] a, int key) {//a--->arr	key-->577
        return binarySearch0(a, 0, a.length, key);
    }
    
    /**
    	a--->arr:指定的int类型的数组
    	fromIndex:指定索引开始:0
    	toIndex:arr.length 5 
    	key:577
    */
    	nt[] arr = {13,24,57,69,80} ;
     private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                     int key) {
        int low = fromIndex;     //最小索引
        int high = toIndex - 1;//  最大索引  4

        while (low <= high) { //如果最小索引小于=最大索引  
            int mid = (low + high) >>> 1;  >>> :无符号右移动(位运算符)    //中间索引:mid = 2 ,3 ,4 
            								位^:位异或
            								位&:位与
            								位|:位或
            								<< :左移动
            								有符合的数据表示法(原码,反码,补码)
            								计算机底层运算数据的时候:通过补码进行运算的
            int midVal = a[mid];		//	查找中间索引对应的元素:arr[2] = 57   69  80 

            if (midVal < key)			//判断:中间索引对应的元素 < key =577
                low = mid + 1;		//low = mid + 1;   mid = (取到最大的mid的值) 4+1 = 5 
            else if (midVal > key)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.    // return  -(low+1) = -6
    }

2.Calendar类:日历类

 

 

(1)Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法

(2)是一个抽象类,如何实例化?
    public static Calendar getInstance() :通过一个静态功能来创建日历对象

 

   举例:通过日历类获取当前系统时间

public static void main(String[] args) {
		
		//创建日历类的对象
		//Calendar rightNow = new Calendar() ; 不能实例化
		Calendar rightNow = Calendar.getInstance() ;
		
		//public int get(int field)返回给定日历字段的值
		//获取年:public static final int YEAR		
		int year = rightNow.get(Calendar.YEAR) ;
		
		//获取年中的月份:public static final int MONTH
		int month = rightNow.get(Calendar.MONTH) ;
		
		//public static final int DATE :获取月份的那一天
		int date = rightNow.get(Calendar.DATE) ;
		
		
		System.out.println(year+"年"+(month+1)+"月"+date+"日"); //通过日历类获取当前系统时间
	}

 

(3)Calendar中的两个常用方法:
 public abstract void add(int field,int amount)根据日历的规则,为给定的日历字段添加或减去指定的时间量
 (这个方法常用)
 public final void set(int year, int month,int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值

 

 [需求]获取任意一年的二月有多少天  (改进:键盘录入一个年份)

分析:
 * 1)键盘录入任意一个年份
 * 2)创建日历类对象
 * 3)设置年月日
 *  set(录入year,2,1) ; //实际是3月1日
 * 4)再利用add(int field,int amount) : 在这里只需要将日期往前退一天即可

 

public static void main(String[] args) {
		
		//创建键盘入对象
		Scanner sc = new Scanner(System.in) ;
		
		//录入数据
		System.out.println("请输入一个年份:");
		int year = sc.nextInt() ;
		
		//创建日历类对象
		Calendar c = Calendar.getInstance() ;
		//设置年月日
		c.set(year, 2, 1); //实际3月1日
		//只需要将日期往前推一天即可
		c.add(Calendar.DATE, -1);
		
		System.out.println("二月有:"+c.get(Calendar.DATE)+"天");
	}

3.System类

 

 

(1)System 类包含一些有用的类字段和方法。它不能被实例化。

(2)常用的方法:
   public static void gc()运行垃圾回收器。
   

public static void main(String[] args) {
		
		//创建一个Person类的对象
		Person p = new Person("高圆圆", 27) ;
		System.out.println(p);
		
		//让p对象不指定堆内存了
		p = null ;
		System.gc(); //运行垃圾回收器,实质是执行的finalize()方法
	}

[注意]

 1)运行垃圾回收器,实质是执行的Person类中的finalize()方法

@Override
	protected void finalize() throws Throwable {
		System.out.println("开始回收不用的对象了:"+this);
		super.finalize();
	}

2)[面试题]final,finally,finalize的区别?

final 可以修饰类,该类不能被继承;可以修饰变量,该变量是常量;可以修饰成员方法,该方法不能被重写!

finalize :gc():运行垃圾回收器,实际是调用finalize()方法,和垃圾回收器有关系

finally :在io,数据库中以及后面对数据库操作里面释放资源的.finally中的代码,只有在一种情况下不会执行,就是在执行finally语句之前,jvm退出了

 

public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;  一般情况,需要终止 Jvm,那么参数0

public static void main(String[] args) {
		System.out.println("我们喜欢高圆圆....");
		//public static void exit(int status)
		
		//System.exit(0); //jvm已经退出了
		System.out.println("我们也喜欢杨桃....");//我们喜欢高圆圆....
	}

public static long currentTimeMillis()返回以毫秒为单位的当前时间

//public static long currentTimeMillis()返回以毫秒为单位的当前时间
		long time = System.currentTimeMillis() ;
		System.out.println("tiem:"+time);
		
		//单独使用,没有意义
		//一般情况,来测试一段代码的执行效率  (后面:jdbc: PreparedStatement  Statement 也可以用currentTimeMillis来测试速率 )
		
		long start = System.currentTimeMillis() ;
		
		for(int x =0 ; x < 1000; x ++) {
			System.out.println("hello"+x);
		}
		
		long end = System.currentTimeMillis() ;
		
		System.out.println("共耗时:"+(end-start)+"毫秒");

public static void arraycopy(Object src,int srcPos, Object dest,int destPos, int length):从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束

    src:原数组
    dest:目标数组
    srcPos :从原数组的哪个位置开始
    destPos:到目标数组的哪个位置结束
    length:长度

                int[] arr1 = {11,22,33,44,55,66} ;
		int[] arr2 = {5,6,7,8,9,10} ;
		
		System.out.println(Arrays.toString(arr1));
		System.out.println(Arrays.toString(arr2));
		System.out.println("---------------------------");
		
		System.arraycopy(arr1, 1, arr2, 2, 2);
		
		System.out.println(Arrays.toString(arr1));//[11,22,33,44,55,66]
		System.out.println(Arrays.toString(arr2));//[5,6,22,33,9,10]

 

4.Date类

 

 

(1) java.util.Date:类 Date 表示特定的瞬间,精确到毫秒
(2)构造方法:
    public Date()表示分配它的时间(精确到毫秒)。
    public Date(long date):创建一个日期对象,指定毫秒值   (需要将long 时间毫秒值转换成Date对象)
 
   public void setTime(long time):设置毫秒值

 常用方法:
   public long getTime() :将Date--->long的毫秒值

(3)[重点]Date的日期格式和日期的文本格式:String类型 之间进行转换

   1)Date---->String(格式化)  
      String-->Date(解析)

   2)中间的转换:使用一个中间类:DateFormat,并且DateFormat是一个抽象类,抽象意味着不能实例化,所以应该考虑用它的子类:
   SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
  
   SimpelDateFormat的构造方法:
   public SimpleDateFormat(String pattern) :构造一个SimpleDateFormat对象,根据pattern(模式:规则)
  
    SimpleDateFormat sdf = new SimpleDateFormat("xxx年xx月xx日") ;

  3)日期和时间模式
  
     年:   yyyy
     月:   MM
     日:   dd
   
     时:   hh
     分:   mm
     秒:   ss

//Date---String:(格式化)
		//创建一个日期对象
		Date d = new Date() ;
		//创建SimpleDateFormat类对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");
		//public final String format(Date date):格式化
		String str = sdf.format(d) ;
		System.out.println("str:"+str);
//String:日期文本格式:---->Date:日期格式
		//public Date parse(String source):解析
		String strDate = "2018-6-25" ;
		//创建SimpleDateFormat类对象
		//SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日") ;
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd") ;
		//注意 :simpleDateFormat在解析文本格式的时候,里面 模式(规则)一定要和文本格式的模式一直,否则就出现PareseException
		Date dd = sdf2.parse(strDate) ;
		System.out.println("dd:"+dd);//dd:Mon Jun 25 00:00:00 CST 2018

(4)[案例]键盘录入你的出生年月日,算一下你来到这个世界多少天?
分析:
 *  1)创建键盘录入对象,录入一个数据出生年月日
 *  2)1990-xx-xx
 *  3)将文本格式的数据解析成日期对象
 *  4)getTime() ; 获取出生所在日期的时间毫秒值
 *  5)获取当前系统时间毫秒值
 *  6) 5)-4) =  long time
 *  7)换算

public static void main(String[] args) throws ParseException {
	    //创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//录入数据
		System.out.println("请输入您的出生年月日:");
		String str = sc.nextLine() ; //yyyy-MM-dd
		
		//创建SimpleDateFormat对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
		Date date = sdf.parse(str) ;
		
		//获取出生年月所在的系统时间
		long oldTime = date.getTime() ;
		
		//在获取当前系统时间的毫秒值
		long newTime = System.currentTimeMillis() ;
		
		long time = newTime - oldTime ;
		
		long day = time/1000 /60 /60 /24 ;
		System.out.println("您来到世间已经有:"+day+"天");
	}


5.Math类

 

 

 

(1)Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 

(2)常用的方法:
   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()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0
   public static int round(float a):四射五入
   public static double sqrt(double a):一个数的正平方根

 

测试上述方法:

public static void main(String[] args) {
		
//		public static int abs(int a):绝对值
		System.out.println(Math.abs(-10));
		System.out.println(Math.abs(10));
		
		//public static double ceil(double a):向上取整
		System.out.println(Math.ceil(12.34));
		
		//public static double floor(double a):向下取整
		System.out.println(Math.floor(12.34));
		
		//public static int max(int a,int b):求最大值
		System.out.println(Math.max(10, 20));
		//方法中嵌套方法
		
		//方法递归(方法本身调用方法的这种现象)
		System.out.println(Math.max(Math.max(10, 20), 20));
		
		//public static double pow(double a,double b):a的b次幂
		System.out.println(Math.pow(2.0, 3.0));
		
		
		//public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0
		System.out.println(Math.random());
		
		//public static int round(float a):四射五入
		System.out.println(Math.round(12.56));
		
//		public static double sqrt(double a):一个数的正平方根
		System.out.println(Math.sqrt(4));
	}	

 

(3)[面试题]有两个变量,让他们的值进行互换 (考官想问的是:你能否指定位^的特点)

   int a = 10 ;
   int b = 20 ;

[分析]

  实际开发中:中间变量的方式进行互换  
  位^的特点:一个数据被另一个数据位^两次,其值是它本身

 

                //=号左边: a ,b,a
		//=右边: a^b
		a = a ^ b ; 
		b = a ^ b ;//b = a^b ^ b
		a = a ^ b ; 
		
		System.out.println("a:"+a+",b:"+b);

6.Random类

 

 

 

(1)Random:是一个可以获取随机数的类
(2)public Random():无参构造方法

    public Random(long seed) :指定long类型的数据进行构造随机数类对象
 
   public int nextInt():获取随机数,它的范围是在int类型范围之内
   public int nextInt(int n):获取随机数,它的范围是在[0,n)之间

 

public static void main(String[] args) {
		
		//创建Random类对象
		Random r = new Random() ;
		
		for(int x = 0 ; x < 10 ; x ++) {
			int n = r.nextInt(5) ;
			System.out.println(n);
		}	
		
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值