字符串相关的类 String
介绍
- String类:: 代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作
为此类的实例实现 - String是一个final类,代表不可变的字符序列
- 字符串是常量,用双引号引起来表示。他们的值在创建之后不能更改
- String对象的字符内容是存储在一个字符数组value[]中的
内存解析
问题:String str1 = “abc”; 与String str2 = new String(“abc”);的区别
练习
String与基本数据类型转换
- 字符串 -> 基本数据类型、包装类
- Integer包装类的public static int parseInt(String s):可以将由“数字”字
符组成的字符串转换为整型 - 类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应
的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型
- Integer包装类的public static int parseInt(String s):可以将由“数字”字
- 基本数据类型、包装类 -> 字符串
- 调用String类的public String valueOf(int n)可将int型转换为字符串
- 相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double
d)、valueOf(boolean b)可由参数的相应类型到字符串的转换
- 字符数组 -> 字符串
- String 类的构造器:String(char[]) 和 和 String(char[] ,int offset ,int
length) 分别用字符数组中的全部字符和部分字符创建字符串对象
- String 类的构造器:String(char[]) 和 和 String(char[] ,int offset ,int
- 字符串 -> 字符数组
- public char[] toCharArray() :将字符串中的全部字符存放在一个字符数组
中的方法 - public void getChars(int srcBegin, int srcEnd, char[] dst,
int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法
- public char[] toCharArray() :将字符串中的全部字符存放在一个字符数组
字节数组 -> 字符串
- String(byte[]) :通过使用平台的默认字符集解码指定的 byte 数组,构
造一个新的 String - String(byte[] ,int offset ,int length) :用指定的字节数组的一部分,
即从数组起始位置offset开始取length个字节构造一个字符串对象
- String(byte[]) :通过使用平台的默认字符集解码指定的 byte 数组,构
字符串 -> 字节数组
- public byte[] getBytes() :使用平台的默认字符集将此 String 编码为
byte 序列,并将结果存储到一个新的 byte 数组中 - public byte[] getBytes(String charsetName) :使用指定的字符集将
此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
- public byte[] getBytes() :使用平台的默认字符集将此 String 编码为
StringBuffer 类
介绍:StringBuffer 类不同于String ,其对象必须使用构造器生成。有三个构造器:
- StringBuffer() :初始容量为16的字符串缓冲区
- StringBuffer(int size) :构造指定容量的字符串缓冲区
- StringBuffer(String str) :将内容初始化为指定字符串内容
StringBuffer和String的区别
常用方法:
1
2
3
4
5StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
StringBuilder 类
- 简介:StringBuilder 和 和 StringBuffer 非常类似,均代表可变的字符序列 , 而且
提供相关功能的方法也一样
对比String 、StringBuffer 、StringBuilder
- String(JDK1.0):不可变字符序列
- StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
- StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全
经典题
1 | String str = null; |
JDK8之前日期时间API
java.lang.System类
- System类提供的public static long currentTimeMillis()用来返回当前时
间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
java.util.Date 类
- 含义:表示特定的瞬间,精确到毫秒
- 构造器:
- Date():使用无参构造器创建的对象可以获取本地当前时间
- Date(long 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是时间标准 (Sun Apr 05 10:04:51 CST 2020)
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象
java.text.SimpleDateFormat 类
说明: Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat
类是一个不与语言环境有关的方式来格式化和解析日期的具体类格式化:
- SimpleDateFormat() :默认的模式和语言环境创建对象
- public SimpleDateFormat(String pattern) :该构造方法可以用参数pattern
指定的格式创建一个对象,该对象调用 - public String format(Date date) :方法格式化时间对象date
解析:
- public Date parse(String source): :从给定字符串的开始解析文本,以生成
一个日期
- public Date parse(String source): :从给定字符串的开始解析文本,以生成
时间格式参照图
Demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Date date = new Date();
//产生一个formater格式化的对象
SimpleDateFormat formater = new SimpleDateFormat();
//打印默认输出的格式
System.out.println(formater.format(date)); //20-4-5 上午10:19
//指定格式
SimpleDateFormat formater2 = new SimpleDateFormat("yyyy年MM月dd日 EEE HH:mm:ss");
System.out.println(formater2.format(date)); //2020年04月05日 星期日 10:19:27
// 实例化一个指定的格式对象
Date date2 = null;
try {
date2 = formater2.parse("2008年08月08日 星期一 08:08:08");
} catch (ParseException e) {
e.printStackTrace();
}
// 将指定的日期解析后格式化按指定的格式输出
System.out.println(date2.toString()); //Fri Aug 08 08:08:08 CST 2008
java.util.Calendar 类
简介: Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能
获取Calender实例:
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器
说明:一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想
要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、
MINUTE、SECOND注意:
- 获取月份时:一月是0,二月是1,以此类推,12月是11
- 获取星期时:周日是1,周二是2 , 。。。。周六是7
几个方法:
- public void set(int field,int value)
- public void add(int field,int amount)
- public final Date getTime()
- public final void setTime(Date date)
Demo:
1
2
3
4
5
6
7
8
9
10Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar.getTime()); //Sun Apr 05 10:41:45 CST 2020
calendar.set(Calendar.DAY_OF_MONTH, 8);
System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime()); //Wed Apr 08 10:41:45 CST 2020
calendar.add(Calendar.HOUR, 2);
System.out.println("当前时间加2小时后,时间是:" + calendar.getTime()); //Wed Apr 08 12:41:45 CST 2020
calendar.add(Calendar.MONTH, -2);
System.out.println("当前日期减2个月后,时间是:" + calendar.getTime()); //Sat Feb 08 12:41:45 CST 2020
JDK8中新日期时间API
之前日期类的问题
- 如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不
过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了
一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用
了。而Calendar并不比Date好多少。它们面临的问题是:- 可变性:像日期和时间这样的类应该是不可变的
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始
- 格式化:格式化只对Date有用,Calendar则不行
- 安全性:不是线程安全的
新时间日期API–java.time API
简介:Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。
新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间
(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)
和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,
用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简
化了日期时间和本地化的管理包:
- java.time – 包含值对象的基础包
- java.time.format – 格式化和解析时间和日期
- java.time.chrono – 提供对不同的日历系统的访问
- java.time.temporal – 包括底层框架和扩展特性
- java.time.zone – 包含时区支持的类
- 大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽
管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一
类:
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期
- LocalTime表示一个时间,而不是日期
- LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一
- ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示
法,也就是公历
方法:
Demo:
1
2
3
4
5
6
7
8
9
10
11
12//now()方法
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate); //2020-04-05
System.out.println(localTime); //16:15:55.181
System.out.println(localDateTime); //2020-04-05T16:15:55.181
//of() T表示分隔符,Z表示的是UTC(世界标准时间)。
LocalDateTime localDateTime1 = LocalDateTime.of(2020,4,4,16,18,55);
System.out.println(localDateTime1);
时间戳?
- 时间戳是指格林威治时间1970 年01 月01 日00 时00 分00 秒( 北京时间1970 年01 月01
日 日08 时00 分00 秒) 起至现在的总秒数
瞬时 Instant
概念:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间
戳。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。
概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒
数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。(1 ns = 10^ -9 s) 1秒 = 1000毫秒 =10^6微秒=10 ^9 纳秒
方法:
Demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Instant instant = Instant.now();
System.out.println(instant); //2020-04-05T08:27:02.626Z 世界标准时间 北京时间要在基础上+8h
//偏移8h得到北京时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime); //2020-04-05T16:27:02.626Z
//获取对应毫秒数 自**1970年1月1日0时0分0秒开始
long l = instant.toEpochMilli();
System.out.println(l); //1586075486287
Date date = new Date(l);
System.out.println(date); //Sun Apr 05 16:37:06 CST 2020
SimpleDateFormat format = new SimpleDateFormat();
String format1 = format.format(date);
System.out.println(format1); //默认输出格式 20-4-5 下午4:37
SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月dd日 EEE HH:mm:ss");
System.out.println(format2.format(date)); //2020年04月05日 星期日 16:37:06
格式化与解析日期或时间
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法
- 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
- 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
- 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
Demo:
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
27LocalDateTime localDateTime = LocalDateTime.now();
//DateTimeFormatter 格式化或解析日期时间
//方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime); //2020-04-05T16:47:38.470
System.out.println(str1); //2020-04-05T16:47:38.47
//方式二:本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
// 还有 FormatStyle.SHORT FormatStyle.MEDIUM
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
System.out.println(formatter1.format(localDateTime));
//short: 20-4-5 下午4:56
//long: 2020年4月5日 下午04时58分11秒
//medium: 2020-4-5 16:58:40
//方式三: 自定义格式 如:ofPattern("yyyy-MM-dd hh:mm:ss")
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
System.out.println(formatter2.format(localDateTime)); //2020-04-05 05:03:32
//解析
TemporalAccessor accessor = formatter2.parse("2020-04-05 05:03:32");
System.out.println(accessor);
//输出:{MilliOfSecond=0, HourOfAmPm=5, MicroOfSecond=0, NanoOfSecond=0, MinuteOfHour=3, SecondOfMinute=32},ISO resolved to 2020-04-05
Java比较器
自然排序:java.lang.Comparable
- 概念: Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称
为类的自然排序 用法:实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即
通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大
于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回
负整数,如果当前对象this等于形参对象obj,则返回零, 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序Comparable 的典型实现:(默认都是从小到大排列的)
- String:按照字符串中字符的Unicode值进行比较
- Character:按照字符的Unicode值来进行比较
- 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值
大小进行比较 - Boolean:true 对应的包装类实例大于 false 对应的包装类实例
- Date、Time等:后面的日期时间比前面的日期时间大
Demo:
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
35
36
37
38
39class Goods implements Comparable{
private String name;
private double price;
//省略构造方法 、getter()、setter()、toString()方法
public int compareTo(Object o) {
if(o instanceof Goods) {
Goods other = (Goods)o;
if(this.price > other.price) {
return 1;
}else if(this.price < other.price) {
return -1;
}else{
return 0;
}
}
throw new RuntimeException("传入的数据类型不符合要求");
}
}
public class Main {
public static void main(String[] args) {
Goods[] all = new Goods[4];
all[0] = new Goods("《红楼梦》", 100);
all[1] = new Goods("《西游记》", 80);
all[2] = new Goods("《三国演义》", 140);
all[3] = new Goods("《水浒传》", 120);
Arrays.sort(all);
System.out.println(Arrays.toString(all));
}
}
/*
输出结果:
[Goods{name='《西游记》', price=80.0}, Goods{name='《红楼梦》', price=100.0}, Goods{name='《水浒传》', price=120.0}, Goods{name='《三国演义》', price=140.0}]
*/
定制排序:java.util.Comparator
简介:当元素的类型没有实现java.lang.Comparable 接口而又不方便修改代码,
了 或者实现了java.lang.Comparable 接口的排序规则不适合当前的操作,那
么可以考虑使用 Comparator 的对象来排序用法:需要重写compare(Object o1,Object o2)方法,比较o1和o2的大小,可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制
Demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class Main {
public static void main(String[] args) {
Goods[] all = new Goods[4];
all[0] = new Goods("《红楼梦》", 100);
all[1] = new Goods("《西游记》", 80);
all[2] = new Goods("《三国演义》", 140);
all[3] = new Goods("《水浒传》", 120);
//将 Comparator 传递给 sort 方法
Arrays.sort(all, new Comparator<Goods>() {
public int compare(Goods o1, Goods o2) {
Goods g1 = (Goods)o1;
Goods g2 = (Goods)o2;
return Double.compare(g1.getPrice(),g2.getPrice());
}
});
System.out.println(Arrays.toString(all));
}
}
System类
介绍:System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包,由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便
的进行调用成员变量:System类内部包含in、out和err三个成员变量,分别代表标准输入流
(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)成员方法:
native long currentTimeMillis(): 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数
void exit(int status): 该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。 使用该方法可以在图形界面编程中实现程序的退出功能等
void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况
String getProperty(String key):方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:
Math 类
- 介绍:java.lang.Math 提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double
- 方法:
1 | abs 绝对值 |