集合

来源:互联网 发布:广东省社会科学院知乎 编辑:程序博客网 时间:2024/04/27 21:21

一、集合类概述

 1、集合的概念

  现实生活中:很多的事物凑在一起

  数学中的集合:具有共同属性事物的总体

  Java中的集合类:是一种工具,就像是个容器,存储任意数量的具有共同属性的对象。常用的集合有List集合,Set集合,Map集合。


 2、集合的作用

  1.在类的内部,对数据进行组织

  2.简单快速的搜索大数量的条目

  3.有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入和删除有关元素

  4.有的集和接口,提供了映射关系,可以通过关键字(key)去快速查找到唯一的对象,而这个对象的类型可以是任意的

 3.集合和数组的区别

  1.数组的长度数固定的,而集合的长度是可变的

  2.数组只能通过数组下标访问元素,且类型固定的。而有的集合可以通过任意类型查找所映射的对象。

二、collection接口

 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行,于是衍生出两个子类接口List和Set。


 Collection接口是层次接口中的根接口。构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加、删除、管理元素的方法。由于List接口和Set接口都继承了Collection接口,因此这些方法对List集合和Set集合是通用的。

 所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。

 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

Iterator it = collection.iterator(); // 获得一个迭代子

     while(it.hasNext()) {

        Object obj = it.next(); // 得到下一个元素

      }

 由Collection接口派生的两个接口是List和Set。


三、List集合

 List集合包括List接口和实现List接口的类。List集合中的元素允许重复,元素出现的顺序就是对象插入的顺序。类似于数组,用户可以使用索引来访问集合中的元素。ListCollection的子接口可以使用其所有方法常用方法

  

 1.ArrayList

  ArrayList类实现了可变的数组,允许保存所有的元素,包括null,并可以根据索引位置进行快速的随机访问;缺点是:向指定的位置插入对象或删除对象时的速度较慢。

