1. 本周学习总结

2. 书面作业

1.ArrayList代码分析

1.1 解释ArrayList的contains源代码

分析:该方法实现了ArrayList数组的遍历,从而确定所查内容是否存在

1.2 解释E remove(int index)源代码

分析:找到要移除的第index个元素,从第index+1个元素开始,索引全部往前移动一位,再将原来最后一个元素置空

1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?

答:不需要考虑。基本数据类型就不说了。说说类类型,ArrayList中的数组是用Object定义的,在Java中,每个类都是由Object扩展而来,即每个类都缺省继承Object类。

1.4 分析add源代码,回答当内部数组容量不够时,怎么办?

add方法用于添加一个元素到当前列表的末尾,

  1. public boolean add(E e) {
  2. ensureCapacityInternal(size + 1); //只要保持有size+1个容量就能保证加入成功
  3. elementData[size++] = e;
  4. return true;
  5. }
  1. private void ensureCapacityInternal(int minCapacity) {
  2. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  3. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  4. }
  5. ensureExplicitCapacity(minCapacity);//顾名思义,保证容量够用
  6. }
  1. private void ensureExplicitCapacity(int minCapacity) {
  2. modCount++;
  3. if (minCapacity - elementData.length > 0)
  4. grow(minCapacity);//如果需要的容量比当前容量大,则调用grow方法
  5. }
  1. private void grow(int minCapacity) {
  2. // overflow-conscious code
  3. int oldCapacity = elementData.length;
  4. int newCapacity = oldCapacity + (oldCapacity >> 1);//new=1.5*old
  5. if (newCapacity - minCapacity < 0)
  6. newCapacity = minCapacity;
  7. if (newCapacity - MAX_ARRAY_SIZE > 0)
  8. newCapacity = hugeCapacity(minCapacity);
  9. elementData = Arrays.copyOf(elementData, newCapacity);//copyOf,拷贝到新的数组中了
  10. }

1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?

  1. 隐藏对象的内部实现细节,即封装。在面向对象编程的Java中,我们只需要知道ArrayList这个类中有remove这个方法,而不需要知道它是怎么实现的。就像我们开车,只需要知道踩油门加速、踩刹车减速,而不需要知道发动机具体是怎么工作的

2.HashSet原理

2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?

  1. HashSet是个链表数组。每一个数组元素就是一个列表,我们称为散列表元
  2. 确定位置调用了hashCode方法,得到一个hash码,从而确定元素的存储地址,还调用equals方法,判断对象在数组中是否存在,存在则不添加。

2.2 选做:尝试分析HashSet源代码后,重新解释1.1

HashSet其实是通过HashMap实现的,添加也是通过put方法。

  1. public boolean add(E e) {
  2. return map.put(e, PRESENT)==null;
  3. }

再看put方法

  1. public V put(K key, V value) {
  2. return putVal(hash(key), key, value, false, true);
  3. }
  1. final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict){
  2. ••••••//so many code
  3. }
  4. //不过大概意思就是计算散列值,找到对应下标,从对应列表里面进行查找,如果有键相同的替换,没有就追加

3.ArrayListIntegerStack

题集jmu-Java-05-集合之5-1 ArrayListIntegerStack

3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)

  1. 数据结构不同,ArrayListIntegerStack使用ArrayList实现,而ArrayIntegerStack使用Integer数组实现,虽然本质上都是采用数组的方式,但是前者不需要考虑栈满的情况,能够动态地根据需要添加,而后者却需要事先定义好栈存大小,且不能更改。

3.2 简单描述接口的好处.

好处就是,你能用、我能用,只要有需要,就能用,而且能很好地辨别出谁在用。扩展性、灵活性强,一个接口多个实现,效率提高

4.Stack and Queue

