Java常用类
1、String类
- String声明为final的,不可被继承。
- String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小。
- String内部定义了final char[] value用于存储字符串数据。
- String:代表不可变的字符序列。简称:不可变性。
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
- 字符串常量池中是不会存储相同内容的字符串的。
1 |
|
体会不可变性:
1 | public class StringTest { |
1.1 String的实例化方式
- 通过字面量定义的方式。
- 通过new + 构造器的方式。
- 通过String s = new String(“abc”)创建了两个对象,一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:”abc”。
1 |
|
图解:
1 |
|
1.2 字符串拼接
- 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
- 只要其中有一个是变量,结果就在堆中。
- 如果拼接的结果调用intern()方法,返回值就在常量池中。
1 |
|
1.3 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():返回字符串的副本,忽略前导空白和尾部空白。
1 |
|
- 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(不包含)的一个子字符串。
1 |
|
- 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):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
- indexOf和lastIndexOf方法如果未找到都是返回-1。
- 如果存在唯一的一个str,则indexOf和lastIndexOf返回的值也相同。
1 |
|
- 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个,如果超过了,剩下的全部都放到最后一个元素中。
1 |
|
1.4 String与其它结构的转换
- String 与基本数据类型、包装类之间的转换。
- String –> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)。
- 基本数据类型、包装类 –> String:调用String重载的valueOf(xxx)。
1 |
|
- String 与 char[]之间的转换。
- String –> char[]:调用String的toCharArray()。
- char[] –> String:调用String的构造器。
1 |
|
- String 与 byte[]之间的转换
- 编码:String –> byte[]:调用String的getBytes()。
- 解码:byte[] –> String:调用String的构造器。(解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。)
1 |
|
2、StringBuffer与StringBuilder类
String、StringBuffer、StringBuilder三者的异同:
- String:不可变的字符序列;底层使用char[]存储。(String str = new String();//char[] value = new char[0];)
- StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储。(StringBuffer sb1 = new StringBuffer();//char[] value = new char[16]底层创建了一个长度是16的数组;StringBuffer sb2 = new StringBuffer(“abc”);//char[] value = new char[“abc”.length() + 16];)
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储。
- 效率从高到低排列:StringBuilder > StringBuffer > String
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
public void test(){
//初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));//StringBuffer的执行时间:17
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));//StringBuilder的执行时间:6
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));//String的执行时间:1857
}
2.1 StringBuffer的常用方法
- StringBuffer 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() :把当前字符序列逆转。
- public int indexOf(String str)。
- public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串。
- public int length()
- public char charAt(int n)
- public void setCharAt(int n ,char ch)
1 |
|
3、日期类
- JDK8之前日期时间API
- JDK8之后日期时间API
- java.time – 包含值对象的基础包。
- java.time.chrono – 提供对不同的日历系统的访问。
- java.time.format – 格式化和解析时间和日期。
- java.time.temporal – 包括底层框架和扩展特性。
- java.time.zone – 包含时区支持的类。
- 出现变化的原因:
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,它们也不是线程安全的;不能处理闰秒等。
3.1 java.util.Date类和java.sql.Date类
- java.util.Date类
- java.sql.Date类
1 |
|
3.2 SimpleDateFormat类
- SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析。
- 格式化:日期 —>字符串
- 解析:格式化的逆过程,字符串 —> 日期
1 |
|
3.3 Calendar日历类(抽象类)
1 |
|
- 获取月份时:一月是0,二月是1,以此类推,12月是11。
- 获取星期时:周日是1,周二是2 , 。。。。周六是7。
3.4 LocalDate、LocalTime、LocalDateTime类
1 |
|
3.5 Instant类
- Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
- 在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
1 |
|
3.6 DateTimeFormatter类
- 用来格式化或解析日期、时间,类似SimpleDateFormat。
1 |
|
4、Java比较器
4.1 自然排序:java.lang.Comparable
- Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
- 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零。
- 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
1 |
|
4.2 定制排序:java.util.Comparator
- 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序。
- 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
1 |
|
5、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的属性对应的值。系统中常见
的属性名以及属性的作用如下表所示:
1 |
|