20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

时间:2024-10-08 16:34:02

20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

教材学习内容总结

第十五章 泛型与集合框架

  • 泛型:主要目的是可以建立具有类型安全的集合框架,如链表、散列映射等数据结构。

    • 可以声明为: class People<E>
    • E是其中的泛型,可以是任何对象或接口,但不能是基本类型数据。
    • 使用泛型类声明对象
      • 泛型类声明和创建对象时,类名后多了一对“<>”,而且必须要用具体的类型替换“<>”中的泛型。例如:
        • Cone<Circle> coneOne;
        • coneOne =new Cone<Circle>(new Circle());
  • 链表:由若干个称作节点的对象组成的一种数据结构,每个节点含有一个数据和下一个节点的引用 。

    • LinkedList<E>泛型类:创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象。例如:
      • LinkedList<String> mylist=new LinkedList<String>();
    • 遍历链表
      • 当用户需要遍历集合中的对象时,应当使用该集合提供的迭代器,而不是让集合本身来遍历其中的对象。
      • 链表对象可以使用iterator()方法获取一个Iterator对象,该对象就是针对当前链表的迭代器。
  • 排序与查找

    • Collections类提供的用于排序和查找的类方法如下:
      • public static sort(List<E> list) 该方法可以将list中的元素升序排列。
      • int binarySearch(List<T> list, T key,CompareTo<T> c) 使用折半法查找list是否含有和参数key相等的元素,如果key链表中某个元素相等,方法返回和key相等的元素在链表中的索引位置(链表的索引位置从0考试),否则返回-1。
  • 洗牌与旋转

    • Collections类还提供了将链表中的数据重新随机排列的类方法以及旋转链表中数据的类方法。
      • public static void shuffle(List<E> list)list中的数据按洗牌算法重新随机排列。
      • static void rotate(List<E> list, int distance) 旋转链表中的数据。(所有元素均向右移一位)
      • public static void reverse(List<E> list) 翻转list中的数据。
  • 堆栈

    • 堆栈是一种“后进先出”的数据结构,只能在一端进行输入或输出数据的操作。
    • Stack<E>泛型类创建一个堆栈对象,堆栈对象常用方法:
      • public E push(E item);实现压栈操作

      • public E pop();实现弹栈操作。

      • public boolean empty();判断堆栈是否还有数据。

      • public E peek();获取堆栈顶端的数据,但不删除该数据。

      • public int search(Object data);获取数据在堆栈中的位置。

  • 散列映射

    • HashMap<K,V>对象采用散列表这种数据结构存储数据,习惯上称HashMap<K,V>对象为散列映射。
    • 该泛型类实现了泛型接口Map<K,V>,可以用接口回调技术,那么接口变量就可以调用类实现的接口方法。
  • 树集

    • TreeSet<E>泛型类:适合用于数据的排序
      • 例如:
        • TreeSet<String> mytree=new TreeSe<String>();
      • 然后使用add方法为树集添加节点,例如:
        • mytree.add("boy");
    • 树映射
      • TreeMap<K,V>类实现了Map<K,V>接口,称TreeMap<K,V>对象为树映射。
      • 树映射的结点存储关键字/值对。
  • 自动装箱与拆箱

    • 自动装箱:程序允许把一个基本数据类型添加到类似链表等数据结构中,系统会自动完成基本类型到相应对象的转换。
      • 例如:
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=0;i<10;i++) {
list.add(i); //自动装箱,实际添加到list中的是new Integer(i)。
}

该段程序中的list.add(i);等价于List.add(new Integer(i));

  • 自动拆箱:即自动装箱逆过程。

教材学习中的问题和解决过程

  • 问题1:在学习书上P446例子2代码时,不明白以下代码中泛型类List为何创建对象为LinkList

    List<String> list=new LinkedList<String>();
  • 问题1解决方案:

    在书上P445上方找到了答案:“LinkedList泛型类中的绝大部分方法都是泛型接口方法的实现。编程时,可以使用接口回调技术,即把LinkedList<E>对象的引用赋值给Collection<E>接口变量或List<E>接口变量,接口就可以调用类实现的接口方法。”
  • 问题2:不是很理解如书上例子5、6中遍历每个链表中或栈中的元素时,总是用Integer建立对象来作为输出媒介。
  • 问题2解决方法:通过查阅API得知:Integer类的作用,以及两个泛型类都是用的Integer类做的泛型,以实现元素的整型数据类型输出。
  • 问题3:不清楚书上P458上例子9如下代码的作用
for(int k=0;k<student.length;k++)
treemap.put(key[k],student[k]);
  • 问题3解决方法:通过查询API,找到了put方法作用,如下图所示:

    20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

我理解的意思是:关键字和值本无关系,通过put方法将二者联系起来

  • 问题4:书上15.7中讲解代码时说程序中的list.add(i);等价于List.add(new Integer(i));为了进一步学习,我将该代码改为注释中提示的形式20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

  • 问题4解决方法:程序正常编译、运行。

    20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

代码调试中的问题和解决过程

  • 问题1:编译例子6时出现以下问题,如图:

    20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

  • 问题1解决方案:在对stack的第一次压栈时,调用push方法括号里是对Integer类重新定义对象,修改程序后正常编译运行:

    20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

代码托管

20175227张雪莹 2018-2019-2 《Java程序设计》第八周学习总结

上周考试错题总结

结对及互评

  • 博客中值得学习的或问题:

  • 该同学教材学习情况总结精炼,有自己的侧重点

  • 忘记写感悟了

  • 代码中值得学习的或问题:

  • 基于评分标准,我给本博客打分:10分。得分情况如下:正确使用Markdown语法(加1分);模板中的要素齐全(加1分);教材学习中的问题和解决过程, 一个问题加1分;代码调试中的问题和解决过程, 一个问题加1分;本周有效代码超过300分行的(加2分);排版精美的加一分;代码Commit Message规范的加1分;点评认真,能指出博客和代码中的问题的加1分;结对学习情况真实可信的加1分

点评过的同学博客和代码

其他(感悟、思考等,可选)

  • 本周学习内容:链表、树集等泛型类,更好的将多元结构数据进行存储和下一步操作;其实这个和我们另一门课程数据结构和算法有很强的关联性。通过java语言中链表、树集与C语言实现方式的比较,更好的看出了Java语言的优势:排序、删除、加入等操作都无需自己编程,直接调用方法即可。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
第一周 11/11 1/1
第二周 262/273 1/2
第三周 642/915 1/3
第四周 384/1299 2/5
第五周 661/1960 1/6
第六周 1031/2991 2/8
第七周 123/3114 2/10
第八周 941/4055 2/12

参考资料

  • [Java2实用教程(第5版)]