学习心得(泛型、算法及其他)

     1.泛型:
    J2SE自版本5.0之后,就加入了泛型。泛型使得开发过程更方便,代码更清晰,设计上来讲也使得软件更安全。新特性实现泛型的方式大概有以下几种。第一,类型参数。一般用<X>(X为大写字母)表示,主要是为了区分类型参数与其他标识符。第二,通配符。一般有<?>,<? extends X>,<? super X>几种表示方法。当函数的返回值依赖于类型参数时,建议使用类型参数<T>,否则应该使用通配符。(此建议来源于Java1.5泛型指南)。JDK集合类库中,大多数都同时用到了参数类型和通配符。例如类库中的Collection接口声明如下:
public interface Collection<E> extends Iterable<E> {
//此处省略部分代码
boolean add(E e);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
}
可以看到此处既用到了类型参数作为函数的参数,同时也用到了通配符。什么时候用哪种方式的参数来实现泛化的目的,就需要仔细斟酌了。在这儿要主要说明<? extends X>和<? super X>的区别。extends表示该类型为X的子类,而super表示该类型为X的父类。在这儿需要注意, 因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。举例说明:
//类的继承关系如下
class Life{}
class Human extends Life{}
class Man extends Human{}
//声明
List<? extends Human> extendsList;
List<? super Human> superList;
extendsList表示该列表为Human子类列表,而superList表示该列表为Human父类列表。其含义为,extendsList可以存放Human的子类对象,而superList可以存放父类为Human的对象。在实际使用时,extendsList.add(human)会导致编译错误,原因是该列表的声明指定了继承上限,而在实例化的时候,extendsList可能是Human的子类类型,增加的元素无法保证其就是泛化类型的子类。而superList.add(human)却可以,因为它的声明指定了继承的下限,保证了该列表在实例化时,至少会存储Human的子类或者是Human超类的子类,Human的子类当然可以add进去了。这儿在概念上很容易让人误解,理论知识让人很难理解,通过大量的练习,就会在实践中找到真知。
    2.算法:
    最近帮朋友做了一个小工具,在实现的时候,用到了两个算法,并通过一些数学知识验证了算法的正确性。看来数学对于计算机还是相当重要啊。
    算法一:要生成一个数据序列Xi,使得Xi属于闭区间[a,b],数据序列总和为m,数据序列个数为n。
    实现:
    1)首先判断m*n是否属于闭区间[an,bn],如果不属于,则无法无法生成,总和已超出了理论值的范围。
    2)如果参数在理论值范围之内,则可生成。首先,求出区间[a,b]的中间值,然后将其作为X1输出,然后将中间值依次加1,减1,加2,减2,... ... 依次类推,直到生成的个数符合参数所给个数为止。此时由于中间值在计算时不一定为整数,所以存在一定的误差,需要对生成的数据序列求和,和参数所给的m进行比较,看看差值为多少,再将这个差值的正负来决定将这个差值补齐到最小值还是最大值。
    3)输出序列X1 ... Xn。
    验证:
    根据上述实现可以看出,该数据序列为等差数列,规律明显。可用公式递推如下:
     (a+b)/2-n/2, ..., (a+b)/2-2, (a+b)/2-1, (a+b)/2,(a+b)/2+1,(a+b)/2+2,...,(a+b)/2+n/2。
    假设Sn为该数据序列之和,不难看出Sn=(a+b)*n/2+1。此时只需要证明该和介于a*n和b*n之间即a*n < (a+b)*n/2+1 < b*n。通过不等式的计算,a*n<Sn恒成立,而Sn<b*n在b-a>1时也恒成立。也就是说只要所给参数a和b之间的差值大于1,即可生成满足条件的数据序列而不会发生生成的数据序列中的某个值会超出这个范围。
    算法二:打乱一个数组中的数据。
    实现:
    1)初始化随机数发生器,将系统的当前精确时间作为种子进行初始化,保证每次生成的随机数各不一样。
    2)假设数组的下标从0到SIZE,则顺序遍历数组下标,每次都生成一个按系统精确时间为种子生成的随机数,保证该随机数介于0和SIZE之间,然后对当前遍历的数组索引i和刚才生成的随机数索引对应的元素进行内容置换。
    3)结束。
    3.MVC模式:
     最近开发的新工具中大量用到了此设计模式。基本设计思想是,将Model,View,Action以ID索引的方式配置到文件中,程序内部调用时,从全局配置文件中通过ID反射到对象,Action只负责事件转发,View只负表界面构造,Model只负责业务处理。这样做的好处是代码模块结构比较清晰,实现可以做到灵活处理,可扩展性强。当然也存在一些缺点,比如使用反射降低了效率,同时这种配置方式也导致了调用层次比较复杂,如果文档不够详细,代码跟踪起来多有不便。
    4.工作量评估:
    正如开会时老大所说,体力劳动者可以很明确地计算出工作量来,比如建一所房子需要多少块砖,每天能搬多少块砖,大概需要多少天。而脑力劳动者就比较难了,做一个软件,从需求,到设计,再到实现,验证,这些阶段都需要不停的去思考,时间真的很难估算。但作为有经验的从业人员来讲,这些能力都需要在日积月累的开发生涯中不断地完善,最终达到接近理想的目标。这也是需要锻炼和培养的一项工作能力。养成高效的工作习惯, 积极 乐观的去完成自已的使命。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值