java基础(七)

这次记录几个常用的类,有Arrays、Math和Data这几个。而更新内容也会越来越少,主要是后面的我也不太会….
说一下计划,之后记录内部类,泛型和容器,异常,io,多线程,java基础篇也就完结啦。当然,学编程最重要的是逻辑思维,所以少不了数据结构。为了能成为全栈工程师,前端、数据库、servlet也很重要,共勉吧。也许有人会说少了框架,那东西,只是帮助开发,会用就行。基础才最重要。

Arrays工具类

Arrays类为数组提供一些方法,还有一个单词Array,网上对它的解释为java中最基本的一个存储结构,两者还是不同的。

而Arrays里面的方法基本都是静态方法,所以可以不用new对象,直接使用。下面就介绍Arrays静态类提供常用的方法吧。

方法名 说明
sort(Object) 顺序排序,实现方法看着是归并排序
toString(Object) 返回数组元素的值
length 返回数组的长度
equals(Object) 比较两个对象的内容是否相等
binarySearch(Object, int) 二分查找该数在数组的位置
copyOf(Object, int) 复制数组的内容从0到int之间
copyOfRange(Object, int, int) 复制数组的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Arrays;						//Arrays是外部类,要先引入

public class frequentClass {
public static void main(String[] args) {

int[] a = new int []{3,4,1,7,5,9};
int[] b = {1,4,7,0,4,2,6,5};


Arrays.sort(a); //把数组a排序
System.out.println(Arrays.toString(a)); //打印 [1, 3, 4, 5, 7, 9]。如果直接写a,打印的是a的哈希地址

int c = Arrays.binarySearch(a, 4); //查找数组a,3所在的位置,该数组一定是有序数组
System.out.println(c); //打印 2
System.out.println(Arrays.binarySearch(b, 4)); //4也在数组b里,但不是有序,所以打印莫名其妙的数-7

a = Arrays.copyOf(b, 5); //把数组b从[0,5)复制给数组a
System.out.println(Arrays.toString(a)); //打印 [1, 4, 7, 0, 4]

a = Arrays.copyOfRange(b, 0, b.length); //把数组从选定的开始位置到结束位置复制给a,这里从[0,b.length)
//数组length不用打括号,String的length()才有括号

System.out.println(Arrays.toString(b)); //[1, 4, 7, 0, 4, 2, 6, 5]
System.out.println(Arrays.toString(a)); //[1, 4, 7, 0, 4, 2, 6, 5]
System.out.println(a.equals(b)); //打印 false。这里比较的是数组a和数组b的对象是否相等,要注意区别
System.out.println(Arrays.equals(a, b)); //打印 true。比较数组a和数组b的内容是否相等

}
}

Math类

数学类,提供很多数学上的计算,所以有很多,这里简要几个说明。

方法名 说明
abs(Long |int |double |float) 任意负数取正
sin(double) 三角函数的求解,还有其它,这里写一个做示范
ceil(double) 向上取整,类似于把浮点数加1再强制取整
floor(double) 向下取整,类似于把double强制转换为int型
sqrt(double) 开方 √double
pow(double,double) 求几次方,两者都是double,所以求整数的次方,可能会有精度问题,建议手写整数的次方
random(double) 求[0,1)之间的伪随机数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Math默认在java.lang包,不需要导入包名

