Java常用类
字符串相关类
String
1. 特性
import org.junit.Test;
/**
* test1():
* String:字符串,使用一对""引起来表示、
* 1.String声明为final的,不可被继承
* 2.String实现了Serializable接口:表示字符串是支持序列化的
* 实现了Comparable接口:表示String可以比较大小
* 3.String内部定义了final char[] value用于存储字符串数据
* 4.String代表不可变的字符序列。简称:不可变性。
* 体现:1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
* 2.对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
* 3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域
* 5.通过字面量的方式(区别于new)给一个字符串赋值,此时字符串值声明在字符串常量池中
* 6.字符串常量池中不会存储相同内容的字符串
*
* test2():
* Sting实例方式:①字面量定义 ②new+构造器
* String s = new String("abc"); 在内存创建了几个对象?
* 两个:一个是堆空间中new结构,一个是char[]对应的常量池数据"abc"
*
* test3():
* 常量与常量的拼接在常量池
* 只要其中有一个是变量,结果就在堆中
* 如果拼接的结果调用intern()方法,返回值就在常量池中
*
*/
public class StringTest {
@Test
public void test1() {
String s1 = "abc";
String s2 = "abc";
s1 = "hello";
System.out.println(s1 == s2);
System.out.println(s1);
System.out.println(s2);
System.out.println("***********************");
String s3 = "abc";
s3 += "def";
System.out.println(s3);
System.out.println(s2);
System.out.println("***********************");
String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println(s4);
System.out.println(s5);
}
@Test
public void test2(){
String s1 = "abc";
String s2 = new String("abc");
String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s2 == s3);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
@Test
public void test3(){
String s1 = "javaEE";
String s2 = "hadoop";
String s3 = "javaEEhadoop";
String s4 = "javaEE" + "hadoop";
String s5 = s1 + "hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2;
String s8 = (s1 + s2).intern();
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s4 == s5);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
System.out.println(s3 == s8);//true
}
}
2. 常用方法
方法 | 说明 |
---|---|
length() | 得到一个字符串的字符个数 |
charAt(int index) | 从字符串中取出指定索引的字符 |
indexOf(“字符”) | 返回指定字符的索引 |
toUpperCase() | 将字符串转化为大写 |
toLowerCase() | 将字符串转化为小写 |
split(“字符”) | 根据给定的正则表达式来拆分字符串 |
equals() | 比较两个字符串是否相等 |
compareTo() | 比较两个字符串大小 |
trim() | 去掉字符串首尾空格 |
substring(int beginIndex,int endIndex) | 截取字符串 |
equalsIgnoreCase() | 忽略大小写比较两个字符串的值是否相同 |
contains() | 判断字符串里面是否包含指定的内容 |
startsWith() | 测试此字符串是否以指定的前缀开始 |
endsWith() | 测试此字符串是否以指定的后缀结束 |
toCharArray() | 将字符串变成一个字符数组 |
getBytes() | 将字符串变成一个字节数组 |
StringBuffer/StringBuilder
1. String、StringBuffer、StringBuilder三者对比
相同点:底层使用char[ ]存储
不同点:
- String:不可变的字符序列。
- StringBuffer:可变的字符序列;线程安全,效率低。
- StringBuilder:可变的字符序列;线程不安全,效率高。
2. StringBuffer与StringBuilder内存解析
扩容问题:如果添加的数据底层数组盛不下,扩容为原来容量的2倍+2,同时将原数组中的元素复制到新的数组。通常开发中会在创建对象时直接在构造器中设定好所需容量大小。
3. String、StringBuffer、StringBuilder三者执行效率
StringBuilder > StringBuffer > String
4. StringBuffer、StringBuilder常用方法
方法 | 说明 |
---|---|
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() | 长度 |
日期时间相关类
Date
/**
* java.util.Date
* |--java.sql.Date
*/
//创建java.util.Date对象
Date date1 = new Date();
Date date2 = new Date(176253876724L);
//创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(7668875343432L);
//java.util.Date对象转化为java.sql.Date对象
Date date4 = new java.sql.Date(293747834452L);
java.sql.Date date5 = (java.sql.Date) date4;
Date date6 = new Date();
java.sql.Date data7 = new java.sql.Date(date6.getTime());
SimpleDateFormat
SimpleDateFormat对日期Date类的格式化和解析
- 两个操作
1.1 格式化:日期—>字符串
1.2 解析:字符串—>日期- SimpleDateFormat的实例化:new+构造器
SimpleDateFormat sdf = new SimpleDateFormat(“时间格式”);
String format = sdf.format(date); //格式化
Date date1 = sdf.parse(“时间格式”); //解析
Calendar
import java.util.Calendar;
//1.实例化
Calendar calendar = Calendar.getInstance();
//常用方法
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
//set()
calendar.set(Calendar.DAY_OF_MONTH,22);
days = calendar.get(Calendar.DAY_OF_MONTH);
//add()
calendar.add(Calendar.DAY_OF_MONTH,-3);
//getTime()
Date date = calendar.getTime();
//setTime()
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
LocalDate/LocalTime/LocalDateTime
1. 说明
LocalDate、LocalTime、LocalDateTime分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前时间信息,也不包含时区相关信息。
2. 常用方法
方法 | 说明 |
---|---|
now() / now(Zone zone) / of() | 根据当前日期时间创建对象 |
getXxx() | 获取(年/月/时/分/秒) |
getDayOfXxx() | 获取(年份天数/月份天数/星期几) |
withDayOfXxx() | 修改(年份天数/月份天数) |
withXxx() | 修改(年份/月份) |
plusXxx() | 添加(年/月/周/日/时) |
minusXxx() | 减去(年/月/周/日/时) |
Instant
1. 说明
时间线上的一个瞬时点,表示自1970-01-01 00:00:00开始。
2. 常用方法
方法 | 说明 |
---|---|
now() | 返回默认UTC时区的Instant类对象 |
ofEpochMilli(long epochMilli) | 返回1970-01-01 00:00:00加上指定毫秒数后的Instant类对象 |
atOffset(ZoneOffset offset) | 结合即时的偏移来创建一个OffsetDateTime |
toEpochMilli() | 返回1970-01-01 00:00:00到当前时间的毫秒数 |
DateTimeFormatter
1. 说明
格式化或解析日期、时间
2. 常用方法
方法 | 说明 |
---|---|
ofPattern(String pattern) | 返回一个指定字符串格式的DateTimeFormatter |
format(TemporalAccessor t) | 格式化一个日期、时间,返回字符串 |
parse(CharSequence text) | 将指定格式的字符序列解析为一个日期、时间 |
3. 实例化方式
预定义标准格式:ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME
本地化相关格式:ofLocalizedDateTime(FormatStyle.LONG)
自定义格式:ofPattern(“yyyy-MM-dd hh:mm:ss”)
一般使用自定义格式
比较器
Comparable/Comparator
- Comparable(自然排序)
- String类和包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两对象大小的方式,进行从小到大排列。
- 重写compareTo(obj)的规则:
如果当前对象this大于形参对象obj,返回正整数;
如果当前对象this小于形参对象obj,返回负整数;
如果当前对象this等于形参对象obj,返回零。- 自定义类需要实现Comparable接口后,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序。
- Comparator(定制排序)
- 当元素类型没实现Comparable接口又不方便修改代码,或实现了Comparable接口但排序规则不适合当前需要,此时考虑使用Comparator。
- 重写compare(Object o1, Object o2)方法,比较o1和o2大小。
如果返回正整数,o1大于o2;
如果返回负整数,o1小于o2;
如果返回零,o1等于o2。
- 两者对比
Comparable接口长期有效,Comparator接口属于临时性。