day1-作业(1-11)JAVA集合框架学习

1-画出Collection接口下的子接口的结构
在这里插入图片描述

2-画出Map接口下的子接口的结构
在这里插入图片描述

3-Set和List的区别?

Set:元素无序,不可重复
List:元素有序,可重复

4-HashSet和Set用法有什么不同?

Set:接口,不可创建对象
HashSet:Set的实现类,可创建对象

5-Map和HashMap用法有什么不同?

Map:接口,不可创建对象
HashMap:Map的实现类,可创建对象

6-eclipse导入包的快捷键是什么?

Ctrl+Shift+O

7-ArrayList的size和length区别是啥?

length:属性
size:方法
ArrayList只有size,没有length

8-ArrayList、LinkedList、Vector区别?从底层实现、查询遍历、修改插入删除、安全性、效率等角度.

ArrayList:底层实现是数组,查询快,增删改慢,线程不安全,效率高
LinkedList:底层实现是链表,查询慢,增删改快,线程不安全,效率高
Vector: 底层实现是数组,查询快,增删改慢,线程安全的,效率低

9-自己实现一个ArrayList类,并对关键代码加注释,并本地调用方法。要求实现至少ArrayList的2个方法.


```java
package cn.bjsxt.collection;

import java.util.List;

/**
 * 自定义ArrayList
 * @author WL20180732
 *
 */
public class SxtArrayList/* implements List*/{
	
	private Object[] elementData;
	
	private int size;
	
	
	public int size(){
		return size;
	}
	
	public boolean isEmpty(){
		return size==0;
	}
	
	public SxtArrayList(){
		this(10);
	}
	
	public SxtArrayList(int initialCapacity){
		if(initialCapacity<0){
			try {
				throw new Exception();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		elementData = new Object[initialCapacity];
	}
	
	public void add(Object obj){
		// 数值扩容
		if (size == elementData.length) {
			Object[] newArray = new Object[size * 2 + 1];
			System.arraycopy(elementData, 0, newArray, 0, elementData.length);
			elementData = newArray;
		}
		elementData[size++]=obj;
	}
	
	public Object get(int index){
		rangeCheck(index);
		
		return elementData[index];
	}
	
	public void remove(int index){
		rangeCheck(index);
		//删除指定位置的对象
		int numMoved = size - index - 1;
		if (numMoved > 0){
			System.arraycopy(elementData, index+1, elementData, index,
					numMoved);
		}
		elementData[--size] = null; // Let gc do its work
	}

	public void remove(Object obj){  //使用Object的equals方法判断是否存在地址相同的对象
		for(int i=0;i<size;i++){
			if(get(i).equals(obj)){
				remove(i);
			}
		}
	}
	
	public Object set(int index,Object obj){
		rangeCheck(index);

		Object oldValue =  elementData[index];
		elementData[index] = obj;
		return oldValue;
	}
	
	public void add(int index,Object obj){
		rangeCheck(index);
		// 数值扩容
		if (size == elementData.length) {
			Object[] newArray = new Object[size * 2 + 1];
			System.arraycopy(elementData, 0, newArray, 0, elementData.length);
			elementData = newArray;
		}
		
		System.arraycopy(elementData, index, elementData, index + 1,
				 size - index);
		elementData[index] = obj;
		size++;
	}
	
	private void rangeCheck(int index){
		if(index<0||index>=size){
			try {
				throw new Exception();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		SxtArrayList<Object> list = new SxtArrayList<Object>();
		list.add("aaa");
		list.add(new Date());
		list.add(new Dog());
		list.add(1234);
		System.out.println(list.size());
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
}

10-System.arraycopy 函数的作用?请用代码说明.

System.arraycopy(srcArray, srcPos, destArray, destPos, length);
作用:数组复制
参数:
	srcArray:源数组
	srcPos:源数组中开始复制的位置
	destArray:目标数组
	destPos:目标数组的开始位置
	length:复制的元素个数

11-自己实现一个LinkedList类,并对关键代码加注释,并本地调用方法。要求实现至少LinkedList的2个方法.

package cn.bjsxt.collection;

/**
 * 测试链表类
 * @author WL20180732
 */
public class SxtLinkedList/* implements List */ {
	private Node first;
	private Node last;

	private int size;

	public int size() {
		return size;
	}

	public void add(Object obj) {
		Node n = new Node();
		if (first == null) {
			n.setPrevious(null);
			n.setObj(obj);
			n.setNext(null);
			first = n;
			last = n;
		} else {
			n.setPrevious(last);
			n.setObj(obj);
			n.setNext(null);
			last.setNext(n);
			last = n;
		}
		size++;
	}

	public Object get(int index) {
		rangeCheck(index);
		Node temp = node(index);
		if (temp != null) {
			return temp.obj;
		}
		return null;
	}

	public void remove(int index) {
		Node temp = node(index);
	
		if (temp != null) {
			Node up = temp.previous;
			Node down = temp.next;
			up.next = down;
			down.previous = up;
			size--;
		}
	
	}

	public Node node(int index) {
		Node temp = null;
		if (first != null) {
			//判断index与链表长度的1/2的大小关系,若小于,则从前向后找,否则从后向前找
			if (index < (size >> 1)) {
				temp = first;
				for (int i = 0; i < index; i++) {
					temp = temp.next;
				}
			} else {
				temp = last;
				for (int i = size - 1; i > index; i--) {
					temp = temp.previous;
				}
			}

		}
		return temp;
	}

	public void add(int index, Object obj) {
		Node temp = node(index);

		Node newNode = new Node();
		newNode.obj = obj;

		if (temp != null) {
			Node up = temp.previous;
			up.next = newNode;
			newNode.previous = up;

			newNode.next = temp;
			temp.previous = newNode;

			size++;
		}
	}

	private void rangeCheck(int index) {
		if (index < 0 || index >= size) {
			try {
				throw new Exception();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		SxtLinkedList list = new SxtLinkedList();
		list.add("aaa");
		list.add("bbb");
		// list.add(1,"BBBB");
		list.add("ccc");
		list.add("ddd");
		list.add("eee");
		// list.remove(1);
		System.out.println(list.get(3));
	}

}

12-eclipse上下移动整行代码快捷键是什么?

Alt + up/down

13-Map接口类的方法,put,get,remove,containsKey,containsValue,size,isEmpty,putAll,clear 分别用代码加注释说明其用法.

package test;

import java.util.HashMap;
import java.util.Map;

public class TestMap {
	
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<>();
		
		// 测试put方法
		map.put("a", "1");
		map.put("b", "2");
		map.put("c", "3");
		map.put("d", "4");
		
		//测试get方法
		System.out.println(map.get("c"));
		
		// 测试remove方法
		map.remove("c");
		for (String key : map.keySet()) {
			System.out.println(map.get(key));
		}
		
		// 测试containsKey方法
		System.out.println(map.containsKey("b"));
		
		// 测试containsValue方法
		System.out.println(map.containsValue("4"));
		
		// 测试size方法
		System.out.println(map.size());
		
		// 测试isEmpty方法
		System.out.println(map.isEmpty());
		
		// 测试putAll方法
		Map<String, String> map2 = new HashMap<>();
		map2.put("e", "5");
		map.putAll(map2);
		for (String key : map.keySet()) {
			System.out.println(map.get(key));
		}
		
		// 测试clear方法
		map.clear();
		System.out.println("after clear map is " + (map.isEmpty()?"empty": "not empty"));
	}
}

14-HashMap,HashTable区别?

1.继承的父类不同
	Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2.线程安全性不同
	Hashtable 线程安全
	HashMap 线程不安全
3.是否提供contains方法
	Hashtable 提供contains方法
	HashMap 提供containsKey、containsValue方法,不提供contains方法
4.key和value是否允许null值
	Hashtable  key和value都不允许出现null值
	HashMap   null可以作为键,这样的键只有一个
5.hash值不同
	HashTable 直接使用key的hashCode
	HashMap  重新计算key的hashCode
6.内部实现使用的数组初始化和扩容方式不同
	HashTable 默认容量为11,不要求底层数组的容量一定要为2的整数次幂,扩容时,将容量变为原来的2倍加1
	HashMap  默认容量为16,要求底层数组的容量一定为2的整数次幂,扩容时,将容量变为原来的2倍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值