201521123014 《Java程序设计》第7周学习总结

1. 本周学习总结

2. 书面作业

Q1 ArrayList代码分析

1.1 解释ArrayList的contains源代码

先看看contains的源代码:

 public boolean contains(Object o) {return indexOf(o) >= 0;}/*** Returns the index of the first occurrence of the specified element* in this list, or -1 if this list does not contain the element.* More formally, returns the lowest index <tt>i</tt> such that* <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,* or -1 if there is no such index.*/public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)if (o.equals(elementData[i]))return i;}return -1;}
ArrayList的contains方法返回的是布尔型。传入的参数是object型,从indexOf中可以看到如果传入的是null因为null调用equals会报错。所以如果找到了,就直接返回,找不到跳出循环外面,就返回-1,标记为没找到,那么contains()方法也会直接返回false。

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

//remove代码
public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;
}//rangeCheck代码
private void rangeCheck(int index) {if (index >= size)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
rangeCheck中先判断传入的数值是否越界,如果越界则报错。如果没有越界,则将对应下标的元素取出来,然后下标之后的元素全部往前一位,最后一位变为NULL,size再减一然后返回被删除的元素。

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

ArrayList中的方法中参数的类型都是Object类,Object类又是所有类的父类,所以不需要考虑元素的类型。

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

public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;
}private void ensureCapacityInternal(int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);
}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);
}private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);
}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;
}
首先要确保内部容量是size + 1。如果elementData是默认长度的空数组的话,那么就确保数组容量是传入参数和默认长度的最大值,也就是说这边至少开大小为10的数组。modCount自增。如果需要的容量比现有数组长度要大的话,就调用grow()方法。最后扩容然后确定了新的容量,使用Arrays.copyOf()方法来生成新的数组,将原来的数据拷贝到新数组中去。

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

private void rangeCheck(int index) {if (index >= size)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
因为用户并不用知道remov操作到底发生了什么,确保java的封装性。

Q2 HashSet原理

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

答:HashSet的特点:元素排列没有顺序为基本操作提供常数时间性能--o(1)、没有提供同步机制(不适合用于多线程环境)、后台使用HashMap实现、加入HashSet中的类应该覆写equals()与hashCode(),保证这两个方法返回的结果一致。可以这样定义Set<> set = new HashSet<>();

Q3 ArrayListIntegerStack

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

  • ArrayListIntegerStack是用ArrayList来实现栈,ArrayIntegerStack是用Integer数组来实现栈。
  • ArrayIntegerStack容量有限会出现栈满的情况,ArrayListIntegerStack不存在栈满的情况。
  • ArrayIntegerStack需要定义一个Top来入栈出栈,而ArrayListIntegerStack则不需要,直接用里面已有的方法就能实现入栈出栈。

3.2 简单描述接口的好处.

ArrayIntegerStack,,ArrayListIntegerStack都实现了IntegerStack接口。这样做的好处就是我可以使用一个接口来操作不同的类,使用相同的方法。接口可以为以后程序的扩展性提供基础。一定程度保证了代码的安全性。让代码看起来简单规范。如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

Q4 Stack and Queue

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

import java.util.LinkedList;public class Main201521123014 {public static void main(String[] args) {Stack<Character> stack = new Stack<Character>();String str = "12321";// String str = "123456";for (int i = 0; i < str.length(); i++) {stack.push(str.charAt(i));}boolean flag = true;for (int i = 0; i < str.length(); i++) {if (stack.pop() != str.charAt(i)) {flag = false;break;}}if (flag) {System.out.println("yes");} else {System.out.println("no");}}
}class Stack<E> {private LinkedList<E> stack = new LinkedList<E>();public void push(E o) {stack.addFirst(o);}public E peek() {return stack.getFirst();}public E pop() {return stack.removeFirst();}public boolean empty() {return stack.isEmpty();}public String toString() {return stack.toString();}
}

将字符串全部入栈,再一个个出栈与原字符串比较,如果没有出现不同的,就是回文串,否则不是。如果是空串,也是返回yes。

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

Queue<Integer> A=new LinkedList<Integer>();
Queue<Integer> B=new LinkedList<Integer>();

定义两个窗口。

for(i=0;i<n;i++){x=sc.nextInt();if(x%2==1) A.add(x);//奇数A窗口else B.add(x);//偶数B窗口
}

入队

while (!A.isEmpty() && !B.isEmpty()) {System.out.print(A.poll() + " ");if (!A.isEmpty()) {System.out.print(A.poll() + " ");}System.out.print(B.poll() + " ");}while (!A.isEmpty()&&B.isEmpty()){if(A.size()==1)System.out.print(A.poll());else System.out.print(A.poll()+" ");}while (A.isEmpty()&&!B.isEmpty()) {if(B.size()==1)System.out.print(B.poll());else System.out.print(B.poll()+" ");}

当两队不为空时 A出两次队,B出一次。然后再将非空的队全部输出。PTA上答案正确。

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

5.1 实验总结

        Set<String> str = new TreeSet<String>();Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String s = sc.next();if (!s.equals("!!!!!"))str.add(s);elsebreak;}System.out.println(str.size());for (int i = 0; i < 10; i++) {System.out.println(str.toArray()[i]);}

使用 TreeSet,它具有自动排序功能。题目只要求10个单词 所以最好要加上str.toArray()[i];PTA提交正确。

Q7 面向对象设计大作业-改进

7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)

