Java(11)Java常用类——字符串类、日期时间API、比较器、System类、Math类、BigInteger与BigDecimal
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java(11)Java常用类——字符串类、日期时间API、比较器、System类、Math类、BigInteger与BigDecimal,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含15374字,纯文字阅读大概需要22分钟。
内容图文
![Java(11)Java常用类——字符串类、日期时间API、比较器、System类、Math类、BigInteger与BigDecimal](/upload/InfoBanner/zyjiaocheng/606/c21bab21e6b64a30bf828a92c8f5ae5b.jpg)
标题
字符串类
String类
String类代表字符串:
- String类声明为final,所以不可被继承;
- String内部定义了final char[] value用于存储字符串数据,所以String类具有不可变性;
- 对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值;
- 字符串进行连接操作时,需重新指定内存区域赋值,不能使用原有的value进行赋值;
- 调用String的replace()方法修改指定字符或字符串时,需重新指定内存区域赋值,不能使用原有的value进行赋值;
- 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中;
- 字符串常量池中不会存储相同内容的字符串;
String类的实例创建有两种方式:
- 通过字面量定义的方式和通过new 构造器的方式;
- 通过字面量定义的方式创建的字符串存储在方法区中的字符串常量池中;
- 通过new 构造器的方式创建的字符串存储在堆空间中;
创建方式示例:
String str = "hello"; //字面量定义
String s1 = new String(); //this.value = new char[0];
String s2 = new String(String original); //this.value = original.value;
//this.value = Arrays.copyOf(value, value.length);
String s3 = new String(char[] a); //this.value = Arrays.copyOf(value, value.length);
String s4 = new String(char[] a,int startIndex,int count); //...
字符串拼接相关:
- 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量;
- 拼接的String对象只要有一个是变量,拼接结果就在堆中;
- 指向堆中String对象的引用变量,调用intern()方法,返回值为指向常量池的String常量的引用;
示例:
String ss1 = "a";
String ss2 = new String("a").intern();
String ss3 = "b";
String ss4 = "ab";
String ss5 = "a"+"b";
String ss6 = ss1+"b";
String ss7 = (ss1+"b").intern();
System.out.println(ss1==ss2); //true
System.out.println(ss4==ss5); //true
System.out.println(ss4==ss6); //false
System.out.println(ss4==ss7); //true
String类的方法:
- int length():返回字符串的长度: return value.length;
- char charAt(int index): 返回某索引处的字符return value[index];
- boolean isEmpty():判断是否是空字符串:return value.length == 0;
- String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写;
- String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写;
- String trim():返回字符串的副本,忽略前导空白和尾部空白;
- boolean equals(Object obj):比较字符串的内容是否相同;
- boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写;
- String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”;
- int compareTo(String anotherString):比较两个字符串的大小;
- String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串;
- String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串;
- boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束;
- boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始;
- boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始;
- boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true;
- int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引;
- int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始;
- int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引;
- int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索;
- String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的;
- String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串;
- String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串;
- String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串;
- 匹配:boolean matches(String regex):告知此字符串是否匹配给定的正则表达式;
- 切片:String[] split(String regex):根据给定正则表达式的匹配拆分此字符串;
- String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
StringBuffer类
- java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删,不会产生新的对象,这种类是可变的;
- StringBuffer对象须由构造器创建——StringBuffer():初始容量为16的字符串缓冲区、StringBuffer(int size):构造指定容量的字符串缓冲区、StringBuffer(String str):将内容初始化为指定字符串内容;
- 扩容问题:如果要添加的数据底层数组盛不下,需要扩容底层的数组,默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中;
代码示例:
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组。
System.out.println(sb1.length());//0
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];
StringBuffer类常用方法:
- 增:append(xxx)
- 删:delete(int start,int end)
- 改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
- 查:charAt(int n )
- 插:insert(int offset, xxx)
- 长度:length();
- 遍历:for() + charAt() / toString()
StringBuilder类
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样。
对比String、StringBuffer、StringBuilder:
- String:不可变的字符序列;
- StringBuffer:可变的字符序列;线程安全的,效率低;
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;
- 相同点:底层都用char[] value数组存储字符;
- 三者效率从高到低排列:StringBuilder > StringBuffer > String;
日期时间API
System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
@Test
public void test1(){
long time = System.currentTimeMillis();
System.out.println(time);
}
java.util.Date类
java.util.Date类表示特定的瞬间,精确到毫秒。
创建Date类的对象:
- Date():使用无参构造器创建的对象可以获取本地当前时间;
- Date(long date);
Date类常用方法:
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数;
- toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy
其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准;
代码示例:
@Test
public void test2(){
Date date1 = new Date();
Date date2 = new Date(1612837876193L);
System.out.println(date1.getTime());//1612838707957
System.out.println(date1.toString());//Tue Feb 09 10:45:07 CST 2021
System.out.println(date2.getTime());//1612837876193
System.out.println(date2.toString());//Tue Feb 09 10:31:16 CST 2021
}
java.sql.Date类
java.sql.Date对应着数据库中的日期类型的变量,该类继承于java.util.Date类。
该类的使用与java.util.Date对象转换为java.sql.Date对象代码如下:
@Test
public void test3(){
java.sql.Date date1 = new java.sql.Date(1612837876193L);
System.out.println(date1.getTime());
System.out.println(date1.toString());
//先向上转型再向下转型
Date date2 = new java.sql.Date(1612837876193L);
java.sql.Date date3 = (java.sql.Date)date2;
//调用方法返回值传参
Date date4 = new Date();
java.sql.Date date5 = new java.sql.Date(date4.getTime());
}
java.text.SimpleDateFormat类
java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
格式化:
- SimpleDateFormat() :默认的模式和语言环境创建对象;
- public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用public String format(Date date):方法格式化时间对象date;
解析:
- public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
格式:
代码示例;
@Test
public void test4(){
//格式化
Date date1 = new Date();
SimpleDateFormat slf1 = new SimpleDateFormat();
SimpleDateFormat slf2 = new SimpleDateFormat("yyyy年MMM月dd日 EE HH时mm分");
System.out.println(slf1.format(date1));
System.out.println(slf2.format(date1));
//解析
try {
Date date2 = slf1.parse("21-2-9 上午11:45");
Date date3 = slf2.parse("2021年二月月09日 星期二 11时45分");
System.out.println("测试:"+date2.equals(date3));
Date date4 = slf1.parse("2021年02月09日 星期二 11时28分17秒");
} catch (ParseException e) {
e.printStackTrace();
}
}
java.util.Calendar类
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
创建对象:
- 创建其子类(GregorianCalendar)的对象;
- 调用其静态方法getInstance();
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass());
相关方法:
- 获取月份时:一月是0,二月是1,12月是11;
- 获取星期时:周日是1,周二是2 , 周六是7;
public void test5_get(Calendar...calendars) {
int get1 = calendars[0].get(Calendar.DAY_OF_MONTH);
int get2 = calendars[1].get(Calendar.DAY_OF_MONTH);
int get3 = calendars[2].get(Calendar.DAY_OF_MONTH);
System.out.println(get1 + "------" + get2 + "------" + get3);
}
public void test5_set(Calendar...calendars) {
calendars[0].set(Calendar.DAY_OF_MONTH,10);
calendars[1].set(Calendar.DAY_OF_MONTH,11);
calendars[2].set(Calendar.DAY_OF_MONTH,12);
}
public void test5_add(Calendar...calendars) {
calendars[0].add(Calendar.DAY_OF_MONTH,21);
calendars[1].add(Calendar.DAY_OF_MONTH,-7);
calendars[2].add(Calendar.DAY_OF_MONTH,-30);
}
@Test
public void test5(){
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = new GregorianCalendar();
GregorianCalendar calendar3 = new GregorianCalendar();
Calendar[] calendars = new Calendar[]{calendar1,calendar2,calendar3};
//get()方法测试
test5_get(calendars);
//set()方法测试
test5_set(calendars);
test5_get(calendars);
//add()方法测试
test5_add(calendars);
test5_get(calendars);
//getTime()方法测试,日历类---> Date
Calendar calendarr = new GregorianCalendar();
Date date = calendarr.getTime();
System.out.println(date.toString());
//setTime()方法测试,Date ---> 日历类
Date datee = new Date();
calendarr.setTime(datee);
System.out.println(calendarr.get(Calendar.DAY_OF_MONTH));
}
代码运行结果为:
新时间日期API
Date类与Calendar子类使用的局限性:
- 可变性:日期和时间这样的类应该是不可变的;
- 偏移性:Date中的年份是从1900开始的,月份都从0开始;
- 格式化:格式化只对Date有用,Calendar则不行;
- 不是线程安全的、不能处理闰秒。
新时间日期API:
- java.time – 包含值对象的基础包;
- java.time.chrono – 提供对不同的日历系统的访问;
- java.time.format – 格式化和解析时间和日期;
- java.time.temporal – 包括底层框架和扩展特性;
- java.time.zone – 包含时区支持的类;
- java.time包含本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类;
- LocalDate、LocalTime、LocalDateTime 较为常用,它们的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。
- LocalDate、LocalTime、LocalDateTime 提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
java.time.LocalDate、java.time.LocalTime、java.time.LocalDateTime
@Test
public void test6(){
//now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
//of():设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2021, 2, 9, 13, 41);
System.out.println(localDateTime1);
//getXxx():获取相关的属性
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getDayOfWeek());
System.out.println(localDateTime.getMonth());
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getMinute());
//不可变性
//withXxx():设置相关的属性
LocalDate localDate1 = localDate.withDayOfMonth(28);
System.out.println(localDate);
System.out.println(localDate1);
LocalDateTime localDateTime2 = localDateTime.withHour(10);
System.out.println(localDateTime);
System.out.println(localDateTime2);
LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
System.out.println(localDateTime);
System.out.println(localDateTime3);
LocalDateTime localDateTime4 = localDateTime.minusDays(6);
System.out.println(localDateTime);
System.out.println(localDateTime4);
}
运行结果为:
java.time.Instant
- Instant:时间线上的一个瞬时点, 这可能被用来记录应用程序中的事件时间戳,精度为纳秒级;
- 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
常用方法:
- now() 静态方法,返回默认UTC时区的Instant类的对象;
- ofEpochMilli(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象;
- atOffset(ZoneOffset offset) 结合即时的偏移来创建一个 OffsetDateTime;
- toEpochMilli() 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳;
代码示例:
@Test
public void test7(){
//now():获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);//2019-02-18T07:29:41.719Z
//添加时间的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2019-02-18T15:32:50.611+08:00
//toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数 ---> Date类的getTime()
long milli = instant.toEpochMilli();
System.out.println(milli);
//ofEpochMilli():通过给定的毫秒数,获取Instant实例 -->Date(long millis)
Instant instant1 = Instant.ofEpochMilli(1612837876193L);
System.out.println(instant1);
}
运行结果:
java.time.format.DateTimeFormatter
java.time.format.DateTimeFormatter 类提供了三种格式化方法:
- 预定义的标准格式,如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME;
- 本地化相关的格式,如:ofLocalizedDateTime(FormatStyle.LONG);
- 自定义的格式,如:ofPattern(“yyyy-MM-dd hh:mm:ss”);
示例代码:
@Test
public void test8(){
//方式一:预定义的标准格式,如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2019-02-18T15:42:18.797
//解析
TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");
System.out.println(parse);
//方式二:本地化相关的格式。如:ofLocalizedDateTime()
//FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2019年2月18日 下午03时47分16秒
//本地化相关的格式
//FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//格式化
String str3 = formatter2.format(LocalDate.now());
System.out.println(str3);//2019-2-18
//方式三:自定义的格式
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);
}
其他API
- ZoneId:该类中包含了所有的时区信息;
- ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris,其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等;
- Clock:使用时区提供对当前即时、日期和时间的访问的时钟;
- Duration:持续时间,用于计算两个“时间”间隔;
- Period:日期间隔,用于计算两个“日期”间隔;
- TemporalAdjuster : 时间校正器,如将日期调整到“下一个工作日等。
- TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用TemporalAdjuster 的实现;
内容总结
以上是互联网集市为您收集整理的Java(11)Java常用类——字符串类、日期时间API、比较器、System类、Math类、BigInteger与BigDecimal全部内容,希望文章能够帮你解决Java(11)Java常用类——字符串类、日期时间API、比较器、System类、Math类、BigInteger与BigDecimal所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。