1. 本周学习总结

以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

使用工具:百度脑图

2. 书面作业

1.ArrayList代码分析

1.1 解释ArrayList的contains源代码

  1. contains部分源代码:
  2. public boolean contains(Object o) {
  3. return indexOf(o) >= 0;
  4. }
  5. public int indexOf(Object o) {
  6. if (o == null) {
  7. for (int i = 0; i < size; i++)
  8. if (elementData[i]==null)
  9. return i;
  10. } else {
  11. for (int i = 0; i < size; i++)
  12. if (o.equals(elementData[i]))
  13. return i;
  14. }
  15. return -1;
  16. 分析:contains方法在执行后首先会调用indexOf()方法。indexOf()方法会判断传入的对象是否为空,如果为空,则遍历整个集合的元素,如果集合的某个元素为空,返回该元素的下标。如果传入对象不为空,则遍历整个集合的元素,如果该元素和集合内某个元素的equals比较结构为true,返回该元素下标。可以看到如果遍历完集合后没有元素存在于集合中就返回-1
  17. 结论:判断集合中是否含有此元素;有,返回true。没有,返回false

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


  1. E remove(int index)源代码:
  2. public E remove(int index) {
  3. RangeCheck(index);
  4. modCount++;
  5. E oldValue = (E) elementData[index];
  6. int numMoved = size - index - 1;
  7. if (numMoved > 0)
  8. System.arraycopy(elementData, index+1, elementData, index,
  9. numMoved);
  10. elementData[--size] = null; // Let gc do its work
  11. return oldValue;
  12. }
  13. 分析:首先是检查范围,修改modCount,保留将要被移除的元素,将移除位置之后的元素向前挪动一个位置,将list末尾元素置空(null),返回被移除的元素。
  14. 结论: 删除ArrayList的指定元素

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

  1. 1.11.2中并没有对ArrayList的数据类型有任何定义,可知ArrayList存储数据时不需要考虑元素的类型。

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

  1. ArrayListadd方法
  2. /**
  3. * Appends the specified element to the end of this list.
  4. *
  5. * @param e element to be appended to this list
  6. * @return <tt>true</tt> (as specified by {@link Collection#add})
  7. */
  8. public boolean add(E e) {
  9. ensureCapacityInternal(size + 1); // Increments modCount!!
  10. elementData[size++] = e;
  11. return true;
  12. }
  13. //添加操作,首先会调用ensureCapacityInternal(size + 1),其作用为保证数组的容量始终够用,其中size是elementData数组中元组的个数,初始为0。
  14. ArrayListensureCapacityInternal方法
  15. private void ensureCapacityInternal(int minCapacity) {
  16. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  17. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  18. }
  19. ensureExplicitCapacity(minCapacity);
  20. }
  21. private void ensureExplicitCapacity(int minCapacity) {
  22. modCount++;
  23. // overflow-conscious code
  24. if (minCapacity - elementData.length > 0)
  25. grow(minCapacity);
  26. }
  27. //在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensureExplicitCapacity()。

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

  1. private void rangeCheck(int index)源代码:
  2. /**
  3. * Checks if the given index is in range.
  4. */
  5. private void RangeCheck(int index) {
  6. if (index >= size)
  7. throw new IndexOutOfBoundsException(
  8. "Index: "+index+", Size: "+size);
  9. }
  10. 就是检查一下是不是超出数组界限了,超出了就抛出IndexOutBoundsException异常。
  11. 使用private声明,说明此方法只在代码内部进行,外部也确实不会用到这个方法,所以没必要用public

2.HashSet原理

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

  1. HashSet的存储形式用链表数组实现->每个列表被称为桶。
  2. 当我们向HashSet中添加一个元素时,HashSet会先调用该对象的hashCode()方法得到其hashCode值,根据该值决定该对象在桶中存储位置。
  3. 如果桶中已有其他元素,则调用加入对象的equals()方法与已有元素进行比较。如果比较结果为假,则将对象插入桶中。如果比较结果为真,则用新的值替换旧的值。//详见PPT《集合》33.34页

3.ArrayListIntegerStack

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

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

  1. public ArrayIntegerStack(int n) {
  2. this.arr = new Integer[n];
  3. }
  4. public ArrayListIntegerStack(){
  5. this.list = new ArrayList<Integer>();
  6. }
  7. ArrayListIntegerStack是用ArrayList来实现栈,ArrayIntegerStack是用Integer数组来实现栈。

