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);
}
}