1. 本周学习总结

以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。

2. 书面作业

1. ArrayList代码分析

1.1 解释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;
}
  • contains:如果列表中包含指定的元素则返回true.
  • indexOf:遍历整个数组,找到就返回该数组的的下标,找不到就返回-1.
  • 即意思就是简单判断一下返回值如果>=0,在此中返回指定元素的第一次发生的索引。

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

源代码:

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; //关键的一句
return oldValue;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
  • remove:移除列表中指定位置上的元素,向左移动所有后序元素(将其索引减1)
  • rangeCheck:如果删除位置越界,抛出异常。
  • 即先判断所要删除的位置是否超出数组大小:若超出,则抛出异常;若未超出,则删除该位置的元素,并将该位置之后的元素逐一往前移

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

不需要考虑,参数属于Object类(各类的父类)。

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

A:add源码如下

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

在尾部加,数组长度加一。

同样的,调用了ensureCapacityInternal方法,源码如下:

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

ensureCapacityInternal是判断是否要扩容的方法。首先是判断现在的ArrayList是不是空的,如果是空的,minCapacity就取默认的容量和传入的参数minCapacity中的大值。

该方法最后一句又调用了ensureExplicitCapacity方法,源码如下:

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

如果minCapacity的值大于add数据之前的大小,就调用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);
}

用grow方法进行扩容。关键语句:int newCapacity = oldCapacity + (oldCapacity >> 1);,相当于新的最大容量是 size+1+size/2 相当于原来的1.5倍然后加1。

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

private修饰仅同类可见。因为外部人员无需使用这个方法,只要内部操作人员知道是否越界即可。

2. HashSet原理

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

计算哈希码,即调用对象的hashCode方法,根据哈希码查找到对应的桶(HashSet的存储形式用链表数组实现:每个列表被称为桶)如果桶中已有其他元素,则调用元素的equals方法与已有元素进行比较。

如果比较结果为假,则将元素插入桶中,如果比较结果为真,则用新的值替换旧的值。

2.2 将元素加入HashSet中的时间复杂度是多少?是O(n)吗?(n为HashSet中已有元素个数)

复杂度为O(1),它靠的不是遍历而是计算哈希码.

3. ArrayListIntegerStack

题集jmu-Java-05-集合之ArrayListIntegerStack

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

  • ArrayListIntegerStack是用ArrayList来实现栈。ArrayList实际就是长度可变的数组,以它所实现的栈不用考虑栈满的情况,因为ArrayList可以自动扩容。
  • ArrayIntegerStack是用数组来实现栈。需要考虑栈满的情况,在一开始便须设定栈的深度,并设定一个top指针,根据出栈入栈的情况移动top指针。

3.2 结合该题简单描述接口的好处,需以3.1为例详细说明,不可泛泛而谈。

  • 接口是一类行为的总和,实现接口就可以拥有这些行为。
  • 接口能避免因为只需要某类的某一个或几个方法而继承这个类,把操作变得更简单。
  • 接口为编程工作者实现代码交互及任务分工提供便捷。

4. Stack and Queue

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

public class Main201621123060 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Please input the number: ");
String a = sc.next();
int i = a.length();
System.out.println(huiwen(a));
}
public static boolean huiwen(String a){
List<Character> stack1 = new ArrayList<Character>();
List<Character> stack2 = new ArrayList<Character>();
int b = a.length()/2;
for(int i=0;i<b;i++){
stack1.add(a.charAt(i));//前半字符正向入栈
stack2.add(a.charAt(a.length()-i-1));//后半字符反向入栈
}
for(int i=b-1;i>=0;i--){
if(stack1.remove(i).equals(stack2.remove(i))){
return true ;
}
}
return false;
}
}

4.2 题集jmu-Java-05-集合之银行业务队列简单模拟(只粘贴关键代码)。请务必使用Queue接口,并说明你使用了Queue接口的哪一个实现类?

	for (int i = 0; i < N; i++) {
int x=in.nextInt();
if(x%2!=0)
q1.offer(x);
else
q2.offer(x);
}
while(q1.size()!=0||q2.size()!=0){
if(q1.size()!=0){
if(flage==0) {
System.out.print(q1.poll());
System.out.print(" "+q1.poll());
flage=1;
}
else {
System.out.print(" "+q1.poll());
System.out.print(" "+q1.poll());
} }
if(q2.size()!=0){
if(flage==0) {
System.out.print(q2.poll());
flage=1;
}
else {
System.out.print(" "+q2.poll());
}

主要用了Queue中的offer()方法、size()方法、poll()方法

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

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

关键代码:

Set<String> a = new TreeSet<String>();
a.add(str);
System.out.println(a.size());
int i=0;
for(String b:a)
{
if(i==10)break;
System.out.println(b);
i++;

用到了add、size、forEach遍历

5.1 实验总结

使用了Set的自然排序实现类TreeSet,此类可以对添加的对象进行默认排序。

3.码云及PTA

题目集:jmu-Java-05-集合

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)



3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
1 70 70 5 5
2 207 207 4 4
3 205 205 11 11
4 81 81 4 4
5 365 365 4 4
6 296 296 7 7
7 274 274 5 5

需要将每周的代码统计情况融合到一张表中。

201621123060《JAVA程序设计》第八周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第八周学习总结

    1.本周学习总结 1.1思维导图 2.书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 总结:判断List中是否存在指定元素,需要用到equals方法,若存在就用remove进 ...

  2. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  3. 201871010106-丁宣元 《面向对象程序设计(java)》第八周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第八周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...

  4. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  5. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  6. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

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

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

  8. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

  9. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  10. 20175317 《Java程序设计》第九周学习总结

    20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...

随机推荐

  1. POI 的API大全二

    1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发 ...

  2. setBit testBit权限管理(shiro项目中来的二)

    一,setBit testBit权限管理的理解 1.1.jdk7文档解释 public boolean testBit(int n)Returns true if and only if the de ...

  3. 《你不知道的 JavaScript 上卷》 学习笔记

    第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...

  4. C#图解教程 第二十一章 命名空间和程序集

    命名空间和程序集 引用其他程序集 mscorlib库 命名空间 命名空间名称命名空间的补充命名空间跨文件伸展嵌套命名空间 using 指令 using命名空间指令using别名指令程序集的结构 程序集 ...

  5. 爬虫抓包工具Charles设置

    1.安装注册 感谢https://www.jianshu.com/p/89111882fa99提供注册码软件去官网下载安装即可. Registered Name:https://zhile.io Li ...

  6. 【BZOJ3527】力(FFT)

    [BZOJ3527]力(FFT) 题面 Description 给出n个数qi,给出Fj的定义如下: \[Fj=\sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{ ...

  7. Linux系统中svn服务器设置开机启动

    安装完svn服务器后虽然好用但是因为经常重启Linux服务器,每次重启完就要去手动启动svn服务器,很是麻烦,于是在网上找了一些方法后,自己把svn服务器设置成开机启动 步骤一:安装svn服务器: h ...

  8. angular路由详解六(路由守卫)

    路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...

  9. 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)

    Exceptionless是一个非常优秀的事件记录服务,目前我们的自部署的Exceptionless已经稳定运行了近一年的时间,收集了千万条事件信息.但Exceptionless官方自宿主部署的文档不 ...

  10. JavaScript编码规范(1)

    参考的是百度公司的JS规范,分为两部分.这是第一部分 [建议] JavaScript 文件使用无 BOM 的 UTF-8 编码. 空格 [强制] 二元运算符两侧必须有一个空格,一元运算符与操作对象之间 ...