Java学习笔记之Collection
一、Collection:单列
1.1 Collection集合常用方法
public boolean add(E e) // 把给定的对象添加到当前集合中
public void clear() //清空集合中所有的元素
public boolean remove(E e) //把给定的对象在当前集合中删除
public boolean isEmpty() //判断当前集合是否为空
public boolean contains(E e)//判断当前集合中是否包含给定的对象
public Object[] toArray() //把集合中的元素,存储到数组中
public int size() //返回集合中元素的个数
1.2 集合的三种遍历方式
-
迭代器:集合特有的遍历方式
Collection<String> objs = new ArrayList<String>(); //多态 objs.add("aa"); objs.add("bb"); objs.add("cc"); Iterator<String> it = objs.iterator(); //通过集合对象获取迭代器对象 while(it.hasNext()){ //判断迭代器对象中是否还有元素 String s = it.next(); //有元素则获取,没有则结束程序 System.out.println(s); }
-
普通for:带有索引的遍历方式
List<String> list = new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("cc"); for (int i=0; i<list.size(); i++){ String s = list.get(i); Systems.out.println(s); }
-
增强for:只遍历元素,不能进行增删操作
int[] arr = {1,2,3,4,5}; for(int i:arr){ // for(元素的数据类型 变量名:容器对象) System.out.println(i); }
1.3 两种子集合
1.3.1 List
特点:有索引,可以存储重复元素,可以保证存取顺序
List特有方法:
void add(int index, E element) //将指定的元素添加到该集合中的指定位置上。
E get(int index) //返回指定索引处的元素。
E set(int index, E element) //修改指定索引处的元素,返回被修改的元素。
E remove(int index) //删除指定索引处的元素, 返回被删除的元素。
- ArrayList:底层是数组实现的,查询快,增删慢
-
LinkedList:底层是链表实现的,查询慢,增删快
LinkedList特特有方法:
public void addFirst(E e) //将指定元素插入此列表的开头。 public void addLast(E e) //将指定元素添加到此列表的结尾。 public E getFirst() //返回此列表的第一个元素。 public E getLast() //返回此列表的最后一个元素。 public E removeFirst() //移除并返回此列表的第一个元素。 public E removeLast() //移除并返回此列表的最后一个元素。 public E pop() //从此列表所表示的堆栈处弹出一个元素。此方法等效于addFirst public void push(E e) //将元素推入此列表所表示的堆栈。 此方法等效于removeFirst
-
Vector:1.0版本用的,底层是数组实现的,是同步的(单线程)
1.3.2 Set
特点:无索引,不可以存储重复元素,存取不一定有序
Set集合存储元素不重复的原理:存储的元素重写hashCode()
与equals()
方法
-
HashSet:无索引,不包含重复元素,不保证存取顺序。底层存储数据的结构是哈希表。
-
哈希表的底层在JDK1.8之前底层是数组+链表实现的;JDK1.8之后底层是数组+链表+红黑树(提高查询速度)实现的【如果链表的长度超过8位,就会将链表转换为红黑树】。
数组结构把元素进行了分组,即相同哈希值的元素是一组;
链表/红黑树结构把相同哈希值的元素连接到了一起。
-
HashSet集合添加一个元素的过程:
调用对象的
hashCode()
方法获取对象的哈希值 → 根据对象的哈希值计算对象的存储位置 →判断是否有元素存在 → 有元素则判断新元素的哈希值与所有已存在元素的哈希值是否相同 →
若哈希值都相同则调用
equals()
方法判断对象内容是否相同 →若前三者判断都是false则存储该元素,否则说明元素重复,不存储,保证了元素的唯一性
-
-
LinkedHashSet:底层是哈希表(不可以存储重复元素)+链表(可以保证存取顺序)实现的。
-
TreeSet:底层是二叉树实现,元素有序,这里的顺序是指按照一定的规则进行排序。
无参构造方法使用的是自然排序对元素进行排序的,即让元素所属的类实现Comparable接口,重写CompareTo方法。
带参构造方法使用的是比较器排序对元素进行排序的,即让集合构造方法接受Comparator的实现类对象,重写Compare(To1, To2)方法。
@Override public int compareTo(Student s){ return 0; //重复元素,不存储 return 1; //按照存储顺序,顺序排列 return -1;//按照存储顺序,逆序排列 }