Set,List,Map
阿新 • • 發佈:2019-01-11
Set(集)
List(列表)
Map(對映)
List特點:元素有放入順序,元素可重複
Map特點:元素按鍵值對儲存,無放入順序
Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
List介面有三個實現類:LinkedList,ArrayList,Vector
LinkedList:底層基於連結串列實現,連結串列記憶體是散亂的,每一個元素儲存本身記憶體地址的同時還儲存下一個元素的地址。連結串列增刪快,查詢慢
ArrayList和Vector的區別:ArrayList是非執行緒安全的,效率高;Vector是基於執行緒安全的,效率低
Set介面有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
SortedSet介面有一個實現類:TreeSet(底層由平衡二叉樹實現)
Query介面有一個實現類:LinkList
Map介面有三個實現類:HashMap,HashTable,LinkeHashMap
HashMap非執行緒安全,高效,支援null;HashTable執行緒安全,低效,不支援null
SortedMap有一個實現類:TreeMap
其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,儲存的是鍵值對
set 一般無序不重複.map kv 結構 list 有序
Set:
package cn.hncu.search.set;
public class MySet {
private Object[] objs = new Object[0];
public boolean add(Object obj) {
// 衛條件---相同的物件只能放一份,因此有重複的物件則放不進去
if (contains(obj)) {
return false;
}
// 經過上面的衛條件,說明當前物件在集合中不存在,可以加
// 1先建立一個新的陣列,長度為原來的加1
Object tmpObjs[] = new Object[objs.length + 1];
// 2把原來陣列當中的元素拷到新的當中
System.arraycopy(objs, 0, tmpObjs, 0, objs.length);
// 3把將要加入集合的物件obj放在新陣列中的最後一個位置
tmpObjs[objs.length] = obj;
// 4把新陣列賦給objs
objs = tmpObjs;
return true;
}
public Object[] getAll() {
return objs;
}
public boolean contains(Object obj) {
for (Object tm : objs) {
if (tm.equals(obj)) {
return true;
}
}
return false;
}
public int size() {
return objs.length;
}
}
import org.junit.Test;
public class TestMySet {
@Test //測試新增基本資料型別
public void test1(){
MySet set = new MySet();
set.add(1);
set.add("hello");
set.add("+");
set.add(1);//測試重複
Object objs[] = set.getAll();
for(Object obj:objs){
System.out.println(obj);
}
}
@Test //測試新增自定義型別
public void test2(){
MySet set = new MySet();
Person p = new Person("Jack",20);
Person p2 = new Person("Jack",20);//測試重複
Person p3 = new Person("Rose",22);
set.add(p);
set.add(p2);
set.add(p3);
set.add( new A(1,23.5));
set.add( new A(2,53.5));
set.add( new A(100,123.5));
set.add( new A(100,123.5));//測試重複
set.add( new A(8,98));
Object objs[] = set.getAll();
for(Object obj:objs){
System.out.println(obj);
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return name + "," + age;
}
}
class A{
private int x;
private double y;
public A(int x, double y) {
super();
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
long temp;
temp = Double.doubleToLongBits(y);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
A other = (A) obj;
if (x != other.x)
return false;
if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
return false;
return true;
}
@Override
public String toString() {
return "[" + x + "," + y + "]";
}
}
List:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//演示集合的普通操作
public class ListDemo {
//新增到List中的元素的順序與它的HashCode無關,是按照新增的先後順序存放
public static void main(String[] args) {
List list = new ArrayList();
list.add(11);
list.add("abc");
list.add(45.6);
list.add(11);//List允許新增重複的元素
list.add(new Person("Jack",22));
list.add(new Person("Jack",22));//List允許新增重複的元素
list.add(new Person("Tom",21));
//查(遍歷)--法1
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
System.out.println("-----------");
//查(遍歷)--法2 ----利用與位置相關的方法來實現
for(int i=0; i<list.size(); i++){
System.out.println( list.get(i) );
}
}
}
Map:
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 開發的一個Map容器
*@author<a href="mailto:[email protected]">廖枝平</a>
*@version 1.0 2017-1-6 上午8:55:04
*@fileName MyMap.java
*/
public class MyMap {
private Map map = new HashMap();
/**
* @param key
* 新增加元素的鍵
* @param value
* 新增加元素的值
* @return
* 返回值是原來容器中該key所對應的value值,如果原來不存在則返回null
*/
public Object put(Object key,Object value){
return map.put(key, value);
}
//刪
public Object remove(Object key){
return map.remove(key);
}
//改
public boolean update(Object key,Object value){
if(map.get(key)==null){
return false;
}else{
map.put(key, value);
return true;
}
}
//查(單、全、條件)
public Object get(Object key){
return map.get(key);
}
public Map getAll(){
return map;
}
public Map getByCondition(String strValue){
Map m = new HashMap();
Set<Entry> entries = map.entrySet();
for(Entry en:entries){
Object value = en.getValue();
if(value.toString().contains(strValue)){
Object key=en.getKey();
m.put(key, value);
}
}
return m;
}
}