1. 本周学习总结

2. 书面作业

1. ArrayList代码分析

1.1 解释ArrayList的contains源代码

源代码:

  1. public boolean contains(Object o) {
  2. return indexOf(o) >= 0;
  3. }
  1. public int indexOf(Object o) {
  2. if (o == null) {
  3. for (int i = 0; i < size; i++)
  4. if (elementData[i]==null)
  5. return i;
  6. } else {
  7. for (int i = 0; i < size; i++)
  8. if (o.equals(elementData[i]))
  9. return i;
  10. }
  11. return -1;
  12. }

分析:该方法通过返回被传入对象的下标值是否有效,来判断该对象是否被包含。

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

源代码:

  1. public E remove(int index) {
  2. rangeCheck(index);
  3. modCount++; //记录修改次数,避免对列表进行迭代时产生异常。
  4. E oldValue = elementData(index);
  5. int numMoved = size - index - 1;
  6. if (numMoved > 0)
  7. System.arraycopy(elementData, index+1, elementData, index,
  8. numMoved);
  9. elementData[--size] = null; // clear to let GC do its work
  10. return oldValue;
  11. }

补充:

  1. public static native void arraycopy(Object src, int srcPos,
  2. Object dest, int destPos,
  3. int length);

分析:该方法通过接收对象的下标,达到删除该对象的目的。首先通过rangeCheck(index);判断是否越界,若越界抛出IndexOutOfBoundsException异常;调用System的一个本地方法arraycopy将从index+1之后的元素复制到从index开始的位置。

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

分析:由以上分析可知ArrayList内部采用Object类型的数组来存储数据,所有类都继承自Object由多态的知识可知自然是不用考虑元素的类型的,查看ArrayList的源代码时也可以发现ArrayList支持泛型操作。

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

源代码:

  1. public boolean add(E e) {
  2. ensureCapacityInternal(size + 1); // Increments modCount!!
  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. // overflow-conscious code
  4. if (minCapacity - elementData.length > 0)
  5. grow(minCapacity);
  6. }
  1. private void grow(int minCapacity) {
  2. // overflow-conscious code
  3. int oldCapacity = elementData.length;
  4. int newCapacity = oldCapacity + (oldCapacity >> 1);
  5. if (newCapacity - minCapacity < 0)
  6. newCapacity = minCapacity;
  7. if (newCapacity - MAX_ARRAY_SIZE > 0)
  8. newCapacity = hugeCapacity(minCapacity);
  9. // minCapacity is usually close to size, so this is a win:
  10. elementData = Arrays.copyOf(elementData, newCapacity);
  11. }

分析:当我们调用add方法时其内部再通过ensureExplicit方法来判断是否需要扩容,若需要则调用grow进行扩容。

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

分析: rangeCheck方法只需为ArrayList类进行服务,当我们使用ArrayList时我们不需要把重点放到是否出现越界这种逻辑问题上,这中问题的检查应该在内部实现的,而我们不需要关心其具体的实现细节。

2. HashSet原理

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

分析:通过调用hashcode获得哈希码,依照哈希码将对象放入对应的哈希桶中,若哈希桶中没有对象则直接放入,否则调用该对象的equals方法进行比较,相同不收集,不相同收集。

2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)

分析:时间复杂度为O(1),由上题分析可知将元素加入HashSet需调用HashCode计算哈希码来确定位置,而不是通过遍历。

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

源代码:

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

分析:由此可知 HashSet内部是基于HashMap来实现的,接下来查看HashMap

