201521123042《Java程序设计》 第7周学习总结
1. 本周学习总结
网上看了很多资料,发现这一张图总结的还不错就引用过来了。但是最上面的Map和Collection之间的关系应该是依赖,不是Produces。

①概述:Java集合框架主要包括两种类型的容器.一种是Collectio),存储一个元素集合,另一种是Map,存储键/值对映射。。Collection接口又有3种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等.
②collection接口:AbstractCollection是提供Collection部分实现的抽象类。有几个比较常用的方法,比如方法:
- add()添加一个元素到集合中。
- addAll()将指定集合中的所有元素添加到集合中。
- contains()方法检测集合中是否包含指定的元素。
- toArray()方法返回一个表示集合的数组。
③List接口扩展自Collection,它可以定义一个允许重复的有序集合。Set接口扩展自Collection,它与List的不同之处在于,规定Set的实例不包含重复的元素。主要是散列集HashSet和树形集TreeSet。Queue接口扩展自Collection,并提供插入、提取、检验等操作。poll()与remove()方法都是移除队列头部的元素,两者的区别在于如果队列为空,那么poll()返回的是null,而remove()会抛出一个异常。
2. 书面作业
Q1.ArrayList代码分析
1.1 解释ArrayList的contains源代码
答:arraylist中的contains源码如下:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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;
}
public boolean equals(Object obj) {
return (this == obj);
}
该代码表示的是如果o为null,那么就去找elementData[] 是否有为null的对象,有则返回下标没有则返回-1。
如果o不为null,就通过equals去比较elementData[] 中是否有与o相同的对象,有则返回下标没有则返回-1。由以上总结我们可知如果对象不为null的话,最终是调用的Object类的equals()方法,来比较两个对象的引用是否相同,在新建类里面我们往往需要重写equals()方法。比如我们用new关键字创建两次User对象,User user1 = new User(1,"lilei");
User user2 = new User(1,"yueliming");虽然它们代表同一个人,但是JVM虚拟机在中开辟了堆两个存储空间,user1和user2分别为指向这两个对象的引用,所以我们要在User类中重写equals()方法,user1和user2就会被当做同一个对象处理。1.2 解释E remove(int index)源代码
public E remove(int index) {
rangeCheck(index); //判断index是否合法
modCount++; //remove操作会改变size,所以modCount加1
E oldValue = elementData(index); //保存待删除位置的元素
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,numMoved);
//如果index不是最后一个元素,则从第index+1到最后一个位置,依次向前移动一个位置
elementData[--size] = null; //元素的size减少1,并把原来末尾位置元素的值设置为null
return oldValue; //返回位置
}
由于删除操作会改变size,所以每次删除都需要把元素向前移动一个位置,然后把原来最后一个位置的元素设置为null,一次删除操作完成
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的类型吗?
答:不需要考虑元素类型,ArrayList会把所有插入其中的数据当作为object类型来处理
1.4 分析add源代码,回答当内部数组容量不够时,怎么办?
add(E e)方法:
public boolean add(E e) {
ensureCapacityInternal(size + 1);//保证数组的容量始终够用
elementData[size++] = e; //size是elementData数组中元组的个数,初始为0
return true;
}
private void ensureCapacityInternal(int minCapacity) {
//如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
//保证容量够用
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
//modCount是数组发生size更改的次数
modCount++; if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
数组扩容方法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);// 设置新容量是原容量的1.5倍
if (newCapacity - minCapacity < 0)// 容量不够就直接加到所需容量
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity);
}
每当执行Add添加元素,都会检查内部数组的容量是否不够了,如果不够了,它就会以当前容量的1.5倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组
1.5 分析private void rangeCheck(int index)源代码,为什么该方法应该声明为private而不声明为public?
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
在ArrayList类用户使用remove()方法的时候,只需要直接使用,不需要知道方法内部具体运行过程。所以用private修饰。
Q2.Has方法hSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
元素存储位置是由元素的hash码来确定的。HashSet是无序存放元素的。使用HashSet的add()方法加入元素时;
①自动调用hashCode()方法
②然后根据hashCode()方法的返回值 来决定元素要插入的位置。
③如果该位置上已经存在元素了 则会调用该元素equals()方法进行比较。
④如果两个元素相等 则丢掉欲插入的元素。⑤如果两个元素不相等 则新元素会被加入到另一个位置(通过冲突检测来决定哪一个位置),这样就消除了重复。
In all,用hashCode()方法来获得元素的存储位置,用equals()方法来比较在两个元素的位置相同的时候,两个元素是否相等
2.2 选做:尝试分析HashSet源代码后,重新解释1.1
public HashSet() {
map = new HashMap<>();
}
HashSet实质上使用HashMap来实现的
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
Q3.ArrayListIntegerStack
题集jmu-Java-05-集合之5-1 ArrayListIntegerStack3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类中的题目5-3自定义接口ArrayIntegerStack,有什么不同?(不要出现大段代码)
ArrayListrStack
public ArrayIntegerStack(int max) {
data = new Integer[max]; }
ArrayListIntegerStack:
public ArrayListIntegerStack() {
list=new ArrayList<Integer>(); }
①入栈:ArrayListIntegerStack中使用的是动态数组实现栈,当数组空间被用完可以自动扩容,所以不会出现栈慢的情况,ArrayIntegerStack中使用的是数组实现栈,会出现栈满的情况。
②出栈:ArrayIntegerStack在出栈的时候需要移动top指针,ArrayListIntegerStack不需要
3.2 简单描述接口的好处.
同样只能有一个基类,但可以有多个实现。当实现多个接口时,如果两个接口有同样的方法,那么实现一次就可以了。
Q4.Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈,但不能使用java的Stack类(具体原因自己搜索)。请粘贴你的代码,类名为Main你的学号。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
interface NewStack{ public String push(String item);
public String pop();
}
class Stack implements NewStack{
private ArrayList<String> list=new ArrayList<String>(); public Stack() {
list=new ArrayList<String>(); } public String push(String item) {
if(item==null) return null;
list.add(item);
return item;
}
public String pop() {
if(list.isEmpty()) return null;
return list.remove(list.size()-1);
} }
public class Main201521123042 { public static void main(String[] args) {
Scanner input=new Scanner(System.in);
NewStack stack = new Stack();
String message=input.next();
int i=0;
for( i=0;i<message.length();i++)
stack.push(String.valueOf(message.charAt(i)));
for(i=0;i<message.length();i++)
{
if(String.valueOf(message.charAt(i)).equals(stack.pop()))continue;
else
{
System.out.println("false");
break;
}
}
if(i==message.length()) System.out.println("true");
} }
4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟。(不要出现大段代码)
for(int i=0;i<n;i++){
int number = input.nextInt();
if(number%2!=0) queueA.offer(number+"");
else queueB.offer(number+"");
}
偶数放在QueueA中,奇数放在QueueB中
for (int i = 0; i < n; i++) {
while (!queueA.isEmpty()) {
System.out.print(queueA.poll()+" ");
while (!queueA.isEmpty()) {
System.out.print(queueA.poll()+" ");
break;
}
break;
}
while (!queueB.isEmpty()) {
System.out.print(queueB.poll()+" ");
break; }
Q5.统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (不要出现大段代码)Set<String>strSet=new TreeSet<String>();
String x;
while(true){
x=input.next();
if(x.equals("!!!!!"))break;
strSet.add(x); }
System.out.println(strSet.size());
Iterator item = strSet.iterator();
for(int i=0;i<10;i++){
System.out.println(item.next());
}
实验总结:利用TreeSet完成不同单词的存放,并有序排列,再利用Iterator遍历strSet中的对象,输出前十个。
Q6.选做:加分考察-统计文字中的单词数量并按出现次数排序
题集jmu-Java-05-集合之5-3 统计文字中的单词数量并按出现次数排序(不要出现大段代码)6.1 伪代码
while(true){
if(x.equals("!!!!!"))break;
else {
if(map.containsKey(x)) map.put(x, map.get(x)+1);
else map.put(x, 1);
}
}
List<Entry<String,Integer>> list =new ArrayList<Entry<String,Integer>>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2) {
//代码
})
6.2 实验总结
这道题使用了map,用map.containsKey(x)来判断是否已存在映射,使用collections.sort()对list进行排序
Q7.面向对象设计大作业-改进
7.1 完善图形界面(说明与上次作业相比增加与修改了些什么)
与上次作业相比,我们加入了表格,使操作更加方便,界面更加美观,改动如下:


