集合(Collection)
- 集合的由来:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。(数组的长度固定,所以不适合做变化的需求)
- 集合和数组的区别:
A.长度区别:数组长度固定;集合长度是可变的
B.内容区别:数组可以是基本类型,也可以是引用类型;集合只能是引用类型
C.元素内容:数组只能存储同一种类型;集合可以存储不同类型(但其实集合存储的也是同一种类型) - 集合的继承体系结构?
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
(部分)Collection
List:ArrayList;Vector;LinkedList
Set:TreeSet;HashSet - Collection功能概述:
A:添加功能:boolean add(E e);boolean addAll(Collection c)
B:删除功能:boolean remove(Object o);boolean removeAll(Collection c);void clear()
C:判断功能:boolean contains(Object o);boolean containsAll(Collection c);boolean isEmpty()
D:长度功能:int size()
E:交集(了解):boolean retainAll(Collection c)
F:把集合转数组(了解):Object[] toArray() - Collection集合的遍历
A:把集合转数组(了解)
B:迭代器(集合专用方式) - 迭代器
A.是集合的获取元素的方式。
B.是依赖于集合而存在的。
C.迭代器的使用步骤:①通过集合对对象获取迭代器对象;②通过迭代器对象判断;③通过迭代器对象获取 - Collection集合的例子
①集合的操作步骤:A:创建集合对象
B:创建元素对象
C:把元素添加到集合
D:遍历集合
②例子
A.存储字符串并遍历import java.util.Collection; import java.util.ArrayList; import java.util.Iterator; public class CollectionDemo { public static void main(String[] args) { //创建集合对象 Collection c = new ArrayList(); //创建并添加元素 c.add("hello"); c.add("world"); c.add("java"); //遍历集合 Iterator it = c.iterator(); while(it.hasNext()) { String s =(String) it.next(); System.out.println(s); } } }
B.存储自定义对象并遍历
public class Student { private String name; private int age; public Student(){} public Student(String name,int age) { this.name = name; this.age = age; } //getXxx()/setXxx() } import java.util.Collection; import java.util.ArrayList; import java.util.Iterator; public class StudentDemo { public static void main(String[] args) { //创建集合对象 Collection c = new ArrayList(); //创建学生对象 Student s1 = new Student("林青霞",27); Student s2 = new Student("风清扬",30); Student s3 = new Student("刘意",30); Student s4 = new Student("武鑫",25); Student s5 = new Student("刘晓曲",16); //添加元素 c.add(s1); c.add(s2); c.add(s3); c.add(s4); c.add(s5); //遍历集合 Iterator it = c.iterator(); while(it.hasNext()) { Student s = (Student)it.next(); System.out.println(s.getName()+"---"+s.getAge()); } } }
List
- List是Collection的子接口,特点是:有序(存储顺序和取出顺序一致),可重复。
- List的特有功能:
A.添加功能:void add(int index,E element)
B.删除功能:E remove(int index)
C.获取功能:E get(int index)
D.迭代器功能:ListIterator listIterator()
E.修改功能:E set(int index,E element) - List集合的特有遍历功能
A.由size()和get()结合。
B.代码演示//创建集合对象 List list = new ArrayList(); //创建并添加元素 list.add("hello"); list.add("world"); list.add("java"); //遍历集合 Iterator it = list.iterator(); while(it.hasNext()) { String s =(String) it.next(); System.out.println(s); } System.out.println("----------"); for(int x=0; x<list.size(); x++) { String s =(String) list.get(x); System.out.println(s); }
- 列表迭代器的特有遍历功能:可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。
- 并发修改异常
A.出现的现象:迭代器遍历集合,集合修改集合元素
B.原因:迭代器是依赖于集合的,而集合的改变迭代器并不知道。
C.解决方法:集合遍历,集合修改(size()和get());元素添加在集合的末尾 - 常见数据结构
A:栈 先进后出
B:队列 先进先出
C:数组 查询快,增删慢
D:链表 查询慢,增删快 - List的子类特点(面试题)
(1)①ArrayList:底层数据结构是数组,查询快,增删慢; 线程不安全,效率高。
②Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低。
③LinkedList:底层数据结构是链表,查询慢,增删快; 线程不安全,效率高。
(2)Vector(有特有功能要学习)
①添加:public void addElement(E obj) -- add()
②获取:public E elementAt(int index) -- get()
public Enumeration<E> elements() -- iterator()
(3)LinkedList(有特有功能要学习)
①添加:addFirst();addLast()
②删除:removeFirst();removeLast()
③获取:getFirst();getLast()
Set
- Set集合的特点:无序,唯一。
- HashSet集合(掌握)
A.底层数据结构是哈希表(是一个元素为链表的数组)
B.哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:首先比较哈希值是否相同,若相同:继续执行equals()方法,返回true:元素重复了,不添加,返回false:直 接把元素添加到集合;若不同:就直接把元素添加到集合
C.:如何保证元素唯一性的呢?答:由hashCode()和equals()保证的。
D.开发的时候,代码非常的简单,自动生成即可。 - TreeSet集合
A.底层数据结构是红黑树(是一个自平衡的二叉树)
B.保证元素的排序方式:①自然排序(元素具备比较性):让元素所属的类实现Comparable接口;
②比较器排序(集合具备比较性):让集合构造方法接收Comparator的实现类对象。 - :在集合中常见的数据结构(掌握)
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序