java容器

1.为什么使用容器?

    Java在保存数据时,如果是基本类型,且保存数据的数量(大小)确定,那么数组无疑是最好的选择;

    但是,如果保存的数据是对象或者其大小在使用之前无法准确定义,那么如何解决这样的问题呢?

    此时可以考虑使用容器;

2.容器及其特点

    容器:一类保存数据(对象)的数据结构,可以实现基本的存储、检索等操作;

    特点:a.用于存储对象;b.容器的长度可变;c.容器中不可存储基本的数据类型;

3.容器的结构

    主要分为两类,Collection与Map

其中,i表示接口,c表示实现类;

    接口:表示一系列方法的集合,其允许实现类赋予其不同的功能,从而达到“多态”。在面向对象编程语言中,接口通常用来形成规范。

    实现类:集合接口的具体实现(详细描述),是重用性很高的数据结构。

List:有序的,可伸缩数组,顺序保存对象,可以重复;

    ArrayList:数据存储是连续的,类似于存储对象的数组,等价于”数组的升级”;索引查询较快,插入比较慢,线程不安全;

    LinkedList:双向列表,等介于”链表”,索引较慢,插入比较快,非线程安全;

    Vector:类似于ArrayList,不同点在于线程安全;

    Stack:继承自Vector,实现一个后进先出的堆栈;

Set:不包含重复的元素

    HashSet:数据无序,线程不安全;

    TreeSet(继承自SortedSet):数据有序;

    LinkedHashSet:根据元素的hashcode决定元素的存储位置,维护元素的次序;

Queue:模拟队列的数据结构,不允许随机访问队列元素;

    PriorityQueue保存数据按照元素的排序结果,而不是根据加入队列的顺序;

    Deque:代表双端队列,可以当做栈来用;

Map:从键映射到值的数据结构,其中保存的值可以重复,键不能重复;

    HashMap:不允许空的键值对出现,非线程安全

    Hashtable:允许有空的键值对出现,线程安全

小结:

4.基本使用

    4.1 ArrayList存储,排序

public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
		//0.输入异常的处理
		ArrayList<Integer> result = new ArrayList<>();
		if(input==null || k>input.length) return result;
		ArrayList<Integer> list = new ArrayList<>();
		//1.使用Arraylist存储值;
		for (int i = 0; i < input.length; i++) {
			list.add(input[i]);
		}
		//2.调用Collections中的静态方法实现排序
		Collections.sort(list);
		//3.选择前k个存入arraylist并返回
		int num = 1;
		for (Integer integer : list) {
			if(num<=k){
				result.add(integer);
				num ++;
			}else{
				break;
			}
		}
		return result;
        
    }
	//输入:num [] = {4,5,1,6,2,7,3,8};,k = 4
	//输出:1,2,3,4

    4.2 HashMap三种遍历方法

Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Five", 5);
        map.put("Seven", 7);
        map.put("Eight", 8);
        map.put("One",1);
        map.put("Two",2);
        map.put("Three", 3);
        //方法1:遍历输出Value
        System.out.println("依次输出值:");
        Collection<Integer> c = map.values();
        Iterator<Integer> iter = c.iterator();
        while (iter.hasNext()) {
			System.out.println(iter.next());
		}
        //方法2:遍历输出Key
        Set<String> keys = map.keySet();
        Iterator<String> iter1 = keys.iterator();
        while (iter1.hasNext()) {
        	String str = iter1.next();
			System.out.print(str+","+map.get(str));
		}
        System.out.println();
        //方法3:遍历输出Key-Value
        Iterator<Entry<String, Integer>> iter2 = map.entrySet().iterator();
        while (iter2.hasNext()) {
        	Map.Entry<String, Integer> entry = iter2.next();
			System.out.println(entry.getKey()+","+entry.getValue());
		}
	//方法1:8,5,1,7,2,3,
	//方法2:Eight,8Five,5One,1Seven,7Two,2Three,3
	//方法3:Eight,8  Five,5  One,1  Seven,7  Two,2  Three,3 

    4.3 HashMap根据值对键值排序

    import java.util.ArrayList;
	import java.util.Comparator;
	import java.util.HashMap;
	import java.util.List;
	import java.util.Map;
	/**
	 * HashMap排序
	 *
	 */
	public class MapTest {
		public static void main(String[] args){
			Map<String, Integer> map = new HashMap<String, Integer>();
			//Map.Entry是Map中声明的一个内部接口,接口为泛型,定义为Entry<K,V>
			//相当于在list中存储的是Map类型的对象
			List<Map.Entry<String, Integer>> list = new ArrayList<>();
			map.put("Five", 5);
			map.put("Seven", 7);
			map.put("Eight", 8);
			map.put("One",1);
			map.put("Two",2);
			map.put("Three", 3);
			//将键值对存入list中
			for(Map.Entry<String, Integer> entry : map.entrySet()){
				 list.add(entry); 
			}
			//调用list.sort()方法排序,递增排序
			list.sort(new Comparator<Map.Entry<String, Integer>>(){
				//重写比较的方法,实现排序
				  @Override
				   public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
						return o1.getValue()-o2.getValue();} 
			}); 
			
			for(Map.Entry<String, Integer> entry: list){
				  System.out.println(entry);
			}
		}
	}
	//输出:One=1,Two=2,Three=3,Five=5,Seven=7,Eight=8,

5.区分点:

    5.1 Collection与Collections

        其中Collection是容器层次结构中的根接口,JDK不提供其具体实现,仅仅提供更加具体的子接口实现;

        而Collections是一个提供一些处理容器类静态方法的类;(类似于Arrays)

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值