使用了JTable使用起来更方便。(还未完成。)


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

3.2 PTA实验

编程(5-1, 5-2, 5-3(选做), 5-6)
实验总结已经在作业中体现,不用写。

posted on 2017-04-08 16:56 Paparazzi 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/huangsh/p/6681786.html

201521123014 《Java程序设计》第7周学习总结相关推荐

  1. 20175317 《Java程序设计》第一周学习总结

    20175317 <Java程序设计>第一周学习总结 教材学习内容总结 本周学习了Java大致的开发步骤,完成了课件自带的习题. 学习了在windows与Linux系统下不同的编译方法,掌 ...

  2. 20155227 2016-2017-2 《Java程序设计》第九周学习总结

    20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...

  3. 20172318 2016-2017-2 《Java程序设计》第一周学习总结

    20172318 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 在教材中基本明白了计算机系统的运行方式,了解了对于高级语言是使用是掌握好编程的关键,掌握了一 ...

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

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

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

    20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...

  6. 20175204 张湲祯 2018-2019-2《Java程序设计》第九周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第九周学习总结 教材学习内容总结 -第十一章JDBC和MySQL数据库要点: 1.下载MySQL和客户端管理工具navi ...

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

    20155313 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 1.1 基本类型 整数:可细分为short整数(占2字节).int整数(占4字节)与long ...

  8. 20155226 2016-2017-2 《Java程序设计》第一周学习总结

    20155226 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周主要学习了一二章的内容,也浏览了剩余章节,以下是本周主要学习内容总结 1.首先了解了[ ...

  9. 20172325 2018-2019-1 《Java程序设计》第二周学习总结

    20172325 2018-2019-1 <Java程序设计>第二周学习总结 教材学习内容总结 3.1集合 集合是一种聚集.组织了其他对象的对象.集合可以分为两大类:线性集合和非线性集合. ...

  10. 张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结

    20162329 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 通过打书上的代码熟悉了Java编程的基本过程 教材学习中的问题和解决过程 1.因为我的虚拟机 ...

最新文章

  1. 订单管理之获取订单表详情数据数据
  2. Codeforces Round #232 Editorial Div2-B
  3. C#的参数类型:params、out和ref
  4. Linux学习笔记-文件权限与路径
  5. [OpenGL ES 02]OpenGL ES渲染管线与着色器
  6. 素数c分解语言程序,PTA|《C语言程序设计实验与习题指导(第3版)》实验4-2-3 验证“哥德巴赫猜想” (20分)...
  7. oracle exp执行失败,EXP-00056: 遇到 ORACLE 错误 25153
  8. JAVA实现Word转Pdf文件
  9. Html5用户注册页面
  10. 【STM32F429的DSP教程】第1章 初学数字信号处理准备工作
  11. vue项目引入阿里云图标的4种方式
  12. 微信小程序获取接口数据与展现
  13. 大智慧公式系统:条件选股之K线形态选股
  14. FANUC机器人有关动作速度倍率的相关系统变量-解释说明
  15. 南昌人武学院计算机室,【志愿者日记】南昌大学人武学院:用行动感染身边的人...
  16. 码上飞机大战v1.0.8
  17. hawk大数据基础知识总结(1)
  18. sdust cpp专业课复习
  19. SQL server 添加、修改、删除字段
  20. 数字图像处理实验——图片压缩与解压(opencv)

热门文章

  1. chrome浏览器插件--让你的谷歌浏览器舒适度提升1800%的插件(程序员推荐)
  2. 批量更新 elasticsearch 内指定字段状态, 先查询后更新
  3. JMS 开发步骤、持久化 topic 消息与非持久化 topic 消息
  4. mysql中group_concat函数的使用以及separator的用法
  5. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_07-freemarker基础-if指令
  6. 瀚云平台kafka简单原理
  7. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第1节 基本概念_02maven依赖管理的概念
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_13_使用字节流读取中文的问题...
  9. 王者荣耀游戏服务器架构的演进读后感
  10. Vue集成微信开发趟坑:公众号以及JSSDK相关