| 郭炜埕 | 姚佳希 |
|---|---|
| http://www.cnblogs.com/vicheng/p/6668361.html | http://www.cnblogs.com/ballonbaby/p/6682818.html |
3. 码云上代码提交记录及PTA实验总结
(不知道为什么码云提交不上去,所以只好拖拽上传文件)

201521123042《Java程序设计》 第7周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- 友盟崩溃日志分析工具 - dSYMTools
公司的项目中集成了UM的统计功能,UM统计可以统计app的用户新增,版本分布,日志崩溃等信息,打开错误分析按钮,则可能会看到很多崩溃的日志信息 选择编辑可以选择更多的版本号 点击列表中的一个崩溃日志, ...
- k-means算法概述
算法过程: 随机选取K个种子点 求所有点到种子点的距离,将点纳入距离最近的种子点群 所有点均被纳入群内后,将种子点移动到种子群中心 重复上述2.3过程,直至种子点没有移动 优缺点: 优点:容易实现 缺 ...
- SDWebImage4.0.0 源码解析
在开发iOS的客户端应用时,经常需要从服务器下载图片,虽然系统提供了下载工具:NSData.NSURLSession等等方法,但是考虑到图片下载过程中,需要考虑的因素比较多,比如:异步下载.图片缓存. ...
- this指针的值
this指针指向的是对象的地址,与对象第一个成员变量的关系是怎样的呢?看下面这个例子: struct CPlex{ CPlex* pNext; void* data() { return this+1 ...
- 进程管理之fork函数
fork函数的定义 #include <unistd.h> #include <sys/types.h> pid_t fork(void); fork函数在父进程中返回子进程的 ...
- JSP向后台传递参数的四种方式
Jsp页面传值的方法 一.通过Form表单提交传值 客户端通过Form表单提交到服务器端,服务器端通过 Java代码 request.getParameter(String xx); 来取得参数(xx ...
- Android事件传递机制详解及最新源码分析——View篇
摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于安卓事件传递机制相信绝大部分开发者都听说过或者了解过,也是面试中最常问的问题之一.但是真正能从源码角度理解具体事件传递流程的相信并不多, ...
- python_控制台输出带颜色的文字方法
在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想要的信 ...
- 转每天一个linux命令(7):mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
- 关于变量 Objects...objects 和Object[] objects的区别
上一篇用到Objects...objects 和Object[] objects的遇到点小问题,于是我去做了个实验,关于这两个变量传参的问题 代码如下 package com.yck.test; pu ...