java基础中的--------工具类和常用类+递归+包装类

一、工具类和常用类

1、Arrays类

Arrays类为数组操作的工具类,提供了大量对数组进行操作的静态方法。
(1)toString()
把数组变成字符串格式。

示例代码

int[] aa = {2,1,3,4,6};  
String str = Arrays.toString(aa);

(2)sort()排序
对数组的数据进行排序。

示例代码

int[] aa = {5,1,4,2,3};
Arrays.sort(aa); // 默认是升序排序——如何降序(需要传入比较器)
String[] ss = {"aaaxxx","bbb","abc","baa","xyz"};
Arrays.sort(ss);

(3)binarySearch(int[] a,int key)
二分法查找 查找某个值在数组的索引位置

要使用binarySearch 必须先对数组进行排序(使用sort),如果不排序,结果是不正确的。
a - 要搜索的数组
key - 要搜索的值
如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。插入点,被定义为将键插入数组的那一点:即第一个大于此键的元素索引,如果数组中的所有元素都小于指定的键,则为 a.length。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

示例代码

int[] aa = {5,1,4,2,3};
Arrays.sort(aa); 
int index = Arrays.binarySearch(aa,3);
System.out.println(index);

(4)copyof(数组,长度)数组拷贝
参数说明:
1 从哪个数据拷贝数据
2 拷贝多少个数据
返回值:
返回数组(拷贝后的数组)

示例代码

int[] aa = {1,2,3,4,5};
int[] bb = Arrays.copyOf(aa,3);
System.out.println(Arrays.toString(bb));
int[] cc = Arrays.copyOf(aa,10);
System.out.println(Arrays.toString(cc));

System类的arraycopy 同样可以完成数组的拷贝。
示例代码

int[] aa = {1,2,3,4,5,6,7,8,9};
int[] bb = new int[10];

System.arraycopy(aa, 2, bb, 4, 5); // 1源数组 2从源数组的哪个位置开始 3目标数组 4从目标数组的哪个位置开始放 5拷贝多少个数据

System.out.println(Arrays.toString(bb));

2、Date类(java.util)

java.util.Date类。
Date表示日期的“逻辑值”,而不是日期显示的样式。样式另外的类(SimpleDateFormat)来控制。

(1)常用的Date类的构造方法
1、new Date() 系统当前时间。
2、new Date(3000) 创建一个距离1970-01-01 00:00:00 3000毫秒的时间。
其他构造方法都已过时。

Date date = new Date();  //系统当前时间
System.out.println(date);

Date date2 = new Date(1000); //得到一个距离1970-1-1 00:00:00 过了1000毫秒的时间
System.out.println(date2);

示例代码
(2)Date类常用方法
getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
Date中的大部分方法都已过时,被Calendar类中的方法替代。

示例代码

long time = date.getTime(); // 获得date距离1970-1-1 00:00:00 过了多少毫秒

3、SimpleDateFormat类(java.text)

(1)作用
对时间日期进行格式化处理。
把Date对象转化为年月日时分秒格式字符串。
把字符串转化为Date对象。

(2)用法
创建SimpleDateFormat对象

SimpleDateFormat sdf = new SimpleDateFormat(“日期格式”);      
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); //HH表示24小时制

格式化
使用parse() 方法,将字符串转换成日期
使用format()方法,将日期转换成字符串

示例代码