public class frequentClass {
public static void main(String[] args) {

//Math类的两个常量
System.out.println(Math.E); //打印 2.718281828459045
System.out.println(Math.PI); //打印 3.141592653589793

System.out.println(Math.abs(-12)); //打印 12
System.out.println(Math.sin(30*Math.PI/180)); //打印 0.49999999999999994。sin30°= 1/2,精度问题
System.out.println(Math.ceil(1.2)); //打印 2.0
System.out.println(Math.floor(1.5)); //打印 1.0
System.out.println(Math.sqrt(25)); //打印 5.0
System.out.println(Math.pow(2, 4)); //打印 16.0
System.out.println(Math.random()); //打印[0,1)之间的伪随机数
System.out.println((int)(Math.random()*10+1)); //打印[1,10]之间的随机整数
}

在Math类里还有一个类,那就是BigDecimal类,进行大数运算,你可以输入超过long和double数据范围,所以它的精度也挺高,也经常用于浮点数的加减问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.math.BigDecimal;						//Math.BigDecimal类里

public class frequentClass {
public static void main(String[] args){

BigDecimal b1 = new BigDecimal("123.415"); //进行字符串的浮点输入和普通的浮点输入
System.out.println(b1);

BigDecimal b2 = new BigDecimal(123.415);
System.out.println(b2);

BigDecimal b3 = new BigDecimal("123.415");
System.out.println(b3);

System.out.println(b1.equals(b2)); //比较,在java大部分类都重写了equals方法,不再是比较对象是否相等
System.out.println(b1.equals(b3));

double d = b1.add(b3).doubleValue(); //add()进行相加,doubleValue()转化为浮点相加,因为字符串没有基本运算
System.out.println(d);

double d2 = b1.subtract(b3).doubleValue();
System.out.println(d2);
}
}

可以看得出来,BigDecimal使用的时候,如果是浮点型,一定要写成字符串的形式,否则,还是可能会出现精度问题。

Date

Date类在以前是一个很强的类,所以就被削弱了,很多方法都给了Calendar类。下面这是它的使用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.Date;

public class frequentClass {
public static void main(String[] args) {

Date d = new Date(); //新建一个Date()对象
System.out.println(d); //打印 Sun Sep 15 17:25:25 CST 2019,打印的是当前时间

System.out.println(new Date(1000)); //打印 Thu Jan 01 08:00:01 CST 1970
//设置从1970年1月1号0时0分0秒到1000毫秒的时间
//可能由于时差的问题,所以显示的是8点


System.out.println(d.getTime()); //打印 1568539525671,获取当前时间的毫秒
d.setTime(1000); //和new Date(long)一样,设置纪元时间后的1000毫秒
System.out.println(d); //打印 Thu Jan 01 08:00:01 CST 1970
System.out.println(d.before(new Date(1200))); //打印 true。1000是否在1200之前
System.out.println(d.after(new Date(1200))); //打印 false。1000是否在1200之后

Date d1 = new Date(2000);
Date d2 = new Date(1500);
System.out.println(d1.compareTo(d2)); //打印1, 如果d1比d2大,相等返回0,小于返回-1

//下面则是被废弃的方法,能用,但不建议使用
d = new Date();
System.out.println("获取年:"+(d.getYear()+1900));//获取年:2019
System.out.println("获取月:"+d.getMonth()); //获取月:8。当然现在9月,因为英语日期不是按数字的,所以也是从0开始
System.out.println("获取日:"+d.getDate()); //获取日:15
System.out.println("获取时:"+d.getHours()); //获取时:17
System.out.println("获取分:"+d.getMinutes()); //获取分:34
System.out.println("获取秒:"+d.getSeconds()); //获取秒:29
System.out.println("获取星期:"+d.getDay()); //获取星期:0。星期也是从0开始,0是星期天
}
}

Calendar

Calendar则替代了Date类废弃的方法,但,首先,我们先认识时间在java的字段表示。

YEAR MONTH WEEK_OF_YEAR WEEK_OF_MONTH DATE DAY_OF_MONTH DAY_OF_YEAR
本年的周数 本月的周数 本月的日期 本月的日期 本年的日数
DAY_OF_WEEK AM_PM HOUR HOUR_OF_DAY MINUTE SECOND MILLISECOND
星期几 早上_下午 小时(12小时制) 小时(24小时制) 分钟 秒钟 毫秒
SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY
星期天 星期一 星期二 星期三 星期四 星期五 星期六
JANUARY FEBRUARY MARCH APRIL MAY JUNE JULY
一月 二月 三月 四月 五月 六月 七月
AUGUST SEPTEMBER OCTOBER NOVEMBER DECEMBER AM PM
八月 九月 十月 十一月 十二月 上午 下午

下面是日期的获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Calendar;							//Calendar也是外部类

public class frequentClass {
public static void main(String[] args) {

Calendar c = Calendar.getInstance(); //获取当前时间
System.out.println("年:"+c.get(Calendar.YEAR));
System.out.println("月:"+c.get(Calendar.MONTH)); //月份从0开始
System.out.println("日:"+c.get(Calendar.DATE));
System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH));
System.out.println("时:"+c.get(Calendar.HOUR)); //12小时制
System.out.println("时:"+c.get(Calendar.HOUR_OF_DAY)); //24小时制
System.out.println("分:"+c.get(Calendar.MINUTE));
System.out.println("秒:"+c.get(Calendar.SECOND)); //星期日为第一天
System.out.println("星期:"+c.get(Calendar.DAY_OF_WEEK));
System.out.println("本月第几周:"+c.get(Calendar.WEEK_OF_MONTH));
System.out.println("本年第几周:"+c.get(Calendar.WEEK_OF_YEAR));
System.out.println("上午?下午?"+c.get(Calendar.AM_PM)); //上午返回0,下午返回1
}
}

下面是设置时间。

我们也要先认识日期在SimpleDateFormat类的表示格式。

y M w W D d H k K h
本年的月份 本年的周数 本月的周数 本年的天数 本月的天数 小时[0,23] 小时[1,24] 小时[0,11] 小时[1,12]
m s S a F E
分钟 毫秒 AM/PM 本月的周数 星期几

个数只是表示占的位置,比如1999年,用yyyy表示1999,yy表示99。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class frequentClass {
public static void main(String[] args) throws ParseException { //throws抛出异常
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(); //设置输出日期格式
String str = sdf.format(d); //把日期转换成字符串
System.out.println(str); //打印 19-9-15 下午6:51

str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println(str); //打印 2019-09-15 18:51:45

sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
str = "2000/1/2 3:4:5"; //输入的格式一定要与上面的一致
Date date = sdf.parse(str); //把字符串转换为日期
System.out.println(date); //打印 Sun Jan 02 03:04:05 CST 2000
}
}
谢谢您对我的支持
0%