Collection集合
集合的继承体系
Collection的常用功能
1. 添加功能
boolean add(E e)
添加一个元素
boolean addAll(Collection c)
添加一批元素
2. 删除功能
boolean remove(Object o)
删除一个元素
3. 判断功能
boolean contains(Object o)
判断集合是否包含指定的元素
boolean isEmpty()
判断集合是否为空(集合中没有元素)
4. 获取功能
int size()
获取集合的长度
5. 转换功能
Object[] toArray()
把集合转换为数组
集合的遍历
普通的for遍历
ArrayList<String> list=new ArrayList<>();
c.add("Hello");
c.add("Java");
c.add("World");
for(int i=0;ilist.size();i++){
String s=(String)list.get(i);
System.out.println(s);
}
迭代器遍历
Collection<String> c=new ArrayList<String>();
c.add("Hello");
c.add("Java");
c.add("World");
//获取迭代器对象
Iterator<String> it=c.iterator();
//hasNext()判断是否有下一个元素,如果有就用next()获取
while(it.hasNext()){
//获取下一个元素
String s=it.next();
System.out.println(s);
}
高级for遍历
Collection<String> coll=new ArrayList<String>();
coll.add("Hello");
coll.add("Java");
coll.add("World");
//高级for遍历集合
for(Stirng s:coll){
System.out.println(s);
}
int[] arr={1,2,3,4,5,6};
//高级for遍历数组
for(int a:arr){
System.out.println(a);
}
常见的数据结构
数据结构指的是数据的组存储方式,不同的数据结构有不同的特点。
1. 栈和队列
栈:先进后出(子弹夹,杯子)
队列:先进先出(排队,管子)
2. 数组结构(ArrayList底层结构)
查询快,增删慢
3. 链表结构(LinkedList底层结构)
查询慢,增删快
4. 红黑树结构(HashSet底层结构)
查询速度很快
List集合
List特有方法
List集合时有索引的,所有它的特有方法都和索引相关
public add(int index,E e)
添加元素到指定索引位置
public E remove(int index)
删除指定索引位置的元素
public E set(int index,E e)
修改指定索引位置的元素
public E get(int index)
获取指定索引位置的元素
List练习
把一个集合中最后一个元素置顶
ArrayList<String> list=new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
list.add("javaee");
//把一个集合中最后一个元素置顶
//移除最后一个元素,并返回
String e=list.remove(list.size()-1);
//把被移除的元素,添加到0索引位置
list.add(0,e);
LinkedList特有方法
LinkedList底层数据结构是链表结构,相对于List接口而言,多了一些对集合头部(first)尾部(last)进行操作的方法
public void addFirst() 在集合的头部添加元素
public void addLast() 在集合的尾部添加元素
public void push() 往集合的头部添加元素(模拟压栈)
public E removeFirst() 移除第一个元素
public E removeLast() 移除最后一个元素
public E pop() 移除集合中的一个元素(模拟弹栈)
public E getFirst() 获取第一个元素
public E getLast() 获取最后一个元素
Set集合
###HashSet集合
HashSet集合底层数据结构是 哈希表,它能保证元素的唯一性
往HashSet集合中存储元素时,先计算元素的hashCode是否存在,如果已经存在,继续用equals方法判断元素是否和集合中已有元素相同。只有hashCode和equals比较之后都相同,才认为元素重复。否则不认为元素重复
上图是HashSet的底层原理,简单了解即可不用深入研究。
HashSet集合中存储自定义元素时,保证元素唯一性的方式是,复写元素的hashCode方法和equals方法
IDEA快捷键:alt+insert自动生成即可。
LinkedHashSet集合
LinkedHashSet是HashSet集合的子类,它既能保证元素有序,也能保证元素唯一。
保证元素唯一的方式和HashSet是一样的,也需要复写元素的hashCode和euqals方法
代码演示
定义Student类,复写hashCode和equals方法(快捷键:alt+insert)
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = 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;
}
//下面是复写的hashCode()和equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
测试类,演示HashSet和LinkedList的区别
public class Demo{
public static void main(String[] args) {
HashSet<Student> set=new HashSet<>();
set.add(new Student("李四", 18));
set.add(new Student("张三", 20));
set.add(new Student("王五", 30));
set.add(new Student("王五", 30));
for (Student stu : set) {
System.out.println(stu);
}
System.out.println("-----------------");
LinkedHashSet<Student> set2=new LinkedHashSet<>();
set2.add(new Student("李四", 18));
set2.add(new Student("张三", 20));
set2.add(new Student("王五", 30));
set2.add(new Student("王五", 30));
for (Student stu : set2) {
System.out.println(stu);
}
}
}
结果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXmZjJ46-1591089135606)(assets/markdown-img-paste-20180901182621207.png)]