疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java集合入门基础理论知识


 

 
Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。
集合的定义:
集合是包含多个对象的简单对象,所包含的对象称为元素。集合里面可以包含任意多个对象,数量可以变化;同时对对象的类型也没有限制,也就是说集合里面的所有对象的类型可以相同,也可以不同。
Collection集合主要是三类:set,List,Map.
set和list 继承Collection
set和Collection的自带函数差不多,可以去查看API。
Map是单独的。以<key>,<value>
 
 
“集合框架”支持Set接口两种普通的实现:HashSet和TreeSet。在更多情况下,会使用HashSet存储重复自由的集合。考虑到效率,添加到HashSet的对象需要采用恰当分配散列码的方式来实现hashCode()方法。当需要从集合中以有序的方式抽取元素时,TreeSet实现会有用处。为了能顺利进行,添加到TreeSet的元素必须是可排序的。
set中的Hashset,TreeSet。
“集合框架”支持Set接口两种普通的实现:HashSet和TreeSet。在更多情况下,会使用HashSet存储重复自由的集合。考虑到效率,添加到HashSet的对象需要采用恰当分配散列码的方式来实现hashCode()方法。当需要从集合中以有序的方式抽取元素时,TreeSet实现会有用处。为了能顺利进行,添加到TreeSet的元素必须是可排序的。
Set中的部分内部方法{boolean contains( Object obj )
boolean addAll( Collection collection )    //取并集
void clear()
void removeAll( Collection collection )
void retainAll( Collection collection )       //取交集}
(HashSet)添加对象,排序可能是乱序的,相当于一个罐子,放进去后没有标记,但是不能有重复的。
(Treeset)排序时候,对象积要自己去实现 implements Comparable。自己去写按什么比较,根据自己写的去比较。
 
List(arraylist和 Linkedlist)
部分内部方法{
void add(int index, Object element) //加到指定位置
 
boolean addAll(int index, Collection collection)
 
Object get(int index) //获取指定位置的元素
 
int indexOf(Object element)
 
int lastIndexOf(Object element)
 
Object remove(int index)
 
Object set(int index, Object element) //替换指定位置的元素
 
List subList(int fromIndex, int toIndex)
list在之前的基础上添加了 addFirst()、addLast()
getFirst()、getLast()
removeFirst()、removeLast()
利用这些功能就可以做队列和栈,简单代码演示:
 
队列
[java] 
package cn.hncu.collection;  
  
import java.util.ArrayList;  
  
public class Myque {  
    ArrayList list=new ArrayList();  
    int index=0;  
    public void in(Object obj ){  
        list.add(obj);  
        index++;  
    }  
    public Object out(){  
        Object obj =list.remove(0);  
        index--;  
        return obj;  
    }  
}  
 
 栈 
[java]
package cn.hncu.collection;  
  
import java.util.ArrayList;  
  
public class Mystack {  
    ArrayList list =new ArrayList();  
    int dex=0;  
    public void push(Object obj){  
        list.add(obj);  
        dex++;  
    }  
    public Object pop(){  
        dex--;  
        Object obj =list.remove(dex);//获得弹出取得值;  
//      Object num=list.get(dex);//获得一出去的对象;  
        return obj;  
    }  
      
}  
内部就不用自己去用对象数组,直接用集合的自带函数,这让我们省去了很多麻烦。
1)使用List(如ArrayList)时,不会自动调用hashCode()方法。因为在List中,重复了就重复了,不需判断,保证唯一性。
 
2)List中添加了下标index的功能,这样对List的修改可以利用set方法对指定位置的元素直接进行替换,不需要象Set那么复杂(要转换成数组才能修改,之后还要转换回去)。
3)Collection用Iterator迭代器,而List可以用ListIterator列表迭代器。前者只能next(),后者不但包含next()方法,还包含previous()方法。因此,如果要用List做类似书的翻页功能,不但可以向后翻,还可以向前翻。
在什么时候使用list的子类呢?
如果要支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList提供了可选的集合。
 
但如果要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么LinkedList实现更好。
 
Map (Map接口不是Collection接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。)
Map(HashMap 和 TreeMap)
map部分函数功能:
Object put(Object key,Object value)//添加元素
 
Object remove(Object key)//移除key
 
void putAll(Map mapping)//添加所有的map值
 
void clear()//清除所有的元素
 
Object get(Object key)//获得key的对象
“集合框架”提供两种常规的Map实现:HashMap和TreeMap。和所有的具体实现一样,使用哪种实现取决于特定需要。在Map中插入、删除和定位元素,HashMap是最好的选择。但如果要按顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()实现(助理解:Map.keySet返回的是键的Set集合,而Set集合对hashCode实现有限制,因此作为键的类也要遵守该限制)。有了TreeMap实现,添加到映射的元素一定是可排序的。
HashMap和TreeMap都实现Cloneable接口。
在这中间用到的排序 (java.util.Comparator接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许把集合排序成自然顺序。)
该接口中的compare ( T o1, To2)方法: 比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负、零或正整数。
使用HashMap对数据进行增删改查(以及map查看的三种形式(key),(entry),(value));
代码演示如下:
[java]
package cn.hncu.collection;  
  
