String类
java.lang.String类
- 用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描述;
- 该类由
final
关键字修饰,表示该类不能被继承;- 从
jdk1.9
开始该类的底层不使用char[](2字节)
来存储数据,而是改成byte[](1字节)
加上编 码标记,从而节约了一 些空间;- 该类描述的字符串内容是个常量不可更改,因此可以被共享使用。
什么是常量池?
-- 由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能。
案例:
public class StringTest {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
System.out.println(str3 == str4);
System.out.println(str3.equals(str4));
}
}
运行结果:
true、true、false、true
分析:
-- 双引号引起的字符串存放在常量池,对于重复出现的字符串来说直接使用池中已有的对象,因此地址相同。
使用 new 关键字创建字符串的方式会在堆区重新申请内存空间,因此对象不一样,地址不同,但是 String 类中重写了 equals 方法,因此比较字符串内容是否相同。
String类常用构造方法:
方法声明 | 功能介绍 |
---|---|
String() | 使用无参方式构造对象得到空字符串对象 |
String(byte[] bytes(字节数组名), int offset, int length) | 使用bytes(字节)数组中下标从offset位置开始的length个字节来构造字符串对象; |
String(byte[] bytes) | 使用整个bytes数组构造字符串对象 |
String(char[] value(字符数组名), int offset, int count) | 使用字符数组中下标从offset位置开始的count个字符来构造对象 |
String(char[] value) | 使用整个字符数组来构造对象 |
String类常用成员方法:
1. String类型和数组之间的转换的方法:
方法声明 | 功能介绍 |
---|---|
String toString() | 返回字符串本身 |
byte[] getBytes() | 将当前字符串内容转换为byte数组并返回(其中的原理就是:先将字符串拆分成字符,再将每个字符转换成byte类型,也就是获取所有字符的ASCII值); |
char[] toCharArray() | 用于将当前字符串内容转换为char数组并返回; |
2. String类中字符的获取与使用的方法:
方法声明 | 功能介绍 |
---|---|
char charAt(int index) | 方法charAt() 用于返回字符串指定位置的字符; |
int length() | 返回字符串字符序列的长度; |
boolean isEmpty() | 判断字符串是否为空; |
3. String类中字符的比较的方法:
方法声明 | 功能介绍 |
---|---|
int compareTo(String anotherString) | 用于比较调用对象和参数对象的大小关系; |
int compareToIgnoreCase(String str) | 不考虑大小写,也就是'a'和'A'是相等的关系; |
String concat(String str) | 用于实现字符串的拼接; |
boolean contains(CharSequence s) | 用于判断当前字符串是否包含参数指定的内容; |
boolean equals(Object anObject) | 用于比较字符串内容是否相等并返回 ; |
int hashCode() | 获取调用对象的哈希码值; |
boolean equalsIgnoreCase(String anotherString) | 用于比较字符串内容是否相等并返回,不考虑大小写,如:'A'和'a'是相等; |
4. String类中字符的查找的方法:
方法声明 | 功能介绍 |
---|---|
int indexOf(int ch) | 用于返回当前字符串中参数ch指定的字符第一次出现的下标; |
int indexOf(int ch, int fromIndex) | 用于从fromIndex位置开始查找ch指定的字符; |
int indexOf(String str) | 在字符串中检索str返回其第一次出现的位置,若找不到返回-1; |
int indexOf(String str, int fromIndex) | 表示从字符串的fromIndex位置开始检索str第一次出现的位置; |
int lastIndexOf(int ch) | 用于返回参数ch指定的字符最后一次出现的下标; |
int lastIndexOf(int ch, int fromIndex) | 用于从fromIndex位置开始查找ch指定字符出现的下标 ; |
int lastIndexOf(String str) | 返回str指定字符串最后一次出现的下标; |
int lastIndexOf(String str, int fromIndex) | 用于从fromIndex位置开始反向搜索的第一次出现的下标。 |
5. String类中子字符串的获取的方法:
方法声明 | 功能介绍 |
---|---|
String substring(int beginIndex, int endIndex) | 返回字符串中从下标beginIndex(包括)开始到endIndex(不包括)结束的子字符串; |
String substring(int beginIndex) | 返回字符串中从下标beginIndex(包括)开始到字符串结尾的子字符串; |
StringBuilder类
可变字符串类:
-- java.lang.StringBuilder 和 java.lang.StringBuffer
概念:
- 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。
- 为了解决上述问题,可以使用
java.lang.StringBuilder
类 和java.lang.StringBuffer
类来描述字符序列可以改变的字符串,如:"ab"。- StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
- StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
StringBuilder类中常用构造方法:
方法声明 | 功能介绍 |
---|---|
StringBuilder() | 使用无参方式构造对象,容量为16(即:初始容量为16); |
StringBuilder(int capacity) | 根据参数指定的容量来构造对象,容量为参数指定大小; |
StringBuilder(String str) | 根据参数指定的字符串来构造对象,容量为:16+字符串长度; |
StringBuilder类常用的成员方法:
方法声明 | 功能介绍 |
---|---|
int capacity() | 用于返回调用对象的容量; |
int length() | 用于返回字符串的长度,也就是字符的个数; |
StringBuilder insert(int offset, String str) | 插入字符串并返回调用对象的引用,就是自己; |
StringBuilder append(String str) | 追加字符串 |
StringBuilder deleteCharAt(int index) | 将当前字符串中下标为index位置的单个字符删除 ; |
StringBuilder delete(int start,int end) | 删除字符串,从下标为start开始到下标为end结束(包含start,不包含end); |
StringBuilder replace(int start,int end,String str) | 替换字符串 (改); |
StringBuilder setCharAt(int index,String ch) | 将下标为:index的位置的字符修改为:ch; |
int indexOf(int ch) | 用于返回当前字符串中参数ch指定的字符第一次出现的下标(查); |
StringBuilder reverse() | 字符串反转; |
注意事项:
- 当字符串的长度超过字符串对象的初始容量时,该字符串对象会自动扩容,扩容算法是:原始容量*2+2。底层采用byte数组存放所有的字符内容;
- StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。由此可见,这些方法在对StringBuilder所 封装的字符序列进行改变后又返回了该对象的引用。基于这样设计的目的在于可以连续调用。
思考:
- 既然StringBuilder类的对象本身就可以改变,那为什么成员方法还有返回值呢?
答:这其实就是为了可以连续调用。如:
sb.reverse().append("1").insert(0,"2");
- 如何实现String类型和StringBuilder类型转换?
StringBuilder sb = new StringBuilder();
String str = sb.toString(); // StringBuilder类型转成 String类型
StringBuilder sb2 = new StringBuilder(str); // String类型转成 StringBuilder类型
- 三个类的效率排序:String<StringBuffer<StringBuilder.
日期类
System类(java8之前)
-- Java.lang.System
类
常用的方法:
方法声明 | 功能介绍 |
---|---|
static long currentTimeMillis() | 返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差 |
Date类(java8之前)
-- java.util.Date
类主要用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒。
常用的方法
方法声明 | 功能介绍 |
---|---|
Date() | 使用无参的方式构造对象,也就是当前系统时间 |
Date(long date) | 根据参数指定毫秒数构造对象, 参数为距离1970年1月1日0时0分0秒的毫秒数 |
long getTime() | 获取调用对象距离1970年1月1日0时0分0秒的毫秒数 |
void setTime(long time) | 设置调用对象为距离基准时间time毫秒的时间点 |
SimpleDateFormat类(java8之前)
-- java.text.SimpleDateFormat
类主要用于实现日期和文本之间的转换。
常用的方法
方法声明 | 功能介绍 |
---|---|
SimpleDateFormat() | 使用无参方式构造对象 |
SimpleDateFormat(String pattern) | 根据参数指定的模式来构造对象,模式主要有: y-年 M-月 d-日 H-时 m-分 s-秒 |
final String format(Date date) | 用于将日期类型转换为文本类型 |
Date parse(String source) | 用于将文本类型转换为日期类型 |
LocalDate类( Java8)
-- java.time.LocalDate
类主要用于描述年-月-日格式的日期信息,该类不表示时间和时区信息。
常用的方法
方法声明 | 功能介绍 |
---|---|
static LocalDate now() | 在默认时区中从系统时钟获取当前日期 |
LocalTime类( Java8)
-- java.time.LocalTime
类主要用于描述时间信息,可以描述时分秒以及纳秒。
常用的方法
方法声明 | 功能介绍 |
---|---|
static LocalTime now() | 从默认时区的系统时间中获取当前时间 |
static LocalTime now(ZoneId zone) | 获取指定时区的当前时间 |
DateTimeFormatter类( Java8)
-- java.time.format.DateTimeFormatter
类主要用于格式化和解析日期。
常用的方法
方法声明 | 功能介绍 |
---|---|
static DateTimeFormatter ofPattern(String pattern) | 根据参数指定的模式来获取对象 |
String format(TemporalAccessor temporal) | 将参数指定日期时间转换为字符串 |
TemporalAccessor parse(CharSequence text) | 将参数指定字符串转换为日期时间 |
网友评论