了解java集合框架

一、集合框架概述在这里插入图片描述
  • 集合和数组类似,都可以看作是一种容器,用来存储对象信息。但是集合比数组更加灵活方便。
  • 数组与集合的区别如下:
    (1) 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。
    (2) 数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。
  • Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)
  • 其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。
二、Java集合常见接口及实现类
1. Collection

Collection接口是最基本的集合接口,它不能直接实现。只能使用Collection的“子接口”如List和Set。
Collection 接口存储一组不唯一,无序的对象。

2.List 接口

List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
List 接口存储一组不唯一,有序(插入顺序)的对象。
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

3.Set

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。
Set 接口存储一组唯一,无序的对象。

4.Map

Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value。常用实现类有HashMap、LinkedHashMap、TreeMap等。
  Map常见方法(来源于API)如下:在这里插入图片描述

Map map=new HashMap();
  map.put("懒","杨沛");
  map.put("皮","杨沛");
  map.put("帅", "李宇恒");
  map.put("帅", "丁小龙");
  //获取:根据Key--->value
  System.out.println(map.get("帅"));
  //删除
  map.remove("皮");
  //map.clear();
  //判读是否包含某个Key值
  System.out.println(map.containsKey("丑"));
  //判断是否包含某个value
  System.out.println(map.containsValue("丁小龙"));
  //map的遍历
  for (Object key : map.keySet()) {
   System.out.println(key+"\t\t"+map.get(key));
  }
  Iterator mit=map.keySet().iterator();
  while (mit.hasNext()) {
   Object key=mit.next();
   System.out.println(key+"\t\t"+map.get(key));
  }
5.HashSet类

HashSet是Set集合最常用实现类,是其经典实现。HashSet是按照hash算法来存储元素的,因此具有很好的存取和查找性能。
  HashSet具有如下特点:
  ♦ 不能保证元素的顺序。
  ♦ HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。
  ♦ 集合元素值可以是null。

6.ArrayList

ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。
ArrayList擅长于随机访问。同时ArrayList是非同步的。
遍历 ArrayList

//创建和对象
  List list=new ArrayList();
  //添加
  list.add("复合肥");
  list.add("3445");
  list.add("李明");
  //指定下标插入
  list.add(2, "哈哈");
  //遍历集合
  for (int i = 0; i < list.size(); i++) {
   System.out.println(list.get(i).toString());
  }
  for (Object o : list) {
   System.out.println(o.toString());
  }
  //迭代器遍历集合
  Iterator it=list.iterator();
  while (it.hasNext()) {//haseNext:判断集合里是否还有数据
   System.out.println(it.next());
   
  }
  //单个查询:注意下标越界问题
  System.out.println(list.get(2));
  //判断某个数据在集合中是否存在
  System.out.println(list.contains("哈哈"));
  //判断集合是否为空
  System.out.println();
  //根据数据查找下标:如果查询不到,则返回-1
  System.out.println(list.indexOf("打开文件"));
  //查找最后一个出现的下标
  System.out.println(list.lastIndexOf("打开文件"));
  //删除
  list.remove(2);
  list.remove("打开文件");//如果要删除的数据时重复的,只能删除第一个
  list.clear();//清空
7.LinkedList

LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。
  LinkedList的实现机制与ArrayList的实现机制完全不同,ArrayLiat内部以数组的形式保存集合的元素,所以随机访问集合元素有较好的性能;LinkedList内部以链表的形式保存集合中的元素,所以随机访问集合中的元素性能较差,但在插入删除元素时有较好的性能。

LinkedList list2=new LinkedList();
  //添加
  list2.add("43vs");
  list2.add(1, "48729");
  list2.addFirst("322");
  list2.addLast("8974923");
  //获取
  list2.getFirst();
  list2.getLast();
  //删除
  list2.removeFirst();
  list2.removeLast();
8.Iterator接口和ListIterator接口

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下:
  ♦ boolean hasNext():判断集合里是否存在下一个元素。如果有,hasNext()方法返回 true。
  ♦ Object next():返回集合里下一个元素。
  ♦ void remove():删除集合里上一次next方法返回的元素。
  ListIterator接口继承Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下几个方法:
  ♦ boolean hasPrevious():判断集合里是否存在上一个元素。如果有,该方法返回 true。
  ♦ Object previous():返回集合里上一个元素。
  ♦ void add(Object o):在指定位置插入一个元素。
  以上两个接口相比较,不难发现,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素)。

9.HashMap与Hashtable

HashMap与Hashtable是Map接口的两个典型实现,它们之间的关系完全类似于ArrayList与Vertor。HashTable是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用了,HashMap与Hashtable主要存在以下两个典型区别:
  ♦ HashMap是线程不安全,HashTable是线程安全的。
  ♦ HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把null放进HashTable中,将会发生空指针异常。
  为了成功的在HashMap和Hashtable中存储和获取对象,用作key的对象必须实现hashCode()方法和equals()方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值