4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。

  1. Java中的Stack类不是一个纯粹的Stack,其继承自Vector类,也就是说Vector类的所有成员Stack都能使用,这样造成了Stack可以不用采用LIFO的规则。
  1. package chpt04;
  2. import java.util.*;
  3. interface CustomStack<E> {//自定义栈
  4. public E push(E item);//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。
  5. public E pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
  6. public E peek(); //获得栈顶元素,如果为空,则返回null.
  7. public boolean empty(); //如果为空返回true
  8. public int size(); //返回栈中元素个数
  9. }
  10. class ArrayListIntegerStack<E> implements CustomStack<E> {
  11. private List <E>list;
  12. public ArrayListIntegerStack() {
  13. list=new ArrayList<E>();
  14. }
  15. @Override
  16. public E push(E item) {
  17. //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。
  18. if(item==null)
  19. return null;
  20. list.add(item);
  21. return item;
  22. }
  23. @Override
  24. public E pop() {
  25. //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
  26. if(list.isEmpty())
  27. return null;
  28. return list.remove(list.size()-1);
  29. }
  30. @Override
  31. public E peek() {
  32. //获得栈顶元素,如果为空,则返回null.
  33. if(list.isEmpty())
  34. return null;
  35. return list.get(list.size()-1);
  36. }
  37. @Override
  38. public boolean empty() {
  39. //如果为空返回true
  40. return list.isEmpty();
  41. }
  42. @Override
  43. public int size() {
  44. //返回栈中元素个数
  45. return list.size();
  46. }
  47. @Override
  48. public String toString() {
  49. return list.toString() ;
  50. }
  51. }
  52. public class Main2015023 {
  53. public static void main(String[] args) {
  54. // TODO Auto-generated method stub
  55. Scanner sc=new Scanner(System.in);
  56. CustomStack<String> stack=new ArrayListIntegerStack<String>();
  57. String st=sc.next();
  58. String stExchange="";
  59. for(int i=0;i<st.length();i++){
  60. String l=st.substring(i, i+1);//按字符顺序入栈
  61. stack.push(l);
  62. }
  63. for(int j=0;j<st.length();j++){
  64. String x=stack.pop();//按占内存数据出栈
  65. stExchange+=x;
  66. }
  67. if((st.equals(stExchange))==true)//比较先后两串字符串,若相同则为回文
  68. System.out.println("该字符串是回文");
  69. }
  70. }

4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)

  1. for (int i = 1; i <= n; i++) {
  2. int num = sc.nextInt();
  3. if (num % 2 == 0) {
  4. linkB.add(num);//偶数
  5. } else {
  6. linkA.add(num);//奇数
  7. }
  8. }
  1. while(!listA.isEmpty()&&!listB.isEmpty()){
  2. if(!listA.isEmpty()){
  3. System.out.print(listA.poll()+" ");//第一次
  4. if(!listA.isEmpty()){
  5. System.out.print(listA.poll()+" ");//第二次
  6. }
  7. }
  8. System.out.print(listB.poll()+" ");//奇二偶一
  9. }

然后将剩下的A队列或B队列全部出队

5.统计文字中的单词数量并按单词的字母顺序排序后输出

题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)

5.1 实验总结

  1. 出现的单词统计时只需统计一次,因此可以用Set来实现存储,而Set的实现类中TreeSet可以对对象进行排序

6.选做:加分考察-统计文字中的单词数量并按出现次数排序

题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)

6.1 伪代码

  1. List<Map.Entry<String, Integer>> strS =new ArrayList<Map.Entry<String, Integer>>(str.entrySet());
  2. Collections.sort(strS, new Comparator<Map.Entry<String, Integer>>() {
  3. public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
  4. return (o2.getValue() - o1.getValue());
  5. }
  6. });

6.2 实验总结

  1. 总的来说和5-2差不多,不过需要统计每个单词出现的次数,所以用Map来实现String-->Integer 的映射,value存储key出现的次数值。再通过ArrayList实现Comparator接口(这里我用的是匿名内部类),对value进行排序。同样的Map的实现类里有TreeMap可以对key进行排序。

3. 码云上代码提交记录及PTA实验总结

题目集:jmu-Java-05-集合

3.1. 码云代码提交记录

201521123023《Java程序设计》第7周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. 53. Maximum Subarray【leetcode】

    53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...

  2. Csharp调用基于Opencv编写的类库文件

    现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做GreenOpenCsharpWarper,简称GOCW. 一.CLR编写的DLL部分 1.按照正常方法引入Ope ...

  3. DoNet 高效开发必备开发工具

    工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢? 本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环 ...

  4. jQuery.Gantt

    使用jQuery.Gantt过程中,遇到的问题!

  5. 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测

    本文结构: 时间序列分析? 什么是ARIMA? ARIMA数学模型? input,output 是什么? 怎么用?-代码实例 常见问题? 时间序列分析? 时间序列,就是按时间顺序排列的,随时间变化的数 ...

  6. 开源社交系统ThinkSNS+ V0.8.0 正式发布(一期功能版本)

    智士软件旗下开源sns社交系统ThinkSNS即将进入10周年,推出并行两代系统ThinkSNSV4和ThinkSNS+,以专业易用的技术源码输出,驱动互联网社交软件建设及创业,使用ThinkSNS改 ...

  7. Python 第七天

    OOP 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.在Python中,所有数据类型都可以视为对象,当然也可以自定义对象.自定义的对象数据类型 ...

  8. 你以为你真的会用编辑器----之Vim

    Vim ----------------------- Vim下载地址:http://www.vim.org/download.php -------------------------------- ...

  9. php sql uuid 32位

    最近表中id需要用到此值来作为唯一主键 其含义是通用唯一识别码.具体好处及应用可百度百科,链接给你https://baike.baidu.com/item/UUID/5921266?fr=aladdi ...

  10. Requests抓取有道翻译结果

    Requests比urllib更加方便,抓取有道翻译非常的简单. import requests class YouDao():     def __init__(self,parm):        ...