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
方法作用,如下图所示:
我理解的意思是:关键字和值本无关系,通过put方法将二者联系起来
问题4:书上15.7中讲解代码时说程序中的
list.add(i);
等价于List.add(new Integer(i));
为了进一步学习,我将该代码改为注释中提示的形式问题4解决方法:程序正常编译、运行。
代码调试中的问题和解决过程
- 问题1:编译例子6时出现以下问题,如图:
- 问题1解决方案:在对
stack
的第一次压栈时,调用push
方法括号里是对Integer
类重新定义对象,修改程序后正常编译运行:
代码托管
上周考试错题总结
无
结对及互评
评分标准
- 正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
- 模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
- 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
- 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
博客中值得学习的或问题:
该同学把老师上课讲过的重点列了出来,体现了自己重点学习的过程。
感觉感悟那一块的内容可以在具体一点,比如说具体遇到什么问题,如何解决,从中收获了什么,或是教材学习中增长的关于调试代码的经验。
-
代码中值得学习的或问题:
- 无
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
- 本周结对学习情况
-
结对照片
- 结对学习内容
- XXXX
- XXXX
- ...
- 结对学习内容
其他(感悟、思考等,可选)
- 本周学习内容:链表、树集等泛型类,更好的将多元结构数据进行存储和下一步操作;其实这个和我们另一门课程数据结构和算法有很强的关联性。通过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版)]