JAVA集合
Java集合就像一个容器,可以把多个对象的引用放入容器中。
Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。
Java集合可分了Set、List和Map三种体系
–Set:无序,不可重复的集合
–List:有序,可重复的集合
–Map:具有映射关系的集合
1、Collection接口
1.1、是List,Set和Queue的父类,该接口定义的方法即可与操作Set集合,也可用于操作List和Queue集合。
1.2Collection中的一些方法
add 这个是添加一个元素到集合中
addAll 添加所有元素到集合中
在Collection中无法获取指定的元素,但可以遍历所有的元素,使用增强的for循环或者使用Iterator 迭代器。
class CollectionTest{
Iterater it = collection.iterator();
//hasNext指的是当前引用的下一个
//而next指的是当前对象的引用
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
}
clear 清空集合
remove(obj) 移除指定的元素
removeAll() 移除所有元素
contains(Object o)‘; 利用equals比较, 查看集合中有没有指定的元素
contains(Collection<?> c) 查看集合中有没有指定的元素
toArray()把集合转成Object类型的数组
一、Set集合
Set集合不允许包涵相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。
Set判断两个对象是否相同不是使用==运算符,而是根据equals方法
HashSet是Set接口的典型实现,大多数时候使用Set集合时都是用这个实现类。
HashSet按Hash算法来存储集合中的元素,因此具有良好的存取和查找性能。
HashSet具有以下特点:
–不能保证元素的排列顺序
–HashSet不是线程安全的
–集合元素可以使Null
1、HashSet
1.1 HashSet是Set的最典型实现
1.2 HashSet 中不能有重复的元素。判定两个元素相等的标准,equals()方法返回true
1.3HashSet根据hashCode()值来存放元素,所以不能保证元素的顺序。
1.4HashCode()方法:如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同。
2、LinkedHashSet
1、LinkedHashSet是HshSet的子类
2、LinkedHashSet集合根据元素的hashCode值来决定元素的存储位置,但他同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
3、LinkedHashSet性能插入行能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
4、LinkedHashSet不允许集合元素重复
3、TreeSet
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
–Comparator comparator()
–Object first()
–Object last()
–Object lower(Object e)
–Object higher(Object e)
–SortedSetsubSet(fromElement,toElement)
–SortedSetheadSet(toElement)
–SortedSettailSet(fromElement)
TreeSet支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。
1、默认情况学TreeSet要求集合中的元素必须实现Comparable接口,Comparable接口中只有一个方法,那就是。
//若返回0代表两个元素相等,若返回整数,代表当前元素大,若返回负数,代表当前元素小。
publiv int compareTo(T o)
TreeSet会调用每个元素的comparaTo()方法和集合中的每个已经有的元素去比较,进而决定当前元素在集合中的位置。
自然排序
TreeSet中的comparaTo方法
public int compareTo(Object o){
if(o instanceof Person){
Person person = (Person)o;
//这个方是按照年龄的升序排列
return this.age + person.age;
}else{
throw new ClassCastException("不能转为 Person 类型");
}
}
TreeSet实例
//这创建实例对象的类
public class Student implements Comparable{
private String studentNanme;//定义的学生名字
private int score;//定义的分数
public String getStudentNanme() {
return studentNanme;
}
public void setStudentNanme(String studentNanme) {
this.studentNanme = studentNanme;
}
public double getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [studentNanme=" + studentNanme + ", score=" + score
+ "]";
+
@Override//这个是比较的方法
public int compareTo(Object a) {
if(a instanceof Student){
Student ko = (Student)a;
return - this.score + ko.score;
}else{
throw new ClassCastException("");
}
}
}
//这个是测试TreeSet的类
public class TestTreeSet {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
TreeSet treeset = new TreeSet();
for(int i = 0 ; i < 5 ; i++){
Student student = new Student();
System.out.println("轻输入名字:");
String name = in.next();
System.out.println("请输入学生的成绩:");
int score = in.nextInt();
student.setStudentNanme(name);
student.setScore(score);
treeset.add(student);
}
Iterator it = treeset.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
定制排序
因为只有相同类的两个实例才会比较大小,所以向TreeSet中,重写该对象对应的equals()方法是,应保证该方法与compareTo(Object obj)方法有一致的结果:如果两个对象通过equals()方法比较返回true,则通过compareTo(Object obj)方法比较应返回 0
也可以通过创建Comparator对象来进行排序,代码如下:
Comparator comparator = new Comparator(){
@Override
public int compare(){
if(o1 instanceof Student && o2 instanceof Student){
Student stu1 = (Student)o1;
Student stu2 = (Studnet)o2;
return stu2.getScore() - stu1.getScore();
}
throw new ClassCastException("不能转换为 Student 对象");
}
}
二、 List集合
List代表一个元素有序且可重复的集合,集合中的每个元素都有其对应的顺序索引
List允许使用重读元素,可以通过索引来访问制定位置的集合元素。
List默认按元素的添加顺序设置元素的索引。
List集合里面添加了一些根据索引来操作集合元素的方法。
– void add(int index ,Object ele)
–boolran assAll(int index,Collection eles)
–Object get(int index)
–int lastIndexOf(Object obj)
–Object remove(int index)
–Object set(int index,Object ele)
–List subList(int fromIndex,int toIndex)
List list = new ArrayList();
list.add(new Person1("Person",12));
//List所独有的遍历方式
for(int i = 0 ; i < List.size() ; i++){
Object object = list.get(i);
System.out.println(object);
}
Iterator it = list.iterator();
Syatem.out.println;w
while(it.hasNext()){
System.out.println(it.next());
}
ArrayList和Vector
ArrayList和Vector是List接口的两个典型实现
区别:
–是一个古老的集合,通常建议使用ArrayList
–ArrayList是线程不安全的,而Vector是线程安全的。
–即使为保证List集合线程安全,也不推荐使用Vector
Array.adList(…)方法返回的List集合既不是ArrayList实例也不是Vector实例。
Array.asList(…)返回值是一个固定长度的List集合。
三、Map集合
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的Key,另外一组用于保存Map里的Value
Map中的Key和Value都可以是任何引用类型的数据
Map中的Key不允许重复,即同一个Map对象的任何两个Key通过equals方法比较中返回false
Key和Value之间存在单向一对一关系,即通过指定的Key总能找到唯一的,确定的Value
1、coid clear() : 清空Map
2、boolean containsKey(Object key):Map中是否包含制定的Key。
3、boolean containsVlue(Object value):Map中是否包含指定的Value。
4、Set<Map.Entry<K,V>> entrySet() : 得到键值对对应的Entry的Set,借助于泛型。
5、V get(Object key):根据key返回对应的Value。
6、boolean isEmpty :检验Map是否为空。
7、Set keySet ( ) : 返回Key对应的集合,Set类型。
8、V put(k key,V value):放入一对键值对。
9、void putAll(Map<? extends K , ? extends V> m): 放入一组键值对。
10、V remove(Object key):移除指定键对应的键值对。
11、int size(): 返回Map容量的大小。
12、Collection values():返回Value对应的集合。
HashMap和HashTable
1、HashTable是一个古老的Map实现类,不建议使用
2、HashTable是一个线程安全的Map实现,但HashMap是线程不安全的。
3、HashTable不允许使用null作为key和value,而HashMap可以
4、与HashSet集合不能保证元素的顺序一样,Hashtable、HashMap也不能保证其中key-value对的顺序。
5、Hashtable、HashMap判断两个Key相等的标准是:两个Key通过equals方法返回true,hashCode值也相等。
6、Hashtable、HashMap判断两个Value相等的标准是:两个Value通过equals方法返回true
LinkedHashMap
LinkedHashMap 是HashMap的子类
LinkedHashMap可以维护Map的迭代顺序:迭代顺序与Key-Value对的插入顺序一致
Properties
Properties 类是Hashtable的子类,该对象用于处理属性文件
由于属性文件里的key、value都是字符串类型,所以properties里的Key和Value都是字符串类型的
TreeMap
TreeMap存储Key-Value对时,需要根据Key对Key-value对进行排序。TreeMap可以保证所有的Key-Value对处于有序状态。
TreeMap的Key的排序:
-自然排序:TreeMao的所有的Key必须实现Comparable接口,而且所有的Key应该是同一个类的对象,都这佳凝灰跑出ClassCastException
-定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。此时不需要Map的Key实现Comparable接口
操作集合的工具类:Collections
Collections 是一个操作Set、List和Map等集合的工具类
Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
排序操作:
-reverse(List):反转List中元素的顺序
-shuffle (List):对List集合元素进行随机排序
-sort(List):根据元素的自然顺序对制定List集合元素按升序排序
-sort(List,Comparator):根据制定的Comparator产生的顺序对List集合元素进行排序
-swap(List,int,int): 将指定list集合中的i元素和j元素进行交换
查找、替换
Object max(Collection):根据元素的自然顺序,返回给定集合中最大元素
Object max(Collection,Comparator): 根据Comparator制定的顺序,返回给定集合中的最大元素
Object min(Collection)
Object min(Collection,Comparator)
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值
如何得到一个县城安全的集合对象呢?
调用Collections 的synchronizedXxx 方法获取线程安全的集合对象。
List list = new ArrayLisy();
List list2 = Collections.synchronizedList(list);