Java类集总结之一
1)类集:一个动态的对象数组,是对一些实现好的数据结构进行了包装。
类集框架的特性:高性能,对基本类集(动态数组、链接表、树和散列表)的实现是高效率的,所以一般很少需要人工去对这些“数据引擎”编写代码;
框架必须允许不同类型的类集以相同的方式和高度互操作方式工作(对于任何对象所有的操作形式都是一样的,例如想向集合中增加元素,则一定是使
用add()方法,另外类集中的元素类型都是统一的,即一个集合中要么全是A类对象,要么全是B类对象);
类集必须是容易扩展和修改的,为了实现这一目标,类集框架被设计成包含了一组标准的接口。
2)在使用各个类集接口时,如果没有指定泛型,则肯定会出现警告信息,
此时,泛型将被擦除而全部使用Object接收。
3)类集框架本身不受对象数组长度的限制。
4)Collection接口
此接口使用了泛型,可以保证类集操作的安全性,避免发生ClassCastException。
Collection接口是单值存放的最大父接口。
5)在开发中,很少直接使用Collectioin接口进行开发,基本上都是使用其子类接口。
子类接口主要有
List:可以存放重复的内容
Set:不能存放重复的内容,所有重复内容靠hashCode()和equals()两个方法区分
Queue:队列接口
SortedSet:可以对集合中的数据进行排序
6)集合的标准输出:
迭代输出:Iterator接口
只要用到集合的输出操作,就一定使用Iterator接口。
使用Iterator迭代器可以用来查找、删除指定的元素。
7)Collection、Set、List接口都属于单值的操作,即每次只能操作一个对象,
而Map接口每次可以操作一对对象,即二元偶对象,Map中的每个元素都使用key value
的形势存储在集合中。
8)Collections集合工具类
通过此类可以方便地操作集合,如替换、检索、排序等操作。
9)
1 package cn.itcast.arraylist.demo; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.List; 6 7 public class ArrayListDemo { 8 9 public static void main(String[] args) { 10 List<String> allList = null;//定义List对象 11 Collection<String> allCollection = null;//定义Collection对象 12 allList = new ArrayList<String>();//实例化List对象,只能是String类型 13 allCollection = new ArrayList<String>();///实例化Collection对象 14 allList.add("Hello");//从Collection继承的方法 15 allList.add("Hello");//List可以存放重复的内容 16 allList.add(0,"Worldl");//List扩充的方法 17 System.out.println(allList);//输出:[World,Hello]// 18 allCollection.add("Lxh");
19 allCollection.add("wwww");
20 System.out.println(allCollection);
21 allList.addAll(allCollection);//增加一组对象 22 allList.addAll(0, allCollection);
23 System.out.println(allList);
24 } 25 }
注:ArrayList是List的子类,直接通过对象的多态性为List实例化
List是Collection的子类,通过对象的多态性有ArrayList实例化。
顺序:Collection(接口)
List(接口)
ArrayList(子类)
注意:集合不是数组:
10)
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class ArrayListDemo03 { 5 6 public static void main(String[] args) { 7 List<String> allList = null; 8 allList = new ArrayList(); 9 allList.add("Hello"); 10 allList.add("wwww"); 11 System.out.println(allList.size());//输出结果:2 12 System.out.println(allList.get(0));//输出:Hello 13 for(int i=0;i<allList.size();i++){ 14 System.out.println(allList.get(i)); 15 } 16 String str[] = allList.toArray(new String[] {});//集合变数组 17 System.out.println("数组输出"); 18 for(int j=0;j<str.length;j++){ 19 System.out.println(str[j]); 20 } 21 } 22 23 }
11)
Set接口是Collection的子类,没有对Collection进行扩充,但是要求更严格,不能存放重复内容;当存入重复内容时,重复元素只增加一次。
Set接口的实例无法像List接口那样进行双向输出,因为此接口没有提供像List那样的get(int index)方法。
顺序:
Collection(接口)
Set(接口)
SortedSet(接口)、HashSet(子类)、TreeSet(子类)
HashSet里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序,即输出是随机顺序。
12)
1 import java.util.HashSet; 2 import java.util.Set; 3 4 public class HashSetDemo01 { 5 6 public static void main(String[] args) { 7 Set<String> allSet = new HashSet<String>(); 8 allSet.add("D"); 9 allSet.add("B"); 10 allSet.add("C"); 11 allSet.add("C"); 12 allSet.add("C"); 13 allSet.add("A"); 14 allSet.add("E"); 15 System.out.print(allSet); 16 } 17 18 }
13)但是,当HashSet中存放自定义的类,每个对象所在的类必须覆写Object类的hashCode()、equals()、toString() 3个方法。覆写这三个方法之后,才能实现无重复存放。
package cn.itcast.comparable.demo01;
14)
1 import java.util.HashSet; 2 import java.util.Set; 3 4 class Person { 5 private String name; 6 private int age; 7 public Person(String name,int age){ 8 this.name = name; 9 this.age = age; 10 } 11 public boolean equals(Object obj){ 12 if(this==obj){ 13 return true; 14 } 15 if(!(obj instanceof Person)){ 16 return false; 17 } 18 Person p = (Person)obj; 19 if(this.name.equals(p.name)&&this.age==p.age){ 20 return true; 21 }else{ 22 return false; 23 } 24 } 25 public int hashCode(){ 26 return this.name.hashCode() * this.age; 27 } 28 public String toString(){ 29 return "姓名"+this.name+":年龄"+this.age; 30 } 31 } 32 33 public class RepeatHashSet { 34 35 public static void main(String[] args){ 36 Set<Person> allSet = new HashSet<Person>(); 37 allSet.add(new Person("张三",20)); 38 allSet.add(new Person("李四",22)); 39 allSet.add(new Person("王五",20)); 40 allSet.add(new Person("赵六",20)); 41 allSet.add(new Person("孙七",22)); 42 allSet.add(new Person("王五",20)); 43 System.out.println(allSet); 44 45 } 46 }
15)TreeSet类:对输入的数据进行有序排列,即在集合中插入数据时时没有顺序的,但是输出之后数据是有序的,所有TreeSet是排序的子类。
16)
1 import java.util.Set; 2 import java.util.TreeSet; 3 4 public class TreeSetDemo01 { 5 6 public static void main(String[] args) { 7 Set<String> allSet = new TreeSet<String>(); 8 allSet.add("C"); 9 allSet.add("C"); 10 allSet.add("C"); 11 allSet.add("D"); 12 allSet.add("A"); 13 allSet.add("D"); 14 allSet.add("B"); 15 allSet.add("E"); 16 allSet.add("A"); 17 System.out.print(allSet);//输出结构:ABCDE 18 } 19 }
17)如果要将自定义的类存入TreeSet中,TreeSet中的每个对象所在的类必须实现Comparable接口,并且在compareTo方法中指明是按照哪个属性进行比较的。
1 import java.util.Iterator; 2 import java.util.Set; 3 import java.util.TreeSet; 4 5 class Student implements Comparable<Student>{ 6 private int num; 7 private String name; 8 private int score; 9 Student(String name,int num, int score ){ 10 this.num = num; 11 this.name = name; 12 this.score = score; 13 } 14 15 public String toString(){ 16 return num + "……"+name + "……" + score; 17 } 18 @Override 19 public int compareTo(Student stu) { 20 if(this.num>stu.num){ 21 return 1; 22 }else if(this.num<stu.num){ 23 return -1; 24 }else{ 25 return 0; 26 } 27 } 28 } 29 30 public class TreeSetDemo01 { 31 32 public static void main(String[] args) { 33 Set<Student> allSet = new TreeSet<Student>(); 34 35 allSet.add(new Student("zhangsan",20,70)); 36 allSet.add(new Student("wangwu",27,85)); 37 allSet.add(new Student("lisi",30,62)); 38 allSet.add(new Student("zhangsan",28,65)); 39 allSet.add(new Student("sunqi",25,92)); 40 allSet.add(new Student("wwww",26,65)); 41 42 Iterator<Student> it = allSet.iterator(); 43 while(it.hasNext()){ 44 System.out.println(it.next()); 45 } 46 } 47 }