源代码:

  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,
  2. boolean evict) {
  3. Node<K,V>[] tab; Node<K,V> p; int n, i;
  4. if ((tab = table) == null || (n = tab.length) == 0)
  5. n = (tab = resize()).length;
  6. if ((p = tab[i = (n - 1) & hash]) == null)
  7. tab[i] = newNode(hash, key, value, null);
  8. else {
  9. Node<K,V> e; K k;
  10. if (p.hash == hash &&
  11. ((k = p.key) == key || (key != null && key.equals(k))))
  12. e = p;
  13. else if (p instanceof TreeNode)
  14. e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
  15. else {
  16. for (int binCount = 0; ; ++binCount) {
  17. if ((e = p.next) == null) {
  18. p.next = newNode(hash, key, value, null);
  19. if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
  20. treeifyBin(tab, hash);
  21. break;
  22. }
  23. if (e.hash == hash &&
  24. ((k = e.key) == key || (key != null && key.equals(k))))
  25. break;
  26. p = e;
  27. }
  28. }
  29. if (e != null) { // existing mapping for key
  30. V oldValue = e.value;
  31. if (!onlyIfAbsent || oldValue == null)
  32. e.value = value;
  33. afterNodeAccess(e);
  34. return oldValue;
  35. }
  36. }
  37. ++modCount;
  38. if (++size > threshold)
  39. resize();
  40. afterNodeInsertion(evict);
  41. return null;
  42. }

分析: 看的不是很懂,不过好像是如果对象的映射已经存在则用新的值代替旧的值并返回旧的值,如果不存在则建立新的映射?

3. ArrayListIntegerStack

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

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

分析:不同之处在与内部的实现不同,之前用的是数组。这次用的是ArrayList,这也导致了内部一些具体的实现细节不同。用数组操作时需要一个top指针来判断栈顶的位置,从而进行是否为空,入栈出栈的操作;用ArrayList时要简化很多,不需要top指针,利用其自带的方法就可实现出栈入栈等操作。

3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。

分析:在这两个例子中,将一些共有的行为抽象出来了形成IntegerStack接口(协议),两个实现类都具有该接口的功能(遵守协议),即,出栈,入栈,判断是否为空等,但是一个用数组实现一个用ArrayList实现,实现的细节不同。这就是接口的好处。

4. Stack and Queue

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

代码:

  1. package test;
  2. import java.util.Deque;
  3. import java.util.Iterator;
  4. import java.util.LinkedList;
  5. import java.util.Scanner;
  6. /**
  7. * 回文检测
  8. * @author 周文华 201621123008
  9. *
  10. */
  11. public class Main {
  12. public static String[] strSplit(String str) {
  13. String[] strList = str.split("");
  14. return strList;
  15. }
  16. public static void main(String[] args) {
  17. Deque dq = new LinkedList<String>();
  18. Scanner in = new Scanner(System.in);
  19. String[] strs = strSplit(in.nextLine());
  20. String str1 = "";
  21. String str2 = "";
  22. for (int i = 0; i < strs.length; i++) {
  23. dq.add(strs[i]);
  24. }
  25. Iterator descendingiterator = dq.descendingIterator();
  26. Iterator iterator = dq.iterator();
  27. while (iterator.hasNext()) {
  28. str1 += iterator.next();
  29. }
  30. while (descendingiterator.hasNext()) {
  31. str2 += descendingiterator.next();
  32. }
  33. //System.out.println(str1);
  34. //System.out.println(str2);
  35. System.out.println(str1.equals(str2));
  36. }
  37. }

运行结果:



4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?

代码:

  1. import java.util.Deque;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. import java.util.Scanner;
  5. public class Main7 {
  6. public static void main(String[] args) {
  7. Scanner sc = new Scanner(System.in);
  8. Queue<Integer> arrAQueue = new LinkedList<>();
  9. Queue<Integer> arrBQueue = new LinkedList<>();
  10. String[] strs = sc.nextLine().split(" ");
  11. if (Integer.parseInt(strs[0]) <= 1000) {
  12. for (int i = 1; i < strs.length; i++) {
  13. int temp1 = Integer.parseInt(strs[i]);
  14. if (temp1 % 2 == 0) {
  15. arrBQueue.add(temp1);
  16. } else {
  17. arrAQueue.add(temp1);
  18. }
  19. }
  20. }
  21. int i=0;
  22. if(!arrAQueue.isEmpty())
  23. System.out.print(arrAQueue.poll());
  24. else {
  25. System.out.print(arrBQueue.poll());
  26. }
  27. while(!arrAQueue.isEmpty()||!arrBQueue.isEmpty()) {
  28. i++;
  29. if(i%2==0) {
  30. if(!arrAQueue.isEmpty())
  31. System.out.print(" "+arrAQueue.poll());
  32. }else {
  33. if(!arrAQueue.isEmpty())
  34. System.out.print(" "+arrAQueue.poll());
  35. if(!arrBQueue.isEmpty())
  36. System.out.print(" "+arrBQueue.poll());
  37. }
  38. }
  39. }
  40. }

