zoukankan      html  css  js  c++  java
  • java第七次作业

    1. 本周学习总结

    参考资料:
    XMind

    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的实现需要遍历ArrayList。如果为null,则返回序号,如果不是null,则使用equals方法,接着返回序号。

    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; // clear to let GC do its work
    
        return oldValue;
    }
    private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }
    

    答::先使用rangeCheck方法判断输入的参数index是否超出大小范围,如果是,则输出IndexOutOfBoundsException异常,如果不是,则删除指定的元素,之后再将删除位置之后的元素往前移,最后使得size-1的位置的值为null,并使GC clear it。

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

    答:ArrayList储存的数据类型都是Object类,Object类是所有类的父类,存储数据时无需考虑元素的类型。在1.1与1.2的源代码中,并没有对ArrayList的数据类型有任何定义,所以不需要考虑。

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

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

    可以使用ensureCapacityInternal用来调整容量。

    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
    
        ensureExplicitCapacity(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); 
            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); 
    }  
    

    int newCapacity = oldCapacity + (oldCapacity >> 1);这种操作剋有增加数组容量。

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

    private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }
    

    答:使用private声明,说明此方法只在代码内部进行,这个方法主要是限制语句的操作范围,如果使用越界,用户可以更加清晰的发现,而这个rangeCheck操作主要是在代码内部进行,所以声明为private而不声明为public。

    2.HashSet原理

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

    HashSet的存储形式用链表数组实现---〉每个列表被称为桶。

    1.当我们向HashSet中添加一个元素时,HashSet会先调用该对象的hashCode()方法得到其hashCode值,根据该值决定该对象在桶中存储位置。 2.如果桶中已有其他元素,则调用加入对象的equals()方法与已有元素进行比较。如果比较结果为假,则将对象插入桶中。如果比较结果为真,则用新的值替换旧的值。 但是,如果有两个元素通过equals()方法比较返回true,而它们的hashCode()方法返回值不等,HashSet也会将它们存储在不同的位置。

    所以需要调用equals方法和hashCode方法。

    3.ArrayListIntegerStack

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


    区别是一个是自己写是内部实现数组倒是内一个是动态数组,自己定义的需要定义数组大小,而ArrayListIntegerStack使用list可以自动扩容。此外,ArrayListIntegerStack不需要使用指针,可以直接通过list的一些方法来进行删除,查找等操作。

    3.2 简单描述接口的好处.

    可以达到相同方法,不同实现的目的。同时我们还可以根据不同的需要,使用不同的方法实现同一个目的。

    4.Stack and Queue

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

    ArrayStack是实验1中自己定义的类,但是放在这里用需要吧所有的Integer改成String。

    4.2 题集jmu-Java-05-集合之5-6 银行业务队列简单模拟

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

    if (xy.size() < 10) {
    			for (int i = 0; i < xy.size(); i++)
    				System.out.println(xy.toArray()[i]);
    		} else {
    			for (int i = 0; i < 10; i++)
    				System.out.println(xy.toArray()[i]);
    		}
    

    总结:TreeSet能够默认将放入的单词排序,所以我们只要将输入的语句放入TreeSet中,按照题目要求输出就可以了。

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

    while(sc.hasNext()){
    		String str=sc.next();
    		if(str.equals("!!!!"))
    		break;	
    		else{
    			if(map.containsKey(str)){
    				int x=map.get(str);
    				x++;
    				map.put(str, x);}
    			else map.put(str,1);
    			}
    	}
    
    List<Entry<String,Integer>> list = new ArrayList<Entry<String,Integer>>(map.entrySet());
    Collections.sort(list,new Comparator(){});
    for (int i = 0; i < 10; i++) {
        System.out.println(list.get(i));
    }
    

    使用containsKey判断map中是否存在过这个单词,有就讲次数Integer加一,没有就放入map中,由于map中没有排序的方法,那就将他放入List中,排序输出就可以了。

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

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

  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/lsl321/p/6681476.html
Copyright © 2011-2022 走看看