集合
一、集合类概述
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集合中的元素允许重复,元素出现的顺序就是对象插入的顺序。类似于数组,用户可以使用索引来访问集合中的元素。List为Collection的子接口可以使用其所有方法,常用方法:
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值
*/
@Override
public 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 之后再去比较 hashCode
if(user.id == this.id && user.username.equals(this.username)) return true;
}
return false;
}
/**
* 重写hashcode 方法,返回的hashCode 不一样才认定为不同的对象
*/
@Override
public int hashCode() {
//return id.hashCode(); // 只比较id,id一样就不添加进集合
return id.hashCode() * username.hashCode();
}
}
五、Map集合
map是一个键值对形式的集合。它的元素都是有键和值组成。Map的键(key)是唯一的,值(value)可以重复。
1.HashMap与Hashtable的区别
1).Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能好一些;但如果有多个线程访问同一个Map对象时,是盗用Hashtable实现类会更好。
2).Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;但是HashMap可以使用null作为key或value。
2.TreeMap
1).TreeMap是SortedMap接口的实现类。TreeMap是一个有序的key-value集合,它是通过红黑树实现的,每个key-value对即作为红黑树的一个节点。
2).TreeMap排序方式
自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException异常。
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。
3.TreeMap中判断两个元素key、value相等的标准
类似于TreeSet中判断两个元素相等的标准,TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0,TreeMap即认为这两个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);
}
}