1. 本章学习总结

2. 书面作业

1.ArrayList代码分析

1.1 解释ArrayList的contains源代码

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

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

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

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

答:

(1) 先贴上contains源码及自带注释

 /**
* Returns <tt>true</tt> if this list contains the specified element.
* More formally, returns <tt>true</tt> if and only if this list contains
* at least one element <tt>e</tt> such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
*
* @param o element whose presence in this list is to be tested
* @return <tt>true</tt> if this list contains the specified element
*/
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中是否包含某个对象,从源代码来看,其默认使用for循环Object类下的equals方法进行比较,很明显在实际操作时我们需要在个人类中重写equals方法,否则只会比较其地址值,必定返回false。

(2)贴上源码

   E remove(int index);

根据下标删除对象,由于ArrayList是List的一个实现类,并且还继承了AbstractList类。贴上AbstractList类中和List接口中的remove描述

public E remove(int index) {
throw new UnsupportedOperationException();
} /**
* Removes the element at the specified position in this list (optional
* operation). Shifts any subsequent elements to the left (subtracts one
* from their indices). Returns the element that was removed from the
* list.
*
* @param index the index of the element to be removed
* @return the element previously at the specified position
* @throws UnsupportedOperationException if the <tt>remove</tt> operation
* is not supported by this list
* @throws IndexOutOfBoundsException if the index is out of range
* (<tt>index &lt; 0 || index &gt;= size()</tt>)
*/
E remove(int index);

暂时不关注抛出的异常,另外还有remove(Object o)方法,实现最后也是转到remove(int index)上来。

(3)

    ArrayList arr=new ArrayList();
arr.add(123);
arr.add("123");

运行通过,在技术层面来说可以实现。但是之前也说了,如果是一些基本类型进行增删查改不难,但假如里面存放的是各种各样用户自定义类,那么我们就必须重写equals方法,类的种类如此之多,怎么重写呢?因此ArrayList还是要考虑数据类型的。

(4)

贴上源码

public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}

继续看ensureCapacityInternal方法描述

private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
} ensureExplicitCapacity(minCapacity);
}

DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组,用于判断此时ArrayList是否为空。顺便一提,数组的默认长度DEFAULT_CAPACITY值为10。

继续看ensureExplicitCapacity方法描述

private void ensureExplicitCapacity(int minCapacity) {
modCount++; // overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

这里出现数组是否到头的判断,继续看grow方法描述

private void grow(int minCapacity) {
// overflow-conscious code
int 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);
}

简单说一下,将原有的数组扩容为1.5倍长度的数组(使用移位运算<<),将原有的数组元素赋值到新数组中。

(5)

贴上rangeCheck描述

/**
* Checks if the given index is in range. If not, throws an appropriate
* runtime exception. This method does *not* check if the index is
* negative: It is always used immediately prior to an array access,
* which throws an ArrayIndexOutOfBoundsException if index is negative.
*/

此方法不检查是否为负数,因为声明为private,内部调用的话传入的肯定是正值,如果声明为public,那么可从外部传入负值,那么抛出了一个数组下标越界的异常,不符合逻辑。

2.HashSet原理

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

答:

(1)贴上HashSet.add方法描述

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

说明数据在HashSet内是以基于哈希表的map形式存储的,继续看put方法的描述

public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

说明查找是基于键值对的形式进行的。

3.ArrayListIntegerStack

3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口

ArrayIntegerStack,有什么不同?(不要出现大段代码)

3.2 简单描述接口的好处.

答:

(1)根本区别就是一个内部使用数组实现,一个内部使用ArrayList实现,数组的话增删查改都要自己编写方法,ArrayList可以调用已有方法进行操作。

(2)接口中规定了实现类必须去实现的各种方法,思路清晰,也规范了编程流程。

Q4.Stack and Queue

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

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

答:

(1)

import java.util.ArrayList;
import java.util.Scanner; /**
* Created by Administrator on 2017/4/8.
*/
public class Main201521123055 {
public static void main(String[] args) { Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
stackString str=new stackString(s);
for(int i=0;i<str.size();i++)
{
if(s.charAt(i)!=str.pop())
{
System.out.println("不是回文字符串");
return;
}
} System.out.println("是回文字符串"); }
} class stackString{
ArrayList<Character> arr=new ArrayList<Character>(); stackString(String s)
{
for(int i=0;i<s.length();i++)
arr.add(s.charAt(i));
}
public void push(Character c)
{
arr.add(c);
} public Character pop() {
if(arr.size()==0)return null;
Character c = arr.get(arr.size() - 1);
arr.remove(arr.size() - 1);
return c;
} public int size()
{
return arr.size();
} }

(2)我使用了ArrayList进行模拟,跟队列来说效果上差不太多。

    ArrayList<Integer> arr1=new ArrayList<Integer>();
ArrayList<Integer> arr2=new ArrayList<Integer>(); int n=sc.nextInt();
for(int i=0;i<n;i++)
{
int m=sc.nextInt(); if(m%2==1)arr1.add(m);
else arr2.add(m);
}
Collections.sort(arr1);
Collections.sort(arr2);

排序后按照规则输出。

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

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

5.1 实验总结

