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)
}
l ist在之前的基础上添加了 addFirst()、addLast()
getFirst()、getLast()
removeFirst()、removeLast()
利用这些功能就可以做队列和栈,简单代码演示:

队列
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;
	}
}

 栈 
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));
代码演示如下:
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类,提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。
代码如下(包括非中文和中文的)
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);//返回
			
		}
    	
    }





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值