import java.util.Collection;  
import java.util.HashMap;  
import java.util.Iterator;  
import java.util.Map;  
import java.util.Map.Entry;  
import java.util.Set;  
  
public class hashMap {  
  
    public static void main(String[] args) {  
        HashMap hash=new HashMap();  
          
        //增     必须增加key和 values的值同时增加  
        hash.put(12 , "哈市");  
        hash.put(121    , "哈撒旦");  
        hash.put(11 , "哈asd");  
        hash.put(75 , "哈的撒");  
        hash.put(16 , "哈发的");  
          
        //删   只需要删除(移除)key 就行  
        hash.remove(121);  
          
        //改  
        hash.put(75, "新新");  
          
        //查(输出)  
        print1(hash);//key进行遍历  
        print2(hash);//entry 进行遍历  
        print3(hash);//key进行遍历  
    }  
/* 
 * 法一 通过key视图 
 */  
    private static void print1(HashMap hash) {  
        Set set =hash.keySet();//直接通过keyset来获得Set类型  
        Iterator it =set.iterator();//拥有Set的迭代器进行遍历  
        while(it.hasNext()){  
            int key =(Integer) it.next();//获得key的值  
            String value =(String) hash.get(key);//获得value的值  
            System.out.println("key:"+key+","+"value:"+value);  
        }  
          
    }  
      
/* 
 * 法 2 通过entry试图 
 *   
 */  
    private static void print2(HashMap hash){  
        Set set=hash.entrySet();//entry 视图进行遍历,  首先必须通过entrySet得到set  
        Iterator it =set.iterator();//得到迭代器  
        while(it.hasNext())  
        {  
            Map.Entry entry=(Entry) it.next();//获得entry 变量  
            int key=(Integer) entry.getKey();//分别获得key ,value  
            String value =(String) entry.getValue();  
            System.out.println(key+","+value);  
        }  
    }  
      
      
      
    private static void print3(HashMap map){  
        Collection col=map.values();//返回的是Collection类型的.  
        Iterator it =col.iterator();  
        while(it.hasNext()){  
            String values =(String) it.next();  
            System.out.println(values);  
        }  
    }  
  
}  
不尽如此,要是使用中文作为关键字,也能进行排序。
中文排序问题:
比较函数对于英文字母与数字等ASCII码中的字符排序都没问题,但中文排序则明显不正确。这主要是Java中使用中文编码GB2312或GBK时,char型转换成int型的过程出现了比较大的偏差。这偏差是由compare方法导致的,因此我们可以自己实现Comparator接口。另外,国际化问题可用Collator类来解决。
 
java.text.Collator类,提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。
代码如下(包括非中文和中文的)
[java]
package cn.hncu.collection;  
  
import java.text.CollationKey;  
import java.text.Collator;  
import java.util.Comparator;  
import java.util.Iterator;  
import java.util.Map;  
import java.util.Map.Entry;  
import java.util.Set;  
import java.util.TreeMap;  
  
public class TreeMapdemo {  
  
    public static void main(String[] args) {  
        map1();//一般的排序,  
        map2();//中文 作为关键字 进行排序  
          
    }  
  
    private static void map2(  ) {  
        TreeMap map =new TreeMap( new SortMap2());//treeMap 通过这个自己写的SortMap2进行排序(带中文)  
        map.put("你", 22);  
        map.put("我", 221);  
        map.put("它", 224);  
        map.put("我们", 2212);  
        map.put("你门", 222);  
        print(map);  
          
    }  
  
    private static void map1() {  
        TreeMap map =new TreeMap( new Sortmap());//treeMap 通过这个自己写的SortMap2进行排序(字符比较)  
        map.put(1, "老大");  
        map.put(5, "老2");  
        map.put(3, "老3");  
        map.put(2, "老4");  
        map.put(71, "老5");  
        map.put(7, "老6");  
        map.put(22, new Person(11, "wqewq", 2));  
        print(map);  
    }  
  
    private static void print(TreeMap map) {  
            Set set=map.entrySet();  
            Iterator it =set.iterator();  
            while(it.hasNext()){  
                Map.Entry entry =(Entry) it.next();  
//              int key =(Integer) entry.getKey();  
//              String value =(String) entry.getValue();//若是这样写,当value带所有对象 无法转换成STring 所以直接写方便  
                System.out.println(entry.getKey()+","+entry.getValue());  
            }  
    }  
  
}  
  class Sortmap implements Comparator{  
  
    @Override  
    public int compare(Object m, Object n) {  
        int x= m.toString().compareTo(n.toString());//返回整数,若较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负、零或正整数  
        return x;  
    }  
  }  
    class SortMap2 implements Comparator{  
        Collator col =Collator.getInstance();//java.text.Collator, 获取当前默认语言环境的 Collator。  
        public int compare(Object o1, Object o2) {  
            CollationKey key1=col.getCollationKey(o1.toString());//将该 String 转换为一系列可以和其他 CollationKey 按位进行比较的位。  
            CollationKey key2=col.getCollationKey(o2.toString());  
            return key1.compareTo(key2);//返回  
              
        }  
          
    }