javase学习第十九天:java常用类(StringBuffer和StringBuider)

一.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属于临时的比较

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值