一、Collection接口
1、Collection的接口定义:
public interface Collection<E> extends Iterable<E>
2、Collection接口的方法
(1)add(E e):向集合中添加数据
(2)addAll(Collection <? extends E> c):向集合中添加一组数据
(3)clear():清空集合数据
(4)contains(Object obj):查找数据是否存在,需要使用equals()方法
(5)remove(Object obj):删除数据,需要equals()方法
(6)size():取得集合长度
(7)toArray():将集合变为对象数组返回
(8)iterator():取得Iterator接口对象,用于集合输出
二、Collection接口的子接口
Collection接口有两个子接口:
List接口与Set接口
1.List集合接口
(1)List接口的方法:
1)get(int indeks):根据索引取得保存数据
2)set(int indeks,E element):修改数据
(2)List下常用子类
1)ArrayList子类
import java.util.ArrayList; import java.util.List; public class Test1 { public static void main(String[] args) { List<String> list = new ArrayList<>(); System.out.println(list.size()+"、"+list.isEmpty()); list.add("Hello"); list.add("World"); //数据内容可以重复 list.add("Hello"); System.out.println(list); System.out.println(list.size()+"、"+list.isEmpty()); list.remove("Hello"); System.out.println(list); System.out.println(list.remove("World"));//返回true或者false,表示是否删除成功 System.out.println(list.remove("World"));//返回true或者false,表示是否删除成功 System.out.println(list.contains("ABC"));//返回true或者false,表示元素是否包含 System.out.println(list.contains("World"));//返回true或者false,表示元素是否包含 System.out.println(list); //取得数据要使用get()方法来取得 for(int i = 0;i < list.size();i++) { System.out.println(list.get(i)); } } }
2)Vector子类
import java.util.List; import java.util.Vector; import javax.print.attribute.standard.MediaName; public class Test1 { public static void main(String[] args) { List<String> list = new Vector<>(); list.add("Hello"); list.add("World"); list.add("LaLa"); System.out.println(list); list.remove("Hello"); System.out.println(list); } }
注:ArrayList与Vector区别:
a)历史时间:ArrayList是从JDK1.2提供的,而Vector是从JDK1.0就提供了。
b)处理形式:ArrayList是异步处理,性能更高;Vector是同步处理,性能较低。
a)历史时间:ArrayList是从JDK1.2提供的,而Vector是从JDK1.0就提供了。
b)处理形式:ArrayList是异步处理,性能更高;Vector是同步处理,性能较低。
c)数据安全:ArrayList是非线程安全;Vector是性能安全。
d)输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。
d)输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。
3)LinkedList子类
import java.util.LinkedList; import java.util.List; public class Test1 { public static void main(String[] args) { List<String> list = new LinkedList<>(); list.add("Hello"); list.add("World"); list.add("LaLa"); System.out.println(list); list.remove("Hello"); System.out.println(list); } }注:ArrayList与LinkedList区别
a)观察ArrayList源码,可以发现ArrayList里面存放的是一个数组,如果实例化此类对象时传入了数组大小,则里面保存的数组就会开辟一个定长的数组,但是后面再进行数据保存的时候发现数组个数不够了会进行数组动态扩充。
c)LinkedList:是一个纯粹的链表实现,与之前编写的链表程序的实现基本一样(人家性能高)。
ArrayList封装的是数组;LinkedList封装的是链表。ArrayList时间复杂度为1,而LinkedList的复杂度为n。
2.Set集合接口
Set子接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)
(1)HashSet
a)HashSet为无序存储,允许插入元素为null(set.add(null)),但有且只能有一个为null
import java.util.HashSet; import java.util.Set; public class Test1 { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Hello"); set.add("World"); set.add("LaLa");
set.add(null); System.out.println(set); } }
b)判断是否重复,要覆写Object中的hashCode()以及equals()方法
import java.util.HashSet; import java.util.Set; class Person implements Comparable<Person> { private String name; private Integer age; @Override public String toString() { // TODO Auto-generated method stub return "name: "+name + " age: "+age; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(this == obj) { return true; } if(obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; return Object.equals(name,person.name) && Object.equals(age,person.age); } @Override public int compareTo(Person o) { // TODO Auto-generated method stub if(this.age > o.age) { return 1; } else if(this.age < o.age) { return -1; } else { return this.name.compareTo(o.name); } } public Person(String name,Integer age) { // TODO Auto-generated constructor stub this.name = name; this.age =age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } public class Test1 { public static void main(String[] args) { Set<Person> set = new HashSet<>(); set.add(new Person("lxx",19)); set.add(new Person("lxy",20)); set.add(new Person("lww",10)); System.out.println(set); } }
(2)TreeSet(默认升序排序)
a)有序存储,不允许为null
import java.util.Set; import java.util.TreeSet; public class Test1 { public static void main(String[] args) { Set<String> set = new TreeSet<>(); set.add("C"); set.add("D"); set.add("E"); set.add("A"); System.out.println(set);//升序排序[A,C,D,E] } }
b)要想使用自定义类作为TreeSet存储该类必须覆写Compareable接口
Compareable: int compareTo(Object obj)
若返回值>0:当前对象>比较对象
若返回值=0:当前对象=比较对象
若返回值<0:当前对象<比较对象
类中所有属性都要参与运算
import java.util.Set; import java.util.TreeSet; class Person implements Comparable<Person> { private String name; private Integer age; @Override public String toString() { // TODO Auto-generated method stub return "name:"+name+" age:"+age; } @Override public int compareTo(Person o) { // TODO Auto-generated method stub if(this.age > o.age) { return 1; } else if(this.age < o.age) { return -1; } else { return this.name.compareTo(o.name); } } public Person(String name,Integer age) { // TODO Auto-generated constructor stub this.age = age; this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } public class Test1 { public static void main(String[] args) { Set<Person> set = new TreeSet<>(); set.add(new Person("lxy", 18)); set.add(new Person("lww", 28)); set.add(new Person("lww", 28));//有重复元素,只打印一次 set.add(new Person("llh", 25)); System.out.println(set); } }