发表于: 2018-01-25 21:45:17

0 572


一.今日完成

1.今天终于把后台资料管理五个接口写完跑通,其中查看资料列表基本实现功能,除了按照条件查询的要求更改业务逻辑外,修改了两处bug:

(1)补充sql的where子句条件,把所属不同类别的资料的获取放到sql语句中实现,

//查看课程下资料
if(type.equals(Data.TYPE_COURSE)){
if (DataUtils.isNotNullOrEmpty(subjectId)) {
params.put("subject_id", subjectId);
}
if (DataUtils.isNotNullOrEmpty(grade)) {
params.put("grade", grade);
}
if (DataUtils.isNotNullOrEmpty(courseId)) {
params.put("course_id", courseId);
}
if (DataUtils.isNotNullOrEmpty(lessionPeriodId)) {
params.put("lesson_period_id", lessionPeriodId);
}
params.put("book_id &  IS ", "NULL");
}

//查看教材下资料
if(type.equals(Data.TYPE_BOOK)){
if (DataUtils.isNotNullOrEmpty(grade)) {
params.put("grade", grade);
}
if (DataUtils.isNotNullOrEmpty(bookId)) {
params.put("book_id", bookId);
}else if(DataUtils.isNullOrEmpty(bookId)){
params.put("book_id &  IS ", "NOT NULL");
}
if (DataUtils.isNotNullOrEmpty(lessionPeriodId)) {
params.put("lesson_period_id", lessionPeriodId);
}

}

(2)对所有涉及到其他实体类方法调用的地方,一律在构造函数后加上isNotNullOrEmpty判断,避免空指针异常.

if (DataUtils.isNotNullOrEmpty( subject) && DataUtils.isNotNullOrEmpty(course) && DataUtils.isNotNullOrEmpty(lessonPeriod )) {

if (DataUtils.isNotNullOrEmpty(subject.getName()) && DataUtils.isNotNullOrEmpty(course.getName()) && DataUtils.isNotNullOrEmpty(lessonPeriod.getName())) {

}


2.梳理equals()和hashCode()方法使用

在Object类中定义了equals()和hashCode()这两个方法。Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。

equals

equals()方法是用来判断其他的对象是否和该对象相等,它的性质有:

自反性(reflexive)。对于任意不为null的引用值x,x.equals(x)一定是true。

对称性(symmetric)。对于任意不为null的引用值x和y,当且仅当x.equals(y)是true时,y.equals(x)也是true。

传递性(transitive)。对于任意不为null的引用值x、y和z,如果x.equals(y)是true,同时y.equals(z)是true,那么x.equals(z)一定是true。

一致性(consistent)。对于任意不为null的引用值x和y,如果用于equals比较的对象信息没有被修改的话,多次调用时x.equals(y)要么一致地返回true要么一致地返回false。

对于任意不为null的引用值x,x.equals(null)返回false。

对于Object类来说,equals()方法在对象上实现的是差别可能性最大的等价关系,即,对于任意非null的引用值x和y,当且仅当x和y引用的是同一个对象,该方法才会返回true。

需要注意的是当equals()方法被override时,hashCode()也要被override。按照一般hashCode()方法的实现来说,相等的对象,它们的hash code一定相等。

hashCode

hashCode()方法给对象返回一个hash code值。这个方法被用于hash tables,例如HashMap。

它的性质是:

在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。

如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果。

并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。

大量的实践表明,由Object类定义的hashCode()方法对于不同的对象返回不同的integer。


3.梳理String、StringBuffer、StringBuilder的区别

(1)可变与不可变

  String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

    private final char value[];

  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

    char[] value;

(2)是否多线程安全

  String中的对象是不可变的,也就可以理解为常量,显然线程安全。

  AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。

(3)StringBuilder与StringBuffer共同点

  StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

  抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

  StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

  最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。


二.明日计划

重新建后台管理模块的db,开始复用修真院后台代码.


三.遇到问题

在写接口过程中,发现对集合类和泛型类常用方法不熟悉,对什么时候适合用哪种集合也很难弄清楚.


四.收获

以上.



返回列表 返回列表
评论

    分享到