1、三个类的对比:String、StringBuffer、StringBuilder
String:不可变的字符序列;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
StringBuffer:可变的字符序列;JDK1.0声明,线程安全的,效率低;底层使用charl] (jdk8及之前),底层使用byte[] (jdk9及之后)
StringBuilder:可变的字符序列;JDK5.0声明,线程不安全的,效率高;底层使用char] (idk8及之前),底层使用bytel] (jdk9及之后)
2、StringBuffer/StringBuilder的可变性分析(源码分析):回顾:
String s1 = new String(); //char[] value = new char[0]
String s2 = new String("abc"); // char[] value = new char[3]['a','b','c';]
针对于StringBuilder来说:
为部的属性有:
char[] value; //存储字符序列
int count;//实际存储的字符的个数
StringBuilder sBuffer1 = new StringBuilder(): //char[] value = new char[16];
StringBuilder sBuffer1 = new StringBuilder(“abc”): //char[] value = new char[16 +”abc”.length];
sBuffer1.append(“a”); //value[0] = ‘a’; value[1] =c';
sBuffer1.append("b");//value[2] = b';
...不断的添加,一旦count要超过value.length时,就需要扩容:默认扩容为原有容量的2倍+2。并将原有vaLue数组中的元素复制到新的数组中。
3,源码启示:
>如果开发中需要频繁的针对于字符串进行增、删、改等操作,建议使用StringBuffer或StringBuilder替换String,因为使用String效率低。
>如果开发中,不涉及到线程安全问题,建议使用StringBuilder替换StringBuffer。因为使用StringBuilder效率高
4,StringBuffer和StringBuilder中的常用方法
增:
append(xx)
删:
delete(int start,int end)
deleteCharAt(int index)
改:
replace(int start,int end,String str)
setCharAt(int index,char c)
查
charAt(int index)
插
insert(int index,xx)
长度:
length()
其他API:
(1) int indexOf(string str): 在当前字符序列中查询str的第一次出现下标
(2) int index0f(String str, int fromindex): 在当前字符序列[fromindex,最后]中查询str的第一次出现下标
(3) int lastlndexOfString str): 在当前字符序列中查询str的最后一次出现下标
(4) int lastindex0fString str, int fromindex): 在当前字符序列[fromindex,最后中查询str的最后一次出现下标
(5)String substringint start): 截取当前字符序列[start,最后]
(6)String substring(int start,int end): 截取当前字符序列[start,end)
(7)string toString0: 返回此序列中数据的字符串表示形式
(8) void setLength(int newLength): 设置当前字
符序列长度为newLength
关于日期时间的API
一JDK之前的API
>获取当前时间对应的毫秒数,long类型,时间戳,\
>当前时间与1970年1月1日0时0分0秒之间的毫秒数
>常用来计算时间差
> |--Java.util.Date
>两个构造器的使用
>两个方法的使用
(子类)|---Java.sql.Date:对应数据库中的date类型
public class DateTimeTest {
public static void main(String[] args) throws ParseException {
Date date1 = new Date(); //创建一个基于当前系统时间的Date实例
System.out.println("当前系统时间:"+ date1.toString());//当前系统时间:Tue Jul 18 09:53:24 CST 2023
long milliTinmes = date1.getTime();
System.out.println("当前毫秒数是:" + milliTinmes);//当前毫秒数是:1689645204400
Date date2 = new Date(1689644294479L); //创建一个基于指定时间戳的Date的实例
System.out.println(date2.toString());//Tue Jul 18 09:38:14 CST 2023
DateTimeTest.test2();
System.out.println();
java.sql.Date date3 = new java.sql.Date(1689644294479L);
System.out.println(date3.toString()); //2023-07-18
System.out.println(date3.getTime()); //1689644294479
//DateTimeTest.test3();
DateTimeTest.test4();
}
public static void test2(){
java.sql.Date date1 = new java.sql.Date(1689644294479L);
System.out.println(date1.toString()); //023-07-18
}