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倍