写在前面
你们好,我是小庄。很高兴能和你们一起学习Java。如果您对Java感兴趣的话可关注我的动态.
写博文是一种习惯,在这过程中能够梳理和巩固知识。
一、简介
Java的类库有很多类,而且在不断的扩展,我们不需要把每一个类都掌握,只需要学习Java的核心类即可
那么,Java的核心类有哪些呢?
类库 | 描述 |
---|---|
java.io.* | 提供了通过输出流,对象序列以及文件系统实现的系统输入、输出 |
java.lang.* | Java编程语言的基础类库 |
java.math.* | 提供了简明的整数算术以及十进制算术的基本函数 |
java.text.* | 包括以一种独立于自然语言的方式处理文本、日期、数字和消息的类和接口 |
java.time.* | 提供Java日期,时间类(java8新增的包) |
java.util.* | 包括集合类、时间处理模式、日期时间工具等各类常用的工具包 |
包名以java开始的包是Java核心包。
包名以javac开始的包是Java扩展包
二、数字相关的类
Java数字类
- 整型:Short,Int,Long
- 浮点型:Float,Double
- 大数类:BigInteger(大整数),BigDecimal(大浮点数)
- 随机数类:Random
- 工具类:Math
详细介绍:
1、整型
short ,16位,2个字节,数值范围
最小
,默认值0
int ,32位,4个字节,默认值为0
long ,64位,8个字节,数值范围
最大
,默认值0L
2、浮点型
float ,单精度,32位,4个字节,默认值为
0.0f
,f
不可省略
double ,双精度,32位,4个字节,默认值为0.0d,
d
可省略
float和double都不能表示很精确的数字
例如:
3、大数类
这是java类,而不是类型,里面是有方法的
- BigInteger ,大整数类,普通的整数类型是有范围值的,而BigInteger支持无限大的整数运算
- BigDecimal ,大浮点类,能够表示更加精确的数字
//valueOf()方法将int类型的数据转换为大数,则大数可以进行计算,int类型的数据不能直接和大数进行计算
BigInteger a=BigInteger.valueOf(20);
//BigInteger不能使用算术运算符(+和*)进行计算
//如果想对BigInteger进行加运算时,如下操作
BigInteger b=BigInteger.valueOf(10);
BigInteger c=a.add(b);//此时,b为其他的BigInteger数据,c=a+b
//如果想对BigInteger进行乘运算时,如下操作
BigInteger d=c.multiply(a);//d=c*a
提示:BigDecimal是对浮点类型进行处理,其他使用的方法和BigInteger一样
举例:BigDecimal f=BigDecimal.valueOf(3.22);
注意:使用大数时,需要导入:import java.math;这个类包
4、Random随机数
方法 | 作用 |
---|---|
nextInt() | 返回一个随机int类型数字 |
nextInt(int a) | 返回一个[0 ,a) 之间的随机int类型数字 |
nextDouble() | 返回一个[0.0 ,1.0] 之间的double类型数字 |
ints | 批量防护随机数数组 |
Math.random() | 返回一个[0.0 ,1.0] 之间的double类型数字 |
5、工具类java.lang.Math
- abs :绝对值函数
- log :对数函数
- max :最大值比较
- min :最小值比较
- pow :幂函数
- round :四舍五入函数
- floor :向下取整
- ceil :向上取整
public class MathTest{
public static void main(String[] args){
System.out.println(Math.abs(-4));//绝对值,结果为4
System.out.println(Math.max(-3,-7));//最大值,结果为-3
System.out.println(Math.min(-3,-7));//最小值,结果为-7
System.out.println(Math.pow(-4,2));//求幂,表示-4的2次方,结果为16.0
System.out.println(Math.round(2.5));//四舍五入,最后结果为3
System.out.println(Math.ceil(2.5));//向上取整,结果为3.0
System.out.println(Math.floor(2.5));//向下取整,结果为2.0
}
}
三、字符串相关的类
字符串分为不可变字符串和可变字符串
在实际业务中,我们经常会用到它们
1、不可变字符串
String :不可变,只读
方法 | 作用 |
---|---|
length() | 返回字符串的长度 |
isEmpty() | 返回字符串是否为空,如果为true,则length()为0 |
charAt(int index) | 返回 char指定索引处的值 |
compareTo(String anonter) | 按字典顺序比较两个字符串 |
concat(String str) | 将指定的字符串连接到该字符串的末尾 |
contains(CharSequence s) | 当且仅当此字符串包含指定的char值序列时才返回true |
indexOf(int ch) | 返回指定字符第一次出现的字符串内的索引 |
indexOf(int ch, int fromIndex) | 返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索 |
trim() | 返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。 |
split(String regex) | 将此字符串分割并用数组存储 |
substring(int beginIndex, int endIndex) | 从开始下标到结束下标的截取 |
public class MathTest {
public static void main(String[] args) {
String s="12;34;56;78;9";
String s2="12;45";
System.out.println(s.length());//获取长度,13
System.out.println(s.charAt(4));//从零开始,第五个位置为4
System.out.println(s.isEmpty());//不为空,返回false
System.out.println(s.compareTo(s2));//返回-1,表示前面的字符串小。返回0,说明相等。返回1,说明前面的字符串大
System.out.println(s.concat(s2));//把后面的字符串,连接到前面字符串的末尾
System.out.println(s.contains(s2));//前面字符串是否包含后面的字符串,返回flase或true
System.out.println(s.indexOf(";"));//返回第一次出现的该字符串的下标,这里返回2
System.out.println(s.indexOf("8", 2));//从下标为2开始找,找到则返回下标的值,否则返回-1
System.out.println(s.trim());//去掉字符串前后的空格,中间空格不管
String[] array=s.split(";");//字符串分割
for(String a:array) {
System.out.println(a);
}
System.out.println(s.substring(2,5));//从下标2到下标5的截取
}
}
2、可变字符串
- StringBuffer(字符串的加减,同步,性能好)
- StringBuilder(字符串的加减,不同步,性能更好)
在对字符串频繁的插入和删除操作时,一般都是用可变字符串提高性能
方法 | 作用 |
---|---|
append(String s) | 将指定的字符串附加到此字符序列 |
delete(int start, int end) | 删除此序列的子字符串中的字符 |
StringBuffer和StringBuilder都是一个类,使用要实例化才能使用
//StringBuilder使用一样,唯一不同的是同步问题,这个涉及到多线程的知识
public class MathTest {
public static void main(String[] args) {
StringBuffer s=new StringBuffer();
s.append("12");
s.append(34);
System.out.println(s);//最后输出结果是1234,会自动将int转为字符串存储
System.out.println(s.delete(0, 2));//最后输出结果是34
System.out.println(s.append("1"));//最后输出为341
}
}
四、时间相关类
时间相关类/类库有:
1、java.util.Date
包(已经废弃,不推荐使用,本篇不对该类进行讲解)
2、java.sql.Date
包(数据库时间对应的类,不常用)
3、Calendar
类(目前程序最常用,抽象类
)
4、java.time
包(java8新的API)
我们对第三第四点内容进行讲解
1、Calendar
Calendar的使用
//方式一,使用getInstance()方法进行实例化,实际上是实现了GregorianCalendar子类
Calendar ca=Calendar.getInstance();
//方式二,通过子类进行实例化,使用到简单工厂模式,暂时简单了解即可
Calendar ca=new GregorianCalendar();
Calendar的方法
方法 | 作用 |
---|---|
get(Field) | 获取时间中每个属性的值,月份是0-11,所以一般使用同时要加一操作 |
getTime() | 返回相应的Date对象 |
getTimeInMillis() | 返回自1970.1.1以来的毫秒数 |
set(Field) | 设置时间字段 |
add(field,amount) | 根据指定字段增加/减少时间 |
roll(field,amount) | 根据指定字段增加/减少时间,但不影响上一级的时间段 |
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
//实例化Calendar对象
Calendar ca=Calendar.getInstance();
//获取年
int year=ca.get(Calendar.YEAR);
//获取月,需要后面加1操作
int monday = ca.get(Calendar.MONDAY)+1;
//获取日
int date=ca.get(Calendar.DATE);
//获取时
int hour=ca.get(Calendar.HOUR);
//获取分
int minute=ca.get(Calendar.MINUTE);
//获取秒
int second=ca.get(Calendar.SECOND);
//获取Date对象,返回月 日 时:分:秒 年
System.out.println(ca.getTime());
//返回自1979.1.1以来的毫秒数
System.out.println(ca.getTimeInMillis());
//设置方法一,set(f,value)设置时间字段对应的值,f为时间字段,value为值
ca.set(Calendar.YEAR, 2022);//自定义时间为2022年
//查看设置的时间字段是否生效,此时变为2022年
System.out.println(ca.get(Calendar.YEAR));
//设置方法二,设置年月份,注意:11表示实际月份(12)-1
ca.set(2022, 11, 15);
//获取Date对象查看结果
System.out.println(ca.getTime());
//对月份加一操作,月份变化同时年份也变成了2023年
ca.add(Calendar.MONDAY, +1);
//查看结果
System.out.println(ca.getTime());
//重新设置为2022年12月15号
ca.set(2022, 11, 15);
//对月份加一操作,月份变化,而年份并没有变化。还是2022年
ca.roll(Calendar.MONDAY, +1);
//查看结果
System.out.println(ca.getTime());
}
}
Calendar小结:
1、先实例化
Calender才能使用,实例化方式有两种
2、Calendar中的add
方法调用会影响到其他字段
3、Calendar中的roll
方法只影响自身,不会影响其他字段
4、Calendar的月份字段是0-11
月,获取时需要加1操作。设置时,默认是实际月份减一
2、java.time包
java.time包的主要类
类包 | 表示内容 |
---|---|
LocalDate | 日期类 |
LocalTime | 时间类 |
LocalDateTime | LocalDate+LocalTime(日期+时间) |
Instant | 时间戳 |
LocalDate常用的方法
方法 | 作用 |
---|---|
now() | 从默认时区的系统时钟获取当前日期 :年-月-日 |
getYear() | 获取年份字段 |
getMonth() | 使用 Month枚举获取月份字段。 |
of(int year, int month, int day | 从一年,一个月和一天获得一个 LocalDate的实例 |
ofYearDay(int year, int day) | 返回这一年中的第day天的具体年月日 |
import java.time.LocalDate;
import java.time.Month;
public class LocalDate {
public static void main(String[] args) {
//当前时间,比如:2021-07-15
LocalDate today=LocalDate.now();
//根据指定时间创建LocalDate,错误时间会报异常
LocalDate firstDay=LocalDate.of(2022, Month.JANUARY, 1);
//根据年份的指定天数,返回具体年月份
LocalDate day=LocalDate.ofYearDay(2021, 100);
//获取当前年份
System.out.println(today.getYear());
//获取当前的月份
System.out.println(today.getMonth());
}
}
LocalTime常用的方法
方法 | 作用 |
---|---|
now() | 从默认时区的系统时钟获取当前的时间:时:分:秒.纳秒 |
getHour() | 获取当前小时 |
getMinute() | 获取当前分钟 |
getSecond() | 获取当前秒数 |
getNano() | 获取当前纳秒数 |
of() | 设置当前时间的时分,或者时分秒,或者时分秒纳秒 |
import java.time.LocalTime;
public class LocalTimeTest {
public static void main(String[] args) {
//当前时间,时:分:秒.纳秒
LocalTime totime=LocalTime.now();
//根据指定时间创建LocalTime,错误时间会报异常
LocalTime time=LocalTime.of(23, 23);
System.out.println(totime);
//获取当前小时
System.out.println(totime.getHour());
//获取当前分钟
System.out.println(totime.getMinute());
//获取当前秒数
System.out.println(totime.getSecond());
//获取当前纳秒
System.out.println(totime.getNano());
}
}
LocalDateTime的常用方法
方法 | 作用 |
---|---|
now() | 从默认时区的系统时钟获取当前的日期时间 |
of() | 设置当前的日期和时间 |
getDayOfMonth() | 获取当前的时间是这个月的第几天 |
getDayOfWeek() | 获取当前的时间是星期几,返回枚举类型 |
getDayOfYear() | 获得日期在这一年的第几天 |
import java.time.LocalDateTime;
public class LocalDateTimeTest{
public static void main(String[] args) {
//当前时间,时:分:秒.纳秒
LocalDateTime todatetime=LocalDateTime.now();
//根据指定时间创建LocalTime,错误时间会报异常
LocalDateTime dateTime=LocalDateTime.of(2022,04,12,23, 23);
System.out.println(todatetime);
//显示2022-04-12T23:23
System.out.println(dateTime);
//获取当前的的时间是这一年第几天
System.out.println(todatetime.getDayOfYear());
//获取当前小时
System.out.println(todatetime.getHour());
//获取当前分钟
System.out.println(todatetime.getMinute());
//获取当前秒数
System.out.println(todatetime.getSecond());
//获取当前纳秒
System.out.println(todatetime.getNano());
}
}
五、格式化类
我们格式化的讲解主要针对前面讲到的数字、字符串和时间这三个对象。
java.text包的java.text.Format的子类
NumberFormat :数字格式化,抽象类
-DecimalFormat
MessageFormat :字符串格式化
DateFormat :时间/日期格式化 抽象类
-SimpleDateFormat
java.time.format包下
DateTimeFormatter :时间/日期格式化
1、数字格式化
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class Test{
public static void main(String[] args) {
//实例化对象
NumberFormat nf=NumberFormat.getInstance();
//设置一个数字
double d=123456789.12345;
//区别:0表示有且只能有几位,如果内容没有,则用0补充
DecimalFormat df1 = new DecimalFormat("00.00");
DecimalFormat df2=new DecimalFormat("##.##");
DecimalFormat df3=new DecimalFormat("#.#%");
System.out.println(df1.format(0.006));//输出00.01
System.out.println(df2.format(0.006));//输出0.01
System.out.println(df3.format(0.0006));//输出0.1%
//设置最大小数点个数
nf.setMaximumFractionDigits(2);
System.out.println(nf.format(d));//输出123,456,789.12
}
}
小结:
0
和#
的共同点和区别
共同点:0和#都表示占位符,都采取四舍五入的方式
区别:0
表示有且只能有几位,如果内容没有,则用0补充;而#
表示最多有几位
2、字符串格式化
支持多个参数-值对位复制文本
支持变量的自定义格式
import java.text.MessageFormat;
import java.util.Date;
public class MessageTest{
public static void main(String[] args) {
//多个参数-值对位复制文本
String message="{0} {1} {2} {3}";
String[] array= {"I","love","you","!"};
//捆绑
String love=MessageFormat.format(message, array);
System.out.println(love);
//变量的自定义格式
int planet = 7;
String event = "a disturbance in the Force";
//下面的0,1,2表示第几个元素,后面的参数位置
//planet在第0位,new Date()在第1位,event则是第2位
String result = MessageFormat.format("At {1,time} on {1,date}, "
+ "there was {2} on planet {0,number,integer}.",
planet, new Date(), event);
System.out.println(result);
}
}
3、时间格式化
DateFormat的使用
方法 | 作用 |
---|---|
SimpleDateFormat(String pattern) | 设置格式化模板 |
parse() | 将字符串格式化为时间 |
format() | 将时间格式化为字符串 |
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatTest{
public static void main(String[] args){
//设置一个时间字符串
String strDate="2021-07-15 20:41:30.666";
//设置时间格式化模板
String p="yyyy-MM-dd HH:mm:ss.sss";
//实例化模板
SimpleDateFormat spdate=new SimpleDateFormat(p);
try {
//使用parse()方法,返回对象为Date
Date d = spdate.parse(strDate);
//打印结果
System.out.println(d);
//使用format()将时间对象转换为字符串
String s = spdate.format(d);
//打印结果
System.out.println(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
DateTimeFormatter的使用
方法 | 作用 |
---|---|
ofPattern(String patte) | 设置格式化模板 |
parse() | 将字符串格式化为时间 |
format() | 将时间格式化为字符串 |
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterTest{
public static void main(String[] args){
//设置一个时间字符串
String strDate="2021-07-15";
//设置时间格式化模板
DateTimeFormatter dfm=DateTimeFormatter.ofPattern("yyyy-MM-dd");
//设置模板二
DateTimeFormatter dfm2=DateTimeFormatter.ofPattern("yyyy年MM月dd日");
//使用parse格式化对象
LocalDate local=LocalDate.parse(strDate, dfm);
//打印结果
System.out.println(local);
//使用format()将时间对象转换为字符串,使用模板二
String s=local.format(dfm2);
//打印结果
System.out.println(s);
}
}
上一篇:Java异常和异常处理
下一篇:Java集合和工具类