集合就是一个已经封装好的对象
集合三大接口
Collection 所有集合类的跟接口
Map 映射接口,存放键值对
Iterator 遍历集合的迭代接口
Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。除Comparable位于Java.lang包
Collection(单列集合的跟接口)<E>(泛型)1.2JDK版本
collection因为是接口不能实例化不能新建对象,所以要用实现类,那么要父类引用指向子类对象。
list有序(存和取的顺序一致),有索引可以储存重复
ArrayList-前缀告诉底层是数组,LinkedList-前缀告诉底层是链表实现的,Vector-前缀底层也是数组实现的,但是不遵循list命名。Vector出现比ArrayList要早,在JDK1.0版本的时候出现的,ArrayList则在1.2版本的时候出现的。
@SupperWarning(“rawtypes”,"unchecked")//保持类型,不检查,但没有加泛型,有一定的安全隐患
Collection a=new ArrayList();//父类引用指向子类对象boolean b= a.add("abc");boolean c=a.add(true);//自动装箱new boolean(true);boolean d=a.add(100);boolean e=a.add(new Client(“寒冷的小笼包”,23));//将Client类的封装;boolean f=a.add("abc")//能放进来重复的元素;System.out.println(c);//==System.out.println(c.toString);实质上重写了,要往上父类、爷爷类查找。return true;
return true;
return true;
return true;
return true;
[abc,true,100,Client[name=寒冷的小笼包,age=23],abc]
如果是List集合一直返回true,因为可以存储重复元素。如果是Set集合当储存重复元素时候,就会返回false。
set无序(存和取的顺序不一致),无索引不可以储存重复,Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。Set接口中的方法和Collection接口一致。
HashSet-底层哈希算法 TreeSet-底层二叉树算法
Set接口的常见实现类:
HashSet:内部数据结构是哈希表,是不同步的。
HashSet如何保证该集合中元素的唯一性:
是通过对象的hashCode和equals方法啊来完成对象的唯一性的。如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。如果为true,视为相同元素,不存。如果为false。那么视为不同元素,就进行存储。
如果元素存储到HashSet集合中,必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals方法和hashCode方法,建立对象判断是否相同的依据。
HashSet是无序的,但是下面的子接口LinkedHashSet是具有可预知迭代顺序的set接口的哈希表和链表实现的,有序。
TreeSet:可以对Set集合中的元素进行指定顺序的排序。是不同步的。
TreeSet如何保证该集合中元素的唯一性:
就是根据比较方法compareTo的返回结果是否是0,是0,就判定为相同元素,不存。
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,就需要实现Comparable接口。覆盖CompareTo方法。
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。这个时候可以使用TreeSet集合的第二种排序方式。
TreeSet集合的第二种排序方式二:
让集合自身具备比较功能,定义一个类实现Comparator接口。覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。相对来说,这个方法比较常见。
HashSet例一:往hashSet集合中存储Person对象,如果姓名和年龄相同,视为同一个人(相同元素)。
先新建一类Person:
再新建HashSetTest类,进行存储与取出Person对象的操作:
/*往hashSet集合中存储Person对象,如果姓名和年龄相同,视为同一个人(相同元素)。 * */public class HashSetTest { public static void main(String[] args) { HashSet hs=new HashSet(); /*HashSet集合数据结构是哈希表,所以存储元素的时候,使用的元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同。*/ hs.add(new Person("abc1",21)); hs.add(new Person("abc2",22)); hs.add(new Person("abc3",23)); hs.add(new Person("abc4",24)); hs.add(new Person("abc2",22)); Iterator it=hs.iterator(); while(it.hasNext()){ Person p=(Person)it.next();//因为存入集合容器中的元素都会向上转型为Object类,会丢失掉Person类的特有属性,所以必须强制向下转型为Person类,才可以拿到它的name和age属性;另外,由于同时要拿两个属性,所以等于说it.next()取到的对象不止使用一次,必须用一个变量来接收。 System.out.println(p.getName()+":"+p.getAge()); } }}
结果输出为:
abc3:23
abc2:22
abc4:24
abc1:21
Java集合关系图:
免责声明:文章源自网络,版权归原作者所有,如有侵犯联系删除。