public class DateUtil {
	private DateUtil(){}
	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	// 字符串转日期
	public static Date stringToDate(String str){
		Date date = null;
		try {
			date = sdf.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	public static String dateToString(Date date){
		return sdf.format(date);
	}
}

4、Calendar类

(1)作用
由于Date类在设计上的一些缺陷,所以Java提供了Calendar类来更好的处理时间和日期。
Calendar是一个抽象类,表示日历,不能直接实例化,通常使用getInstance() 方法来获取实例。

(2)用法
创建方式

Calendar calendar=Calendar.getInstance()

Calendar类的常用方法:
getTime() 返回Date类型时间
setTime(Date date) 设置时间到日历中
get(Calendar.YEAR/MONTH/DATE) 获取年份、月份、日
set(2015,11,11,12,11,10) 设置时间到日历中,月份从0到11
add(Calendar.YEAR/MONTH/DATE,2) 在一个日期的年,月,日上添加对应的值

示例代码

public static void main(String[] args) {
		//抽象类
	    Calendar cal = Calendar.getInstance();  // 系统当前时间
	 
	    /*  
		    Date date = cal.getTime();
		    System.out.println(date);
	    */
	    
	   /* 
	    cal.setTime(DateUtil.stringToDate("1997-07-01"));
	    System.out.println(cal.getTime());
	    */
	  /* 
	    int year = cal.get(Calendar.YEAR);   
	    int month = cal.get(Calendar.MONTH); // 月份从0开始
	    int date = cal.get(Calendar.DATE);
	    int hour = cal.get(Calendar.HOUR);
	    int minute = cal.get(Calendar.MINUTE);
	    int second = cal.get(Calendar.SECOND);
	    int day = cal.get(Calendar.DAY_OF_WEEK);  //获得的是这个星期的第几天  星期日是第一天
	    System.out.println(year+"-"+(month+1)+"-"+date+" "+hour+":"+minute+":"+second+" 星期"+(day-1));
	   */

	   /* 
	    cal.set(2017,10,20,11,11,11);
	    System.out.println(cal.getTime());
	    */

	   /* 
	    cal.add(Calendar.DATE,25);
	    System.out.println(cal.getTime());
	    
	    cal.add(Calendar.MONTH, 13);
	    System.out.println(cal.getTime());
	    */
	}

5、BigDecimal类

(1)作用
float、double两种浮点数类型运算是不够精确,不仅是Java语言,很多编程语都有这样的问题。为了能够精确表示和计算浮点数,Java提供了BigDecimal类。
(2)用法
示例代码

public static void main(String[] args) {
		
		double x = 0.1;
		double y = 0.2;
		
		BigDecimal b1 = new BigDecimal(x+"");
		BigDecimal b2 = new BigDecimal(y+"");
		BigDecimal b3 = b1.add(b2);
		
		double result1 = b3.doubleValue();
		System.out.println(result1);
		
		double result2 = b1.subtract(b2).doubleValue();
		System.out.println(result2);
		
		double result3 = b1.multiply(b2).doubleValue();
		System.out.println(result3);
		
		double result4 = b1.divide(b2).doubleValue();
		System.out.println(result4);
		
	}

6、Math类

(1)作用
Math类封装了很多数学的功能(都是静态方法和静态属性)。
(2)用法
示例代码
在这里插入图片描述

示例代码2
	public static void main(String[] args) {
		
		// 产生一个[0,1)的随机数
		double random = Math.random(); 
		System.out.println(random);
		
		//绝对值
		int abs = Math.abs(5);
		int abs2 = Math.abs(-5);       
		System.out.println(abs+"   "+abs2);
		
		//立方根
		double cbrt = Math.cbrt(27);
		System.out.println(cbrt);
		
		//平方根
		double sqrt = Math.sqrt(16);
		System.out.println(sqrt);
		
		//天花板数  大于它的最小的整数
		double ceil = Math.ceil(4.5);
		System.out.println(ceil);
		//地板数    小于它的最大的整数
		double floor = Math.floor(4.5);
		System.out.println(floor);
		
		//最大值  最小值
		int max = Math.max(10,8);
		int min = Math.min(10,8);
		
		int x = 11;
		int y = 8;
		int z = 5;
		int result = Math.max(Math.max(x, y),z);
		
		// 四舍五入取整数
		long round = Math.round(4.4);
		System.out.println(round);
	}

7、Random类

(1)作用
相对于Math的random方法只能生产 0 到 1之间的随机数,Java提供了一个功能更强大的随机数生产类 Random类。
(2)用法
常见方法
nextBoolean() 随机生产true 或false
nextDouble() 随机生产 0 到1 之间的随机浮点数
nextFloat()随机生产 0 到1 之间的随机浮点数
nextInt()随机生产整数
nextLong() 随机生产整数
nextInt(n) 随机生产 0 到 n之间的整数
全部都是左闭右开区间

示例代码

public static void main(String[] args) {
		
		Random r = new Random();
		
		boolean b =r.nextBoolean();
		System.out.println(b);
		
		double d = r.nextDouble();   //[0,1)
		System.out.println(d);
		
		int x = r.nextInt();
		System.out.println(x);
		
		int y = r.nextInt(100);
		System.out.println(y);
		
		long z = r.nextLong();
		System.out.println(z);
	}

8、System类

(1)作用
用于描述系统资源的类型,该类不用创建对象,直接使用静态变量和静态方法即可。
(2)用法
常用字段:
1、 System.in:标准输入流,默认关联到键盘上。
2、 System.out:标准输出流,默认关联到控制台上。
3、 System.err:标准错误输出流,默认关联到控制台上,用于打印错误信息,在eclipse中,使用该流打印的内容是红色。

常用方法:
gc():强制垃圾回收器回收内存中的垃圾
exit(int status):结束虚拟机
currentTimeMillis():返回当前时间的毫秒值,表示的是从1970年1月1日0时0分0秒开始到现在经历的毫秒值。1s = 1000ms

示例代码

public static void main(String[] args) {
		System.out.println("hello");
		System.err.println("HELLO");  // 红色输出,最先执行
		/*
		while(true){
		   Scanner sc = new Scanner(System.in);
		   String str = sc.nextLine();
		   if("exit".equals(str)){
			   System.exit(0);  // 退出程序
		   }
		}
		*/
		System.out.println(System.currentTimeMillis());
		System.out.println(new Date().getTime());
}

二、递归

1、递归含义

递归就是一个方法直接或者间接地调用自身。
递归是解决复杂问题的重要方法。
递归的思想就是数学上递推的思想。
把大任务降解为与之类似的规模更小的任务。

2、体会递归的思考方法

for(int i=0; i<10; i++){
   System.out.println(i);
}

递归的思想:
如果有人替我打印出0-8,
我自已打印一个9,不就完成了吗?

示例代码

public class Demo01_递归打印09 {
	
	public static void main(String[] args) {
		print0to9(9);
		
	}
	// 自己打印9  0-8交给别人
	public static void print0to9(int n){
		if(n>0){   // 满足递归的条件(退出递归的条件)
			print0to9(n-1);
		}
		System.out.println(n);
	}
}

注意事项:

在使用递归算法时,必须找到递归的出口(也就是不再递归的条件)。
递归方法中必有选择语句。
递归的层次太深了,造成调用栈的溢出。

3、方法调用栈

栈是一种先进后出的数据结构。在调用方法时,就是一个进栈和出栈的过程。
入栈和退栈
方法调用好比我们做一件事情的过程中,暂时中断,去处理更紧急的事,然后还要回到原处继续。
写作业的时候,肚子饿了。
吃东西的时候,电话铃响了。
接电话的时候,有人敲门。

栈顶的元素,就是我们当前正在处理的元素。
被压在下面的元素,是一会儿还要继续处理的元素。

4、递归案例

1 输出 int a 到 int b

public class Demo02_递归输出a到b {
	
	public static void main(String[] args) {
		
		printAtoB(10,20);
	}
	
	public static void printAtoB(int a,int b){
		if(a<b){
			printAtoB(a, b-1);
		}
		System.out.println(b);
	}
}
2 递归求阶乘
public class Demo03_递归求阶乘 {
	public static void main(String[] args) {
		int result = jiecheng(5);
		System.out.println(result);
	}
	public static int jiecheng(int n){
		if(n==1){
			return 1;
		}
		return n*jiecheng(n-1);
	}

}

3 斐波那契数列 112358132134........ 求第n个值
public class Demo04_递归_斐波那契数列 {
	// 斐波那契数列   1 1 2 3 5 8 13 21 34 55 89 ...
	public static void main(String[] args) {
		int result = fbnq(7);
		System.out.println(result);
	}
	public static int fbnq(int n){
		if(n==1 || n==2){
			return 1;
		}
		return fbnq(n-2)+fbnq(n-1);
	}
}

在这里插入图片描述

三、包装类

1、为什么会有包装类

Java语言一直宣称自己是完全面向对象的语言,但对于基本数据类型并没有做到面向对象。

int x = 100 在方法调用时,在栈内存为基本数据类型变量分配空间。

对应每个基本数据类型,都有一个对象类型与之对应,为之服务。

byte                 Byte
short                Short
int                  Integer
long                 Long
float                 Float
double               Double
char                 Character
boolean              Boolean 

示例代码

public static void printObject(Object obj){
	System.out.println(obj);
}

该方法无法传入基本数据类型参数

2、包装类的作用

包装类是基本类型与引用类型间的桥梁。

1 把基本类型转换成引用类型

格式

Integer i = new Integer(100)
Double d = new Double(3.14);

2 把引用类型还原成基本类型

格式

Double d = new Double(3.14);
double x = d.doubleValue();  还原成基本类型
Integer i = new Integer(100)
int x = i.intValue()
     

3 提供了很多有用的方法
例如:

Double类的方法和属性:
         parseDouble(String s)    把串转化为浮点数
         MAX_VALUE 属性      最大能表示的数字
  Integer类的方法:
          parseInt(String s)      把串转化为整数
          toBinaryString(int i)    转化为二进制的格式
          toHexString(int i)      转化为十六进制的格式

示例代码

System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
		
String str = "123";
int x = Integer.parseInt(str);
System.out.println(x+1);

3、自动装箱和拆箱

JDK1.5以后,提供了一个很有趣的特性:自动进行“装箱”和“拆箱”。
就是在 int — Integer 之间,double ---- Double 之间等,进行相互转换的时候,可以不显式地写出代码。Java会自动替我们完成转换。

示例代码

Double d = 3.14;  // 自动装箱
Integer ii = new Integer(15);
int n = ii;         // 自动拆箱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值