使用了LinkedList,便于出栈操作。

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

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

5.1 实验总结

总结:

  • 使用TreeMap按单词的字母顺序排序。key为单词,value为单词数量。

  • 一行一行读入,使用split("\s+")分割多空格。

  • 判断是否包含,不包含则加入,value置为1,否则不加入value+1。

  • 使用迭代器输出。

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

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

6.1 伪代码

  1. 创建**TreeMap**对象
  2. 进入循环按行读入字符串,以!!!!!跳出循环。
  3. 对每行字符串使用split("\\s+")分割。
  4. 判断单词是否存在,不存在则加入,value置为1,存在则不加入,value+1
  5. 输出该对象的长度。
  6. 创建List对象:List<Entry<String,Integer>> list=new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
  7. 使用Collection.sortList对象进行排序,按照value进行升序。
  8. 使用Entry<String,Integer>entry=list.get(i);输出。

6.2 实验总结

总结: 新学的知识点

  • Map.Entry<K,V>接口: Map的内部接口,表示一个Map实体,即key-value键值对。内含有getKey(), getValue方法。

3.码云及PTA

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

3.1. 码云代码提交记录

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

3.2 截图PTA题集完成情况图





3.3 统计本周完成的代码量

周次 总代码量 新增文件代码量 总文件数 新增文件数
1 665 20 20 20
2 1705 23 23 23
3 1834 30 30 30
4 1073 1073 17 17
5 1073 1073 17 17
6 2207 1134 44 27
7 3292 1085 59 15
8 3505 213 62 3
9 8043 1246 153 16

统计的路径换了一下。

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

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

    1.本周学习总结 1.1思维导图 2.书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 总结:判断List中是否存在指定元素,需要用到equals方法,若存在就用remove进 ...

  2. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

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

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

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

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

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

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

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

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

  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. ASP.NET 三级联动

    三级联动就是用三个下拉列表框DropDownList,每个里面添加相应的东西,在第一个列表框中选择一个值,第二三个列表框都会根据第一个选择进行相应的变化,在第二个列表框中选择一个值,第三个列表框也会根 ...

  2. linux移植常见问题

    *************1.给板子添加新的驱动**************** 一.       驱动程序编译进内核的步骤在 linux 内核中增加程序需要完成以下三项工作:1. 将编写的源代码复制 ...

  3. linux系统上项目部署

    步骤:(特别注意:虚拟机安装的一般是32位的操作系统,jdk也必须使用32位的)查看虚拟机版本:sudo uname --m i686 //表示是32位 x86_64 // 表示是64位 查看是否已经 ...

  4. cdnbest如何配置ssl证书

    cdnbest添加ssl证书有三种方式: 一.第一种在站点设置中添加: 点打开,加入证书后点提交 可以点检测功能检查证书是否有效,打勾说明证书是有效的 二. 第二种是在域名记录里添加: 如下图点击,添 ...

  5. 算法之LOWB三人组之选择排序

    选择排序 思想是在一个列表中每次循环一遍,拿到最小值,接着再从剩下的无序区中继续拿最小值,如此循环,直到结束. 时间复杂度为O(n^2) # 最简单的一个选择排序,循环一个列表,拿到最小值,添加到一个 ...

  6. oracle取某字符串字段的后4位

    参考 https://zhidao.baidu.com/question/2142799026528780468.html select substr('str1234', -4) from dual

  7. rancher 2 webhook 格式

    { "version":"4", "groupKey":<string>, "status":"& ...

  8. 静态方法调用内部类时候的new 问题

    package tool; /** * 静态方法调用内部类时候的new 问题 */ public class aa { // 静态方法 // 静态方法new 有问题 public static voi ...

  9. Codeforces Beta Round #46 (Div. 2)

    Codeforces Beta Round #46 (Div. 2) http://codeforces.com/contest/49 A #include<bits/stdc++.h> ...

  10. Sigar--系统性能监测

    Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API.可以收集的信息包括: 1, CPU信息,包括基本信 ...