(1)

public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Set<String> arr = new TreeSet<String>();
String str=null;
while(true)
{
String word=sc.next();
if(word.equals("!!!!!"))break;
arr.add(word); } System.out.println(arr.size()); int i=0;
for(String s:arr)
{
if(i==10)break;
else if(i>arr.size())break;
System.out.println(s);
i++;
}
}
}

此题代码量不大故全部贴上来。

(2)这题关键就是使用了Set的自然排序实现类TreeSet,此类可以对添加的对象进行默认排序。

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

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

6.1 伪代码

6.2 实验总结

(1)伪代码?不存在的。直接上源代码

public class Main
{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Map<String,Integer> dic=new HashMap<String,Integer>();
String str=null;
while(true)
{
str=sc.next();
if(str.equals("!!!!!"))break; if(dic.containsKey(str))
{
Integer i=dic.get(str);
i++;
dic.put(str,i);
}
else
{
dic.put(str,1);
}
} Map<String, Integer> sortdic = sortMapByValue(dic);
System.out.println(sortdic.size()); int i=0;
for (Map.Entry<String, Integer> entry : sortdic.entrySet()) {
if(i==10||i>=sortdic.size())break;
System.out.println(entry.getKey() + '=' + entry.getValue());
i++;
}
} public static Map<String, Integer> sortMapByValue(Map<String, Integer> oriMap) {
if (oriMap == null || oriMap.isEmpty()) {
return null;
}
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String, Integer>>(
oriMap.entrySet());
Collections.sort(entryList, new MapComparatorByValue()); Iterator<Map.Entry<String, Integer>> iter = entryList.iterator();
Map.Entry<String, Integer> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
}
return sortedMap;
}
} class MapComparatorByValue implements Comparator
{
@Override
public int compare(Object o1,Object o2)
{
Map.Entry<String,Integer> m1=(Map.Entry<String,Integer>)o1;
Map.Entry<String,Integer> m2=(Map.Entry<String,Integer>)o2;
if(m2.getValue()==m1.getValue())
{
return m1.getKey().compareTo(m2.getKey());
}
else return m2.getValue()-m1.getValue(); }
}

(2)这道题重点是使用了map集合储存数据,并且还需要按值排序,因此要自定义比较器进行排序。我个人觉得最麻烦的就是map转为list来进行排序,为此看了不少资料才弄明白。

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

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

7.2 使用集合类改进大作业

这里说明一下,因为之前用的就是集合类来写的,所以改进的话也就是在界面上做优化,这两周好好看下图形化处理方面的资料在做改进。这周暂停进度。

3.1 码云提交记录

因个人资料的集中管理,故把作业也扔到GitHub上面提交。(GitHub还有桌面客户端方便管理,何乐不为呢)

Github地址

201521123055 《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. Oracle RAC 11g DG Broker配置和测试

    Oracle RAC 11g DG Broker配置和测试 之前在<RHEL6.4 + Oracle 11g DG测试环境快速搭建参考>已经简单说过. 本篇在实验环境中实际配置 环境: R ...

  2. ArrayList 和Vector ,HashTable和HashMap异同

    相同点: 1.都实现了List接口(List接口继承自Collection接口) 2.有序集合,数据可重复,可按索引号取值(而HashSet无序,不可重复) 不同点: 1.Vector是线程安全的,而 ...

  3. 王佩丰第一讲 认识excel笔记

    改变工作表表浅颜色 批量插入工作表 选择多张工作表然后插入 找到表格边界区域快捷键(找到表格的最后一行):快速到达最上下左右端 点击边框上下左右双击 从指定的位置开始冻结窗格 输入今天的日期 快捷键c ...

  4. windows 快捷方式(.lnk)代码执行漏洞(CVE-2017-8464 )[附EXP生成工具]

    最近看到网上曝光了一个windows远程代码执行的漏洞,黑客可以通过一个快捷方式在用户电脑上执行任意指令,于是便对该漏洞进行了部分分析. 1. 漏洞描述: MicrosoftWindows .LNK  ...

  5. GDB教程

    GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调 ...

  6. MySQL连接问题【mysql_connect和mysql_pconnect区别】

    --MySQL连接问题[mysql_connect和mysql_pconnect区别] -------------------------------------------------------- ...

  7. C++之STL总结精华笔记

                       一.一般介绍      STL(StandardTemplate Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程 ...

  8. Python 写网络爬虫思路分析

    首先从程序入口开始分析,在程序入口处传入一个待爬取的网址, 使用下载器Html_downloader类下载该地址的内容,使用解释器 parser分析内容,利用BeautifulSoup包抓取想要爬取的 ...

  9. async简单使用

    node的异步io虽然好用,但是控制异步流程确实一个比较麻烦的事情,比如在爬虫中控制并发数量,避免并发过大导致网站宕机或被加入黑名单.因此需要一个工具来控制并发,这个工具可以自己写或者使用async( ...

  10. KeepAlived+Nginx实现高可用负载

    一.环境及安装版本: centos6.5.Nginx1.4.7.keepalived1.3.2 虚拟IP 真是IP Nginx端口 主从分配 10.0.90.215 10.0.90.217 80 MA ...