Collection接口下的实现类(一)
Collection接口
• 特点:代表一组任意类型的对象,无序、无下标
- 接口方法
-
boolean add(Object obj) //添加一个对象。
-
boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合中。
-
void clear() //清空此集合中的所有对象。
-
boolean contains(Object o) //检查此集合中是否包含o对象 。
-
boolean equals(Object o) //比较此集合是否与指定对象相等。
-
boolean isEmpty() //判断此集合是否为空。
-
boolean remove(Object o) //在此集合中移除o对象。
-
int size() //返回此集合中的元素个数。
-
Object[] toArray() //将此集合转换成数组。
-
1、List接口(继承Collection)
• 特点:有序、有下标、元素可以重复
-
接口方法
-
void add(int index, Object o) //在index位置插入对象o。
-
boolean addAll(int index, Collection c) //将一个集合中的元素添加到此集合中的 index位置。
-
Object get(int index) //返回集合中指定位置的元素。
-
List subList(int fromIndex, int toIndex) //返回fromIndex和toIndex之间的集合元 素。
-
-
实现类
- ArrayList
• 数组结构实现,查询快、增删慢;
• ArrayList比较适合顺序添加、随机访问的场景
• JDK1.2版本,运行效率快、线程不安全//List集合,有序,有下标,元素可重复 List<Integer> list = new ArrayList<>(); //向集合中添加元素 list.add(5); list.add(13); list.add(3); list.add(7); list.add(5); list.add(21); list.add(36); //删除集合中的元素 list.remove(2); //删除下标为2的那个元素 list.remove((Integer)7); //删除等于7的那个元素 printList(list); //打印集合元素 //修改集合中的元素 list.set(2,99); //修改下标为2的元素为99 //查找元素 int num =list.get(4);
- LinkedList
• 链表结构实现,增删快,查询慢。
• LinkedList适合频繁的指定插入,删除操作。
• 实现原理不同,占用空间比ArrayList更少,方法几乎相同。//比ArrayList更节省空间,插入指定元素更快,但是访问地址更慢 List<String> list = new LinkedList<>(); //插入 list.add("C"); list.add("Java"); list.add("C++"); list.add("Python"); list.add("PHP"); list.add("MySql"); //删除 list.remove("C"); //修改 list.set(1,"JavaScript"); //查找 list.get(4); //打印 for(String str : list){ System.out.println(str); }
- Vector(不常用)
• 数组结构实现,查询快、增删慢; • JDK1.0版本,运行效率慢、线程安全。
2、Set接口(继承Collection)
• 特点:无序、无下标、元素不可重复
-
接口方法: 全部继承自Collection中的方法
-
实现类
- HashSet
• 基于HashCode实现元素不重复。
• 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入//哈希表,HashSet Set<Person> set = new HashSet<>(); /* * 插入时,先根据哈希值再根据equals方法判断是否插入对象 * 如果哈希值不同,则不会根据equals方法判断 * 如果哈希值相同,则会继续根据equals方法判断,如果不同,执行插入,如果相同,不执行插入 */ set.add(new Person("张三",16)); set.add(new Person("张三",11)); //无法被加入集合中 set.add(new Person("李四",22)); set.add(new Person("李芬",21)); set.add(new Person("王德发",17)); Iterator it = set.iterator(); while (it.hasNext()){ System.out.println(it.next()); } //人类 class Person{ private String name; //姓名 private int age; //年龄 //get、set方法 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; } public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } //重写了equals方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return name.equals(person.getName()); } //重写了哈希码方法 @Override public int hashCode() { return Objects.hash(name); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
3、Iterator迭代器
• 通过Collection实现类的iterator()的方法返回的迭代器
//创建一个可以存储Integer 的ArrayList集合
List<Integer> list = new ArrayList<>(); //<>泛型
//向集合中添加元素
list.add(5);
list.add(13);
list.add(3);
list.add(7);
list.add(5);
list.add(21);
list.add(36);
Iterator it1 = list.iterator(); //返回集合的迭代器
while(it1.hasNext()){ //判断是否有下一个元素
System.out.print(it1.next()+","); //打印下一个元素
}