1. 本周学习总结#

2. 书面作业#

Q1 ArrayList代码分析##

1.1 解释ArrayList的contains源代码###

先看看contains的源代码:

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

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

  1. //remove代码
  2. public E remove(int index) {
  3. rangeCheck(index);
  4. modCount++;
  5. E oldValue = 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; // clear to let GC do its work
  11. return oldValue;
  12. }
  13. //rangeCheck代码
  14. private void rangeCheck(int index) {
  15. if (index >= size)
  16. throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  17. }
  1. rangeCheck中先判断传入的数值是否越界,如果越界则报错。如果没有越界,则将对应下标的元素取出来,然后下标之后的元素全部往前一位,最后一位变为NULLsize再减一然后返回被删除的元素。

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

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

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

  1. public boolean add(E e) {
  2. ensureCapacityInternal(size + 1); // Increments modCount!!
  3. elementData[size++] = e;
  4. return true;
  5. }
  6. private void ensureCapacityInternal(int minCapacity) {
  7. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  8. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  9. }
  10. ensureExplicitCapacity(minCapacity);
  11. }
  12. private void ensureExplicitCapacity(int minCapacity) {
  13. modCount++;
  14. // overflow-conscious code
  15. if (minCapacity - elementData.length > 0)
  16. grow(minCapacity);
  17. }
  18. private void grow(int minCapacity) {
  19. // overflow-conscious code
  20. int oldCapacity = elementData.length;
  21. int newCapacity = oldCapacity + (oldCapacity >> 1);
  22. if (newCapacity - minCapacity < 0)
  23. newCapacity = minCapacity;
  24. if (newCapacity - MAX_ARRAY_SIZE > 0)
  25. newCapacity = hugeCapacity(minCapacity);
  26. // minCapacity is usually close to size, so this is a win:
  27. elementData = Arrays.copyOf(elementData, newCapacity);
  28. }
  29. private static int hugeCapacity(int minCapacity) {
  30. if (minCapacity < 0) // overflow
  31. throw new OutOfMemoryError();
  32. return (minCapacity > MAX_ARRAY_SIZE) ?
  33. Integer.MAX_VALUE :
  34. MAX_ARRAY_SIZE;
  35. }
  1. 首先要确保内部容量是size + 1。如果elementData是默认长度的空数组的话,那么就确保数组容量是传入参数和默认长度的最大值,也就是说这边至少开大小为10的数组。modCount自增。如果需要的容量比现有数组长度要大的话,就调用grow()方法。最后扩容然后确定了新的容量,使用Arrays.copyOf()方法来生成新的数组,将原来的数据拷贝到新数组中去。

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

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

Q2 HashSet原理##

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

  1. 答: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 简单描述接口的好处.###

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

Q4 Stack and Queue##

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

  1. import java.util.LinkedList;
  2. public class Main201521123014 {
  3. public static void main(String[] args) {
  4. Stack<Character> stack = new Stack<Character>();
  5. String str = "12321";
  6. // String str = "123456";
  7. for (int i = 0; i < str.length(); i++) {
  8. stack.push(str.charAt(i));
  9. }
  10. boolean flag = true;
  11. for (int i = 0; i < str.length(); i++) {
  12. if (stack.pop() != str.charAt(i)) {
  13. flag = false;
  14. break;
  15. }
  16. }
  17. if (flag) {
  18. System.out.println("yes");
  19. } else {
  20. System.out.println("no");
  21. }
  22. }
  23. }
  24. class Stack<E> {
  25. private LinkedList<E> stack = new LinkedList<E>();
  26. public void push(E o) {
  27. stack.addFirst(o);
  28. }
  29. public E peek() {
  30. return stack.getFirst();
  31. }
  32. public E pop() {
  33. return stack.removeFirst();
  34. }
  35. public boolean empty() {
  36. return stack.isEmpty();
  37. }
  38. public String toString() {
  39. return stack.toString();
  40. }
  41. }

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

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

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

定义两个窗口。

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

入队

  1. while (!A.isEmpty() && !B.isEmpty()) {
  2. System.out.print(A.poll() + " ");
  3. if (!A.isEmpty()) {
  4. System.out.print(A.poll() + " ");
  5. }
  6. System.out.print(B.poll() + " ");
  7. }
  8. while (!A.isEmpty()&&B.isEmpty())
  9. {
  10. if(A.size()==1)
  11. System.out.print(A.poll());
  12. else System.out.print(A.poll()+" ");
  13. }
  14. while (A.isEmpty()&&!B.isEmpty()) {
  15. if(B.size()==1)
  16. System.out.print(B.poll());
  17. else System.out.print(B.poll()+" ");
  18. }

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

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

5.1 实验总结###

  1. Set<String> str = new TreeSet<String>();
  2. Scanner sc = new Scanner(System.in);
  3. while (sc.hasNext()) {
  4. String s = sc.next();
  5. if (!s.equals("!!!!!"))
  6. str.add(s);
  7. else
  8. break;
  9. }
  10. System.out.println(str.size());
  11. for (int i = 0; i < 10; i++) {
  12. System.out.println(str.toArray()[i]);
  13. }

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

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

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

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


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

3.2 PTA实验##

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

实验总结已经在作业中体现,不用写。

201521123014 《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. Spring中各jar包的作用

    Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects:Spring提供的对AspectJ框架的整合 Spring Beans:Spring ...

  2. html2canvas页面截图图片不显示

    前两天在一个群里,有人问使用html2canvas屏幕截图的时候为什么页面的图片不显示只显示了文字,我没有做过屏幕截图的需求,所以不是很清楚,今天稍稍测试了一下. 在github上将html2canv ...

  3. HDU 1231 最大连续子序列:水dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 题意: 给你一个整数序列,求连续子序列元素之和最大,并输出该序列的首尾元素(若不唯一,输出首坐标 ...

  4. php面试题汇总四(基础篇附答案)

    1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从 ...

  5. [H5]range对象的setStart/setEnd方法

    1.setStart:表示某个节点的range对象的起点位置;2.setEnd:表示某个节点的range对象的结束位置; 示例如下:<body> <div id="div& ...

  6. 简单实体类和xml文件的相互转换

    最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...

  7. 原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)

    首先,js的数据结构有 原始类型(5种):Boolean.Number.String.Null.Underfined, 然后是引用类型:Array.Date.Error.RegExp.Function ...

  8. 2017-04-21周Java学习笔记

    2017-04-21-周Java学习笔记... -------------------------------------- 计算机起源于:战争中的炮弹轨道计算.Unix操作系统是使用C语言编写的操作 ...

  9. 浅谈CSS模块化

    为什么要CSS模块化? 你是否为class命名而感到苦恼? 你是否有怕跟别人使用同样class名而感到担忧? 你是否因层级结构不清晰而感到烦躁? 你是否因代码难以复用而感到不爽? 你是否因为commo ...

  10. asp.net MVC  Ajax.BeginForm 异步上传图片的问题

    当debug到这里,你们就发现不管是 Request.Files["Upload"]亦或 Request.Files[0] 都不会取到文件流. 这就是我要说的,当使用Ajax.Be ...