一.StringBuffer和StringBuider
1.String与上述两者对比
①从变化来看
String是不可变字符序列
StringBuffer和StringBuider是可变字符序列
②从线程安全来看
StringBuffer是线程安全的,但是效率偏低
StringBuider是线程不安全的,效率较高
③共同点
三者底层都是用char[]数组来存,其中String是fianl,而其他两者都不是final类型的
④从使用来看
涉及到增删改查,不建议使用String
涉及到对同一变量访问即线程安全问题,不建议使用StringBuider
2.源码分析
①从初始化来看
String str = new String() //char[] value = new char[0];
StringBuffer str = new String() // char[] value = new char[16];
②从赋值来看
String str = new String(“abc”) //char[] value = new char[]{a,b,c};
StringBuffer str = new String(“abc”) // char[] value = new char[19];
③StringBuffer的问题
str的长度为多少? str.length() //3
str若append超出数组长度怎么办?str会自己扩容为原来了两倍加二,复制原来的数组元素到新数组,然后返回新数组的值。
指导:为了提高效率,我们建议使用StringBuffer时指定数组长度大一些,否则需要扩容而影响效率
3.StringBuffer的常用用法
①增
s1.append(“1”);
s1.insert(2,“false”);
②删
s1.delete(2,4)//左闭右开
③改
s1.replace(2,4,“hello”)//在索引为2,3的位置上改为hello
④查
s1.reverse()//字符串翻转
s1.subString(1,3)//返回子串
⑤遍历
涉及遍历时,charAt()
4.涉及两者转换
调用构造器即可转换两者
5.理解
两个方法本质的区别即为char[] 数组定义在了哪里,String方法的char最终仍然会指向方法区故不可变,而StringBuffer的数组仍然指向堆中的数组对象,故可以改变。
二.日期时间API
1.一般判断程序运行时间的方法
System.currentTimeMillis()//表示1970年到现在经历了多少ms
故在程序中直接调用两次然后相减得到程序运行时间
2.JDK8.0以前的Date类
①util下的Date类java.utilc
构造器:
Date date = new Date()//空参即获得当前时间的对象
Date date = new Date(“毫秒数”)//指定1970年之后的ms的时间对象
方法:
date.toString() //显示当前的年月日
date.getTime()//显示1970年到现在的时间差
②sql下的date类java.sql
构造器:
java.sql.Date date = new java.sql.Date()//空参获得当前对象
java.sql.Date date = new java.sql.Date(“毫秒数”)//获得1970年之后的ms的时间对象
③两者的转换
注意:两者并不存在父子类的关系,故两者的转换只能通过毫秒数作为中间点,来传入另一个的构造函数当中。
④SimpleDateFormat类
方法:
date0 = new Date();
date.formate(date)//将Date类的对象转换为String类型
date.parse(“19-2-8”)//将字符串转换为Date类的对象
⑤时间类关于Date和SimpleDatezFormat的举例说明:
通过java中得到字符串后,传入数据库中
String birth = “2020-09-08”;
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
Date date = sdf.parse(birth);//此处返回的date对象时util下的Date
java.sql.Date birthDate = new java.sql.Date(data.getTime());
⑥三者作用
Date date 是可以获得时间对象
java.sql.Date date是可以获得数据库中的时间对象
SimpleDateFormat是可以将字符串和util.Date进行转化
故可以通过键入字符串,通过SimpleDateFormat类进行转化为util.Date,然后通过时间戳作为中间值将util.Date转化为sql.Date;
⑦calender类(同date类区别为此类关注于年月日)
实例化:
Calender calender = Calender.getInstance();
方法:
get/set/add
getTime/setTime
三.JDK8 新出现的时间的
①为什么新出现时间的类
时间日期应该不可变
线程应该安全
②相关接口(时间的方法)
LocalDtae
LocalTime
LocalDateTime
③三者方法相同,以LocalDateTime为例
实例化:
LocalDateTime.now();//实例化
LocalDateTime.of(2020,10,6,13,23,300)//形参的实例化
方法:
a.getDayofMonth();//获得当前月的第几天
a.getDatofWeek();//获得当前周的第几天
a.withDayofMonth(22);//设置对象为当月的第几天
注意:该方法为返回新对象,而不是改变原有的对象。表明不变性
a.plusMoths(3);//加上3天
注意:该方法返回新对象,而不是改变原有的对象。表明不变性
a.minuspays(6);//减去6天
④Instant类
实例化:
Instant instant = Instant.now();//创建UTC时间的对象
方法:
Instant.atoffset(zoneoffset.offours(8))//设置时差,获得我们的实践对象
Instant.toEpochMill();//获取毫秒数
⑤格式化与解析日期或时间类DateTimeFormatter
实例化:
DateTimeFormater form = DateTimeFormater.Iso_Local_Date_TIME;
DateTimeFormater form = DateTimeFormater.ofPattern(“yyyy-MM-dd”);
方法:
form.format(LocalDateTime.now); //用日期转化为字符串
form.parse(“str”);//用字符串转化为日期
⑥例子
利用字符串获得LocalDateTime的类对象
String str =“2020-11-12”;
DateTimeFormater form = DateTimeFormater.ofPattern(“yyyy-MM-dd”);
LocalDateTime date =form.parse(str);
最终获得LocalDateTime的类并且日期为2020-11-12
⑦对应关系
java.util.Date --------instant(时间戳)
simpledateformat ---------datetimeformatter(格式化)
calender --------Localdatetime(时间)
四.JAVA比较器(对象的比较作用)
1.正常是== 和 !=来比较对象的地址,若想要比较对象即对象的属性,需要实现接口
2.接口comparable和comparator
3.comparable接口的实现(自然排序)
①类实现接口comparable且实现compareTo方法
②String类,包装类实现了comparable接口,都重写了compareTo方法,能比较两个对象
③重写compareTo()的规则
当前对象大于形参对象,返回正整数
当前对象小于形参对象,返回负整数
当前对象等于形参对象,返回0
④自定义实现comparable接口的compareTo的方法,需指明如何排序即在compareTo的方法
例如排序方法Arrays.sort(数组),在sort中传入的类数组会自动调用conpareTo方法来判断对象的大小
4.comparator接口的使用(定制排序)
①使用场景
未实现comparable接口的但是jar中的包
实现了comparable接口但是不满足要求
②重写compare方法
举例说明:
Array.sort(类[ ],new comparetor(){public int compare(){}})
即类的[]内部会调用comparetor中的compare方法
5.comparable和comparator的对比
comparable接口指定了实现类的对象在任何时候都可以比大小
comparator属于临时的比较