首页 > 编程知识 正文

集合知识点总结框架,集合知识点总结视频

时间:2023-05-05 04:05:43 阅读:286101 作者:939

集合就是一个已经封装好的对象

集合三大接口

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:

public class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } /** * 覆盖Object类中的hashCode方法。建立Person对象自己特点的哈希值算法。 */ public int hashCode(){ //System.out.println(this+"...hascode..."); return name.hashCode() + age*27;//乘以27是为了尽量保证哈希值唯一。 } /** * 覆盖Object类中的equals方法,建立Person对象判断是否相同的依据。 根据Person自身的特点来判断。 */ public boolean equals(Object obj){ //System.out.println(this+"...equals..."+obj); if(!(obj instanceof Person)) return false; Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name+":"+age; }
再新建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集合关系图:


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。