`
hcx_2008
  • 浏览: 121528 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

阅读更多
    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.工作量评估:
    正如开会时老大所说,体力劳动者可以很明确地计算出工作量来,比如建一所房子需要多少块砖,每天能搬多少块砖,大概需要多少天。而脑力劳动者就比较难了,做一个软件,从需求,到设计,再到实现,验证,这些阶段都需要不停的去思考,时间真的很难估算。但作为有经验的从业人员来讲,这些能力都需要在日积月累的开发生涯中不断地完善,最终达到接近理想的目标。这也是需要锻炼和培养的一项工作能力。养成高效的工作习惯,积极乐观的去完成自已的使命。
分享到:
评论

相关推荐

    Java集合框架及泛型

    提供的算法类包括`sort()`, `binarySearch()`, `reverse()`, `shuffle()`等。 泛型是Java中处理类型安全的一种方式,允许我们在类、接口和方法中指定类型参数。这样,编译器可以在编译时检查类型一致性,防止在运行...

    编程之法:面试和算法心得(高清扫描+书签)

    本书涉及面试、算法、机器学习三个主题。书中的每道编程题目都给出了多种思路、多种解法,不断优化、逐层递进。本书第1章至第6章分别阐述字符串、数组、树、查找、动态规划、海量数据处理等相关的编程面试题和算法,...

    java学习心得

    从给定的文件信息中,我们可以提炼出一系列与Java学习及面向对象编程(Object-Oriented Programming,简称OOP)相关的关键知识点。以下是对这些知识点的详细解析: ### 面向对象编程概述 面向对象编程是一种被广泛...

    c++学习心得2.zip

    "C++学习心得2.zip"这个压缩包可能包含了作者在深入学习C++时积累的经验和笔记,旨在帮助其他自学者更好地理解和掌握这门强大的编程语言。从"interview-master"这个文件名来看,我们可以推测这是一份关于C++面试题目...

    leetcode算法学习笔记,Python,Golang,Java.zip

    本压缩包文件“leetcode算法学习笔记,Python,Golang,Java.zip”包含了针对这三种主流编程语言的解题心得和实战技巧,对于程序员尤其是准备面试或提高算法水平的开发者来说,是一份极有价值的学习资源。...

    java 经典自学程序及学习笔记心得

    这份“java经典自学程序及学习笔记心得”压缩包是学习Java编程的宝贵资源,包含了实战程序和作者的学习经验,旨在帮助初学者和进阶者更好地理解和掌握Java技术。 一、Java经典程序 Java经典程序通常包括了基础语法...

    C++自己学习的笔记和心得

    2. **类模板**:类模板可以生成处理不同类型数据的类,提供了泛型数据结构和算法,如STL(Standard Template Library)中的容器(vector、list、set等)和算法(sort、find等)。 【异常处理】 C++提供了一种处理...

    数据结构与算法分析 C++ 描述

    - **社区和论坛**:参与相关的技术社区和论坛,与其他开发者交流经验和心得。 通过以上知识点的总结,我们可以看到《数据结构与算法分析 C++》这本书涵盖了广泛的数据结构与算法主题,并结合了C++语言的特点进行了...

    JAVA学习心得.pdf

    在Java编程语言的学习过程中,掌握基础的集合框架、排序算法、字符串操作以及I/O流的使用至关重要。以下是一些核心知识点的详细说明: 1. **集合框架**:Collection是Java集合框架中的顶级接口,它是Set和List的父...

    C++学习笔记、心得

    这份"C++学习笔记、心得"涵盖了从基础语法到面向对象编程的概念,是作者一个半月辛勤学习的结晶。在这里,我们将深入探讨其中可能包含的知识点,并提供一些理解和应用C++的关键指导。 1. **基础语法**:C++的基础...

    C++心得--经验总结

    2. **模板**:C++的模板功能强大,可以用于创建泛型代码,实现数据类型的通用性。包括函数模板和类模板,掌握模板元编程也是提高代码复用性的关键。 3. **STL(Standard Template Library)**:C++标准库中的重要...

    关于自己再次巩固和学习c、c++的一些及学习历程.zip

    这篇压缩包文件"关于自己再次巩固和学习 c、c++ 的一些及学习历程.zip"似乎包含了一位程序员的学习过程和经验分享,可能包括代码示例、笔记、心得等资源。 C 语言是许多现代编程语言的基础,它的核心概念包括变量、...

    c++ 源代码阅读心得

    以下是我从“c++ 源代码阅读心得”这个主题中总结的一些关键知识点: 1. **理解C++基础**:在开始阅读C++源代码之前,对基本语法、类、对象、函数、指针、模板等核心概念的理解是必不可少的。熟悉标准库,如STL...

    经典老程序员C++心得,适合C++的学者编程提高

    在C++编程的世界里,掌握经典的心得与规范至关重要,尤其对于希望提升技能的老程序员和初学者来说。本文将深入探讨C++编程规范、经典的...这份"经典老程序员C++心得.pptx"文件,无疑是你进一步学习和提升的宝贵资源。

    C++(VS2019)学习笔记.zip

    2. **STL标准模板库《号重载.cpp**:STL(Standard Template Library)是C++的标准库,包含容器(如vector、list、set等)、迭代器、算法和函数对象。"号重载"可能是指对操作符#的重载,这在自定义类型时常见,以...

    C++技术心得

    在深入探讨"C++技术心得"之前,我们先要理解C++这一编程语言的核心特性。C++是1983年由Bjarne Stroustrup在C语言的基础上发展起来的,它结合了过程化编程、面向对象编程和泛型编程,使得程序员能够更高效地构建大型...

    我的C++心得 大家指教指教!!!

    3. **模板和泛型编程**:C++的模板允许创建泛型代码,提高代码的复用性。理解模板类和函数模板的用法,以及模板特化,可以写出更灵活的代码。 4. **STL(Standard Template Library)**:STL是C++的标准库,包含...

    MyJavaStudy:Java算法实践

    在"描述"中提到的"我的Java学习",暗示了这个项目可能还包括了作者在学习过程中的一些心得笔记,或者是对算法理解和应用的个人见解。这对于我们来说,不仅是一份代码资源,还可能是一份宝贵的学习经验分享,帮助我们...

    如何学习QT设计与开发

    - **分享经验**: 将自己的学习心得和项目经验分享出去,有助于提升个人影响力。 #### 六、阅读 QT 源码与相关实战案例 - **源码分析**: 通过阅读QT源码来深入了解框架的设计思路和实现细节。 - **实战案例**: 分析...

Global site tag (gtag.js) - Google Analytics