一、工具类和常用类
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_递归打印0到9 {
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 斐波那契数列 1,1,2,3,5,8,13,21,34........ 求第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; // 自动拆箱