String
- String声明为final,不可以被继承
- String实现了Serializable接口:表示字符串支持序列化
- String实现了Comparable接口:表示String可以比较大小
- String内部定义了final char[] value用于存储字符串数据
- String:代表不可变的字符序列。简称不可变性
体现:
- 当对字符串重新赋值时,需要重写指定内存区赋值,不能使用原有value赋值
- 对现有字符串进行连接操作时,也需要重写指定内存区域,不能使用原有value赋值
- 当调用String的replace()修改字符或字符串时,也必须重新指定内存区域,不能使用原有区域赋值
- 通过字面量的方式(区别于new)给一个字符串赋值,此时字符串常量声明在常量池中
- 字符串常量池是不会存储相同内容的字符串
public void test1() {
String s1 = "abc";// 字面量的定义方式,此时的字符串值声明在字符串常量池中
String s2 = "abc";// 字符串常量池不会存储2个相同的字符串
System.out.println(s1 == s2);// true
s1 = "hello";
System.out.println(s1 == s2);// false
System.out.println(s1);// hello
System.out.println(s2);// abc
}
字符串拼接
常量与常量拼接在一起仍然在常量池中(注意final修饰的字符串是常量)
而由String类的对象拼接来的可以看成在堆区new的
如果拼接的结果调用intern()方法,返回值就在常量池中
@Test
public void test2() {
String s1 = "hel";
String s2 = "lo";
String s3 = "hel" + "lo";
String s4 = "hello";
System.out.println(s3 == s4);// true
String s5 = "hel" + s2;
System.out.println(s5 == s4);// false
String s6 = s5.intern();
System.out.println(s6 == s4);// true
}
注意点:String的传参
public class StringTest {
String str = new String("java");
char[] value = {'1', '2', '3', '4'};
public void change(String str1, char[] value1) {
System.out.println(str1 == str);// true
str1 = "hello";
System.out.println(str1 == str);// false
value1[0] = '5';
}
public static void main(String[] args) {
StringTest st = new StringTest();
st.change(st.str, st.value);
System.out.println(st.str);// java
System.out.println(st.value);// 5234
}
}
字符串常用方法
int length();// 返回字符串长度
char charAt(int index);// 返回当前下标的字符
boolean isEmpty();// 判断是否为空字符串
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);// 比较2个字符串的大小
String substring(int beginIndex);// 返回一个新字符串,它是从beginIndex开始截取的
String substring(int beginIndex, int endIndex);// 返回一个新字符串,它是从beginIndex开始截取,endIndex结束的,[beginIndex, endIndex)
String --> 基本数据类型
调用包装类的parseXxx()方法
基本数据类型 --> String
调用String的valueOf()方法
String --> char[]
调用String的toCharArray()方法
cahr[] --> String
调用String的构造器 new String(char[])
String --> byte[]
调用String的getBytes()方法
getBytes(String charsetName)// 指定字符集编码(注意要异常处理)
byte[] --> String
调用String的构造器 new String(byte[])
new String(byte[] , String charName)// 指定字符集解码
StringBuffer&StringBuild
String:不可变的字符序列
StringBuffer:可变的字符序列,线程安全,效率低
StringBuild:可变的字符序列,线程不安全,效率高
StringBuffer sb1 = new StringBuffer();// 创建一个长度为16的数组
append()方法:向原有数组追加字符
setChar(int index, char ch)方法,将index下标的字符修改为ch
若原有容量不够,则扩容为原来的2倍 + 2
由于扩容涉及到数组的创建和复制,因此建议使用StringBuffer(int capacity)构造器,指定初始数组的大小
注意append()方法,添加任何数据类型都会变成String型,如整数1变为字符1,一个原来是null的字符变成"null"
日期类
// 获取1970年1月1日0时0分0秒之间以毫秒为单位的时间差
System.currentTimeMillis();
java.util.Date
new Date();
new Date(long date);// 创建指定毫秒数的Date对象
toString();// 例如:Thu Jun 24 18:37:44 CST 2021
getTime();// 得到1970年1月1日0时0分0秒到现在的毫秒数
java.sql.Date
new Date(long date);// 创建指定毫秒数的Date对象
java.util.Date与java.sql.Date之间的相互转换
java.util.Date d = new java.sql.Date();// 多态
java.sql.Date d2 = new java.sql.Date(d.getTime);
SimpleDateFormat
public void testSimpleDateFormat() throws ParseException {
// 使用默认构造器
SimpleDateFormat sdf = new SimpleDateFormat();
// 格式化:日期 --> 字符串
Date date = new Date();
System.out.println(date);// Thu Jun 24 18:41:17 CST 2021
String format = sdf.format(date);
System.out.println(format);// 21-6-24 下午6:41
// 解析:格式化的逆过程,字符串 --> 日期
String str = "21-6-24 下午6:41";
Date date1 = sdf.parse(str);// 会抛异常
System.out.println(date1);// Thu Jun 24 18:41:00 CST 2021
// 使用带参构造器
sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 格式化
format = sdf.format(date);
System.out.println(format);// 2021-06-24 06:54:29
// 解析:要求字符串必须是SimpleDateFormat识别的格式(通过构造器参数体现,否则会抛异常)
date = sdf.parse("2021-06-24 06:54:29");
System.out.println(date);// Thu Jun 24 06:54:29 CST 2021
}
Calendar
一、实例化
- 创建子类GregorianCalendar对象
- 调用静态方法getInstance
二、方法
public void testCalendar() {
Calendar calendar = new GregorianCalendar();
calendar = Calendar.getInstance();
// get()
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));// 这个月的第几天
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));// 这一年的第几天
// set()
calendar.set(Calendar.DAY_OF_YEAR, 176);// 改成这一年的第176天
// add()
calendar.add(Calendar.DAY_OF_YEAR, 3);// 将这一年的天数增加3天
// getTime() 日历类 --> Date
Date date = calendar.getTime();
// setTime() Date --> 日历类
calendar.setTime(date);
}
三、注意
Calendar中月是从一开始的,星期是从星期日开始的,从1到7
LocalDate&LocalTime&LocalDateTime
Instant
DateTimeFormatter
其他API
Java比较器
Comparable接口(自然排序)
重写compareTo(Object o)方法,大的返回正整数,相等返回0,小的返回负整数
Comparator接口(定制排序)
重写compare(Object o1, Object o2)方法,大的返回正整数,相等返回0,小的返回负整数