1.容器
接口图
- List:有序可重复
- Set:无序不可重复
- Map:key&value,
public class ColletionTest {
public static void main(String[] args) {
List l = new ArrayList();
l.add("zzz");
l.add(new Date());
l.add(123);//自动装箱
List l2 = new ArrayList();
l2.add("aaa");
l2.add("bbb");
l.add(l2);
l.remove(new Date());//hashcode和equals
System.out.println(l.get(2));
System.out.println(l.size());
}
}
//ArrayList:底层数组实现,线程不安全,查询块,插入,删除慢
//LinkedList:底层是列表实现,线程安全,查询慢,插入,删除快
//Vector:线程安全,效率低
Map接口实现的类有HashMap和TreeMap。存储键值对,键不能重复!
底层结构:数组+链表
HashMap:效率高,线程不安全
HashTable:效率低,线程安全
//初次实用Map
public class MapTest {
public static void main(String[] args) {
Map map = new HashMap();
map.put("高琪", new Wife("张曼玉"));
Wife w= (Wife)map.get("高琪");
System.out.println(w.name);
}
}
class Wife{
String name;
public Wife(String name){
this.name = name;
}
}
//实现简单的Map
public class MyMap {
public static void main(String[] args) {
MyMap m = new MyMap();
m.put("husband","wife");
m.put("husband2", "wife2");
System.out.println( m.get("husband2"));//wife2
}
MyEntry[] arr = new MyEntry[999];
int size;
public void put(Object key,Object value) {
MyEntry e = new MyEntry(key,value);
arr[size++]=e;
}
public Object get(Object key) {
for(int i =0;i<size;i++) {
if(arr[i].key.equals(key)) {
return arr[i].value;
}
}
return null;
}
public boolean containsKey(Object key) {
for(int i =0;i<size;i++) {
if(arr[i].key.equals(key)) {
return true;
}
}
return false;
}
}
class MyEntry{
Object key;
Object value;
public MyEntry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
//高级链接
public class MyMap2 {
public static void main(String[] args) {
MyMap2 map = new MyMap2();
map.put("0", "a");
map.put("1", "b");
System.out.println(map.get("0"));
}
LinkedList[] arr = new LinkedList[999];//链表
int size;
public void put(Object key, Object value) {
MyEntry e = new MyEntry(key,value);
int a = key.hashCode()%999;
if(arr[a]==null){
LinkedList list =new LinkedList();
arr[a]=list;
list.add(e);
}else {
LinkedList list=arr[a];
for(int i=0;i<list.size();i++) {
MyEntry e2 =(MyEntry)list.get(i);
if(e2.key.equals(key)) {
e2.value=value;//键重复,直接覆盖
}
}
arr[a].add(e);
}
}
public Object get(Object key) {
int a = key.hashCode()%999;
if(arr[a]!=null) {
LinkedList list =arr[a];
for(int i= 0;i<list.size();i++) {
MyEntry e=(MyEntry)list.get(i);
if(e.key.equals(key))
return e.value;
}
}
return null;
}
}
- equals和hashcode
如果两个对象equals相同,hashcode一定相同。反之不然。