package imooc_List;import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class arrayList {public static void main(String[] grgs){//创建一个list集合List books = new ArrayList();//向集合中添加元素books.add(new String("海的女儿"));books.add(new String("卖火柴的小女孩"));books.add(new String("老人与海"));//循环输出list中的元素for (int i = 0; i < books.size(); i++) {System.out.println(books.get(i));}        //修改list中索引为1的元素books.set(0, "新版海的女儿");//删除books中索引为2的元素books.remove(1);//输出剩余的部分元素System.out.println(books.subList(0, 2));//将list作为元素添加到Collection中HashMap map = new HashMap();map.put("books", books);map.put("newbooks", books);System.out.println(map);System.out.println(map.get("books"));    }}

 2.LinkedList

 LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.
 LinkedList的构造函数如下
  1. public LinkedList():  ——生成空的链表
  2. public LinkedList(Collection col):  复制构造函数

 其具体的用法可参考:http://www.jcodecraeer.com/a/chengxusheji/java/2014/1021/1818.html

四、Set集合

 1.概述

  Set集合中的对象不按照特定的方式排序,只是简单的把对象加入到集合中去,但集合中不能包括重复的对象。Set集合由set接口和Set接口实现的类组成。Set接口继承了Collection接口,因此包含Collection中的所有方法。

 2.各个方法的作用描述:

  1).public int size() :返回set中元素的数目,如果set包含的元素数大于Integer.MAX_VALUE,返回Integer.MAX_VALUE

  2).public boolean isEmpty() :如果set中不含元素,返回true

  3).public boolean contains(Object o) :如果set包含指定元素,返回true

  4).public Iterator iterator() : 返回set中元素的迭代器,元素返回没有特定的顺序,除非set提高该保证的某些类的实例 ;

  5).public boolean add(Object o) :如果set中不存在指定元素,则向set加入 ;

  6).public boolean addAll(Collection c) :过滤集合中的重复元素,向set加入c中所有元素添加到Set中,如果Set中已有某一元素,则不添加,因Set不允许有重复值

  7).public boolean remove(Object o) :如果set中存在指定元素,则从set中删除 ;

  8).public boolean removeAll(Collection c) :如果set包含指定集合,则从set中删除指定集合的所有元素;

  9).public void clear() :从set中删除所有元素;

 3.原理分析

 HashSet的元素存放顺序和添加进去时候的顺序没有任何关系(HashSet类按照哈希算法来存取集合中的对象,存取速度比较快)(允许包含值为null的元素,但最多只能有一个null元素);

 LinkedHashSet 则保持元素的添加顺序;

 TreeSet则是对Set中的元素进行排序存放(TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。

 4.Java Set 去除重复object 

package imooc_List;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;/** * 类描述:set集合针对String 类型和8大基础数据类型  过滤掉重复数据, * 如果存放的是其他类型对象,则需要重写hashCode方法和equals方法, * 当equals 比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,则不会存进set * @author lenovo * */public class set {public static void main(String[] args) {Set<String> nameSet = new HashSet<String>();nameSet.add("张三");nameSet.add("李四");nameSet.add("王五");nameSet.add("张三");//输出结果for (String name:nameSet) {System.out.print(name+"\t");}//list集合去除重复的基础数据List<String> nameList = new ArrayList<String>();nameList.add("张三");nameList.add("李四");nameList.add("王五");nameList.add("赵六");nameSet.addAll(nameList);// 去除编号和用户名一样的 对象,需要重写 equals 方法 和 hashCode方法User admin = new User(1, "admin");User user = new User(2, "user");User user1 = new User(2, "user");User admin1 = new User(3, "admin");Set<User> userSet = new HashSet<User>();userSet.add(admin);userSet.add(user);userSet.add(admin1);userSet.add(user1);// 输入结果 admin1,admin3,user2,for(User u : userSet){System.out.print(u.username + u.id + "\t");}System.out.println(user.equals(null));}}class User{protected Integer id;protected String username;public User(Integer id, String username){this.id = id;this.username = username;}/*** 如果对象类型是User的话 则返回true,去比较hashCode值*/@Overridepublic boolean equals(Object obj) {if(obj == null) return false;if(this == obj) return true;if(obj instanceof User){ User user =(User)obj;//if(user.id = this.id) return true; // 只比较id// 比较id和username 一致时才返回true 之后再去比较 hashCodeif(user.id == this.id && user.username.equals(this.username)) return true;}return false;}/*** 重写hashcode 方法,返回的hashCode 不一样才认定为不同的对象*/@Overridepublic int hashCode() {//return id.hashCode(); // 只比较id,id一样就不添加进集合return id.hashCode() * username.hashCode();}}

五、Map集合

  map是一个键值对形式的集合。它的元素都是有键和值组成。Map的键(key)是唯一的,(value)可以重复。


 

  1.HashMapHashtable的区别

    1).Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMapHashtable的性能好一些;但如果有多个线程访问同一个Map对象时,是盗用Hashtable实现类会更好。

    2).Hashtable不允许使用null作为keyvalue,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;但是HashMap可以使用null作为keyvalue

  2.TreeMap

    1).TreeMapSortedMap接口的实现类。TreeMap是一个有序的key-value集合,它是通过红黑树实现的,每个key-value对即作为红黑树的一个节点。

  2).TreeMap排序方式

  自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException异常。

  定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。

 3.TreeMap中判断两个元素keyvalue相等的标准

  类似于TreeSet中判断两个元素相等的标准,TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0TreeMap即认为这两个key是相等的。TreeMap中判断两个value相等的标准是:两个value通过equals()方法比较返回true

package imooc_List;import java.util.HashMap;import java.util.Map;public class map {//练习//Map集合的几个方法//1.isEmpty(判断Map集合是否为空)//2.put(向Map集合中插入数据(K—v值))//3.size(获取Map集合的大小)public static void main(String[] args) {Map<String,Object> map = new HashMap<String,Object>();boolean isNull = true;//1.判断是否为空isNull = map.isEmpty();System.out.println("插入后是否为空"+isNull);//2.向Map集合中插入数据(K—v值)map.put("cww", "c");map.put("jy", "j");map.put("wjj", "w");map.put("xxz", "x");map.put("cyz", "cc");map.put("zbr", "z");//判断是否为空isNull=map.isEmpty();System.out.println("插入后是否为空"+isNull);//3.获取Map集合的大小map.size();int Count = map.size();System.out.println("map集合:"+Count);//containsValue()、containsKey()、remove()boolean isKey = false;boolean isValue = false;isKey = map.containsKey("wjj");System.out.println("remove前是否存在当前的键"+isKey);isValue = map.containsValue("c");System.out.println("remove前是否存在当前的值"+isValue);map.remove("wjj");map.remove("zbr");isKey = map.containsKey("wjj");System.out.println("remove后是否存在当前的键"+isKey);isValue = map.containsValue("z");System.out.println("remove后是否存在当前的值"+isValue);//通过键值get(key)String mapValue = (String) map.get("xxz");System.out.println("输出根据get(key)的值:"+mapValue);}}