java基础
一.Collection集合
集合:
集合是java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
数组的长度是固定的。集合的长度是可变的。
数组中存储的是同一类型的元素,可以存储任意类型数据。集合存储的都是引用数据类型。
如果想存储基本类型数据需要存储对应的包装类型。
1.1 Collection常用功能
以下方法适用于操作所有的单列集合
1.public boolean add(E e)
: 把给定的对象添加到当前集合中 。
2.public void clear()
:清空集合中所有的元素。
3.public boolean remove(E e)
: 把给定的对象在当前集合中删除。
4.public boolean contains(Object obj)
: 判断当前集合中是否包含给定的对象。
5.public boolean isEmpty()
: 判断当前集合是否为空。
6.public int size()
: 返回集合中元素的个数。
7.public Object[] toArray()
: 把集合中的元素,存储到数组中
1.2迭代器、增强for
1.1.1迭代器
public Iterator iterator()
: 获取集合对应的迭代器,用来遍历集合中的元素的。
迭代:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
public E next()
:返回迭代的下一个元素。
public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
public class IteratorDemo {
public static void main(String[] args) {
// 使用多态方式 创建对象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("jxl");
coll.add("nh");
coll.add("haha");
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator< String > it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){
//判断是否有迭代元素
String s = it.next();
//获取迭代出的元素
System.out.println(s);
}
}
}
- 在进行集合元素获取时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会抛出
java.util.NoSuchElementException
没有集合元素异常。 - 在进行集合元素获取时,如果添加或移除集合中的元素 , 将无法继续迭代 , 将会抛出
ConcurrentModificationException
并发修改异常.
1.1.2 增强for
它的内部原
理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
格式
for(元素的数据类型 变量 : Collection集合or数组){
//写操作代码
}
int[] arr = {3,5,6,87};
//使用增强for遍历数组
for(int a : arr){
//a代表数组中的每个元素
System.out.println(a);
}
Collection<String> coll = new ArrayList<String>();
coll.add("jxl");
coll.add("xxx");
for(String s :coll){
System.out.println(s);
}
二. 集合常用类的继承体系
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,
它有两个重要的子接口,分别是java.util.List 和 java.util.Set 。
List: 元素有序、元素可重复。主要实现类有 java.util.ArrayList 和 java.util.LinkedList
Set :元素不可重复。主要实现类有 java.util.HashSet 和 java.util.LinkedHashSet 。
2.1 List接口
- 允许出现重复的元素,线性方式存储的,可以通过索引来访问集合中的指定元素。
- List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
- 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
常用方法
继承了Collection接口中的全部方法,还增加了一些根据元素索引来操作集合的特有方法
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。
public E get(int index)
:返回集合中指定位置的元素。
public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
2.1.1 ArrayList集合
java.util.ArrayList 集合数据存储的结构是数组结构。
元素增删慢,查找快 (大部分用于查询数据、遍历数据)
2.1.2 LinkedList集合
java.util.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() :从此列表所表示的堆栈处弹出一个元素。
public void push(E e) :将元素推入此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。
3.1 set接口
Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set 集合有多个子类,现在介绍其中的 java.util.HashSet 、 java.util.LinkedHashSet 这两个集合。
3.1.1 HashSet集合
- 存储的元素是不可重复的
- 元素都是无序的(即存取顺序不能保证不一致)。
- java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存储和查找性能。
3.1.2 HashSet集合存储数据的结构
哈希表
储数据的结构:
在JDK1.8之前,哈希表底层采用 数组+链表实现
而JDK1.8中,哈希表 数组+链表+红黑树,当链表长度超过阈值(8)时,将链表转换为红黑树
3.1.1 LinkedHashSet
java.util.LinkedHashSet (有序),它是链表和哈希表组合的一个数据存储结构。