Java作业-集合
1. 本周学习总结
2. 书面作业
1. ArrayList代码分析
1.1 解释ArrayList的contains
源代码
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
源代码里就一句,即寻找传入对象的序号,看是不是大于0,大于0就表示存在。
1.2 解释E remove(int index)
源代码
在List类中是个抽象方法,留给子类去实现。在ArrayList中代码如下
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 work
// 将最后一个变为null,交给垃圾回收系统处理
return oldValue;
}
1.3 结合1.1与1.2,回答ArrayList存储数据时需要考虑元素的具体类型吗?
不需要,所用的数据类型都是Object,当建立的是一个Object的ArrayList的时候,可以放入任何类型的元素
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 code
if (minCapacity - elementData.length > 0)//如果数组的长度比需求的长度小
grow(minCapacity);
}
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位(居然位运算,原长4就加2,原长3就加1之类的)
然后生成新的数组,将原来的数据填充进新的数组
1.5 分析private void rangeCheck(int index)
源代码,为什么该方法应该声明为private而不声明为public?
我也有点疑惑,但是源码注释里写了,这个方法完全信任传入的index,即必需将数组的length传入,如果暴露出来可能会被开发者滥用吧。(个人观点)
2. HashSet原理
2.1 将元素加入HashSet(散列集)中,其存储位置如何确定?需要调用那些方法?
hashcode
算出将插入的位置,若位置上已存在元素,用equals
判断是否相同,相同就返回,整个过程结束,不相同就调用add方法添加
2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)
时间复杂度是O(1)
2.3 选做:尝试分析HashSet源代码后,重新解释2.1
可以从以下源码看出,HashSet的contains方法是先计算要比较对象的hash值,然后从第一个开始,循环判断每一个元素的hash以及使用equals方法对比
另:计算hash的方法是使用hashCode计算出值再按位异或这个值无符号右移16位
final Node<K,V> getNode(int hash, Object key) {
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
if ((e = first.next) != null) {
if (first instanceof TreeNode)
return ((TreeNode<K,V>)first).getTreeNode(hash, key);
do {
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
} while ((e = e.next) != null);
}
}
return null;
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
3. ArrayListIntegerStack
题集jmu-Java-05-集合
之ArrayListIntegerStack
3.1 比较自己写的ArrayListIntegerStack与自己在题集jmu-Java-04-面向对象2-进阶-多态、接口与内部类
中的题目自定义接口ArrayIntegerStack
,有什么不同?(不要出现大段代码)
自定义接口ArrayIntegerStack
是一个接口,且那道题中是使用数组实现那个接口,ArrayListIntegerStack内部是使用ArrayList实现的,这是最大的不同
3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。
4. Stack and Queue
4.1 编写函数判断一个给定字符串是否是回文,一定要使用栈(请利用Java集合中已有的类),但不能使用java的Stack
类(具体原因自己搜索)与数组。请粘贴你的代码,类名为Main你的学号
。
public class Main201621123029 {
private LinkedList storeList;
public Main201621123029(String in) {
storeList = new LinkedList();
for (int i = 0; i < in.length(); i++) storeList.push(in.charAt(i));
}
Main201621123029 pop(Consumer consumer) {
if (storeList.size() < 1) return this;
consumer.accept(storeList.pop());
return this;
}
public static void main(String[] args) {
String left = args[1];
String right = left;
Main201621123029 tt = new Main201621123029(left);
final int[] sum = {0};
for (char e : right.toCharArray())
tt.pop(each -> {
if (each.equals(e)) sum[0]++;
});
if (sum[0]==right.length()) System.out.println("回文");
}
}
4.2 题集jmu-Java-05-集合
之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue
接口,并说明你使用了Queue接口的哪一个实现类?
使用了ArrayDeque
,关键部分:
for (int i = 0; i < length; i++) {
if (odd.isEmpty()) System.out.print(even.poll());
else if (even.isEmpty()) System.out.print(odd.poll());
else {
switch (i % 3) {
case 0:
System.out.print(odd.poll());
break;
case 1:
System.out.print(odd.poll());
break;
case 2:
System.out.print(even.poll());
break;
}
}
if (i!=length-1) System.out.print(' ');
}
5. 统计文字中的单词数量并按单词的字母顺序排序后输出
题集jmu-Java-05-集合
之5-2 统计文字中的单词数量并按单词的字母顺序排序后输出 (作业中不要出现大段代码)
代码挺少的,就全放上来。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
TreeSet<String> rec = new TreeSet<>();
String st;
while (!(st = in.next()).equals("!!!!!")) {
rec.add(st);
}
System.out.println(rec.size());
Iterator iterator = rec.iterator();
for (int i = 0; i < rec.size(); i++) {
if (i<10) System.out.println(iterator.next());
}
}
}
5.1 实验总结
TreeSet按照单个字母排序,HashSet按照整体字母排序,这点值得注意。
高级数据结构,Set,Map,不能使用随机读取,也没有get或者indexOf,只能使用迭代器遍历
3.码云及PTA
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
3.2 截图PTA题集完成情况图
3.3 统计本周完成的代码量
上面两个其实是同一个目录,但是由于输入的路径不同,识别成了两个路径(issue已提)
Java作业-集合的更多相关文章
- 【Java】集合_学习笔记
一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...
- 第五次Java作业
作业一: 文件显示列表框. 增加了下拉式组合框,text区域设置颜色为红色. import javax.swing.*; import java.awt.*; import java.io.File; ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- 谈谈Java的集合组件
让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- Java基础——集合框架
Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...
- Java学习-集合(转)
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- java的集合框架之一
java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
随机推荐
- C#图解教程 第六章 深入理解类
深入理解类 类成员成员修饰符的顺序实例类成员静态字段从类的外部访问静态成员 静态字段示例静态成员的生存期 静态函数成员其他静态类成员类型成员常量常量与静态量属性 属性声明和访问器属性示例使用属性属性和 ...
- 【深入理解JVM】类加载器与双亲委派模型
原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...
- 在linux下,怎么去查看一个运行中的程序, 到底是占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...
- 【BZOJ2005】【NOI2010】能量采集(莫比乌斯反演,容斥原理)
[BZOJ2005][NOI2010]能量采集(莫比乌斯反演,容斥原理) 题面 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量 ...
- 金三银四,2018最新iOS面试题,由它可以搞定面试官?
序言 这些资料,你一定会用到!我相信很多人都在说,iOS行业不好了,iOS现在行情越来越难了,失业的人比找工作的人还要多.失业即相当于转行,跳槽即相当于降低自己的身价.那么做iOS开发的你,你是否在时 ...
- Adaboost的意义
Adaboost是广义上的提升方法(boosting method)的一个特例.广泛应用于人脸识别等领域. 它的基本思想是,“三个臭皮匠赛过诸葛亮”,即用多个弱分类器的线性加权,来得到一个强的分类器. ...
- MySQL事务以及隔离级别
前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...
- 微信小程序之生成图片分享
通过社交软件分享的方式来进行营销小程序,是一个常用的运营途径.小程序本身支持直接将一个小程序的链接卡片分享至微信好友或微信群,然后别人就可以通过点击该卡片进入该小程序页面.但是小程序目前不支持直接分享 ...
- C#判断某个类是否派生某个类或是否实现了某个接口
is和as is关键字可以确定对象实例或表达式结果是否可转换为指定类型.基本语法: expr is type 如果满足以下条件,则 is 语句为 true: expr 是与 type 具有相同类型的一 ...
- 通过Beego将之前实现的短url项目实现
正好通过这个小例子对之前了解的beego框架的基本内容进行一个简单的应用 实现的完整代码地址:https://github.com/pythonsite/go_simple_code/tree/mas ...