3.2 简单描述接口的好处.

  1. 两个类都继承了一个接口,那就是IntegerStack.
  2. 假设在 ArrayIntegerStack的基础上,如果我需求改变了,我不想用 ArrayIntegerStack ,想用ArrayListIntegerStack,那么按照上面写的话,只需要改下部分代码,否则需要改的就多了。
  3. 简单打比方,你定义一个杀鸡的接口,再写个用小刀来杀的实现类,以后用接口就可以了,如果想换牛刀的话,自己再定义一个用牛刀的实现类,然后在代码中改成换牛刀的就好,这样就不需要你改大量代码了。

4.Stack and Queue

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

  1. public class Main201521123051 {
  2. public static void main(String[] args){
  3. Scanner input=new Scanner(System.in);
  4. System.out.print("Enter a string: ");
  5. String s=input.nextLine();
  6. if(isPalindrome(s))
  7. System.out.println(s+" is a palindrome");
  8. else
  9. System.out.println(s+" is not a palindrome");
  10. }
  11. public static boolean isPalindrome(String s){
  12. int low=0;
  13. int high=s.length()-1;
  14. while(low<high){
  15. if(s.charAt(low)!=s.charAt(high))
  16. return false;
  17. low++;
  18. high--;
  19. }
  20. return true;
  21. }
  22. }

示例

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

  1. for (int i = 1; i <= n; i++) {
  2. int sc = scanner.nextInt();
  3. if (sc % 2 == 0) {
  4. B.offer(x);
  5. } else {
  6. A.offer(x);
  7. }
  8. }
  9. 区分奇偶。
  10. while(!A.isEmpty() || !B.isEmpty())
  11. {
  12. Integer a = A.poll();
  13. if(a1 != null){
  14. if(B.isEmpty() && A.isEmpty())
  15. System.out.print(a);
  16. else
  17. System.out.print(a + " ");
  18. ... ...
  19. }

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

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

  1. package homework;
  2. import java.util.Scanner;
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5. public class Main02 {
  6. public static void main(String[] args) {
  7. Scanner sc=new Scanner(System.in);
  8. Set<String> arr = new TreeSet<String>();
  9. String str=null;
  10. while(true)
  11. {
  12. String word=sc.next();
  13. if(word.equals("!!!!!"))break;
  14. arr.add(word);
  15. }
  16. System.out.println(arr.size());
  17. int i=0;
  18. for(String s:arr)
  19. {
  20. if(i==10)break;
  21. else if(i>arr.size())break;
  22. System.out.println(s);
  23. i++;
  24. }
  25. }
  26. }

5.1 实验总结

  1. 使用了Set的自然排序实现类TreeSet可较容易完成本题。
  2. TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。

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

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

6.1 伪代码

6.2 实验总结

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

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

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2. PTA实验

编程(5-1, 5-2, 5-3(选做), 5-6)

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

  1. 201521123027 <java程序设计>第七周学习总结

    1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...

  2. 201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第七周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...

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

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

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

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

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

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  6. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  7. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

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

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

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

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

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

    20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...

随机推荐

  1. [BZOJ 3629][ JLOI2014 ]聪明的燕姿

    这道题考试选择打表,完美爆零.. 算数基本定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数, ...

  2. HDU 1159 Common Subsequence:LCS(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意: 求最长公共子序列. 题解: (LCS模板题) 表示状态: dp[i][j] = max ...

  3. 使用MySQL-Proxy读写分离时的注意事项

    在动手操作前最好先安装好MySQL-Proxy,并配置好MySQL主从服务器.补充:新版MySQL已经内建支持 延迟问题 读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSync ...

  4. re模块的结果小练习题

    1.匹配标签 import re ret = re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)>','<h1& ...

  5. java代码_按要求输出相应沙漏

    package Callatz;/* 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印******* *****   ***    *   ...

  6. JMeter网站测试分析

     WEB类型: User Driver:以用户量作为衡量系统性能的主要指标的系统,典型如IM系统.企业 内部业务系统: TPS-Driver:以tps作为衡量系统性能的主要指标的系统,典型的如消息系统 ...

  7. 实现Echarts折线图的虚实转换

    需求:医院的体温单,在统计体温时,对于正常情况下统计的体温数据,需要显示实线:对于进行物理降温后统计的体温数据,需要显示虚线. 现有的体温单是运用 Echarts 折线图,统一用实线显示.因此在这基础 ...

  8. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  9. Java设计模式 (转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  10. Servlet的执行流程、生命周期

    下面这幅图的Request和Response的箭头方向反了,应该是客户端发出请求,然后web服务器返回响应. servlet生命周期阶段包括初始化.加载.实例化.服务和销毁.  编写Servlet的d ...