1. 集合——Collection
所有的集合都实现了Collection接口,有两个常见的Collection接口的子接口:
- java.util.List:可重复集合,并且有序
- java.util.Set:不可重复集合(实际编程中用到的比较少,暂不介绍)
2. List——Collection常见的子接口
List有两个常见的实现类:
- java.util.ArrayList:使用数组实现,查询性能好
- java.util.LinkedList:使用链表实现,增删性能好,尤其是首位增删元素
3. 队列——非常经典的数据结构之一,可以保存一组元素,但是存取元素必须遵循先进先出原则
- 单端队列(Queue):一头进一头出
- 双端队列(Deque):每头都能进出,是单端队列的子接口,LinkedList 也是它的一个常见实现类
4. 栈——数据结构,可以保存一组元素,但是存取元素必须遵循先进后出
把双端队列的一端堵住,就是栈结构了(手动笑脸)。
5. 上述类的关系
- Collection的子接口是List、Queue
- ArrayList实现的接口只有List
- LinkedList实现的接口有List,Deque
6. 所有的集合都具有的常用的方法(也就是上述的都具有的方法)
add:往集合的最后添加元素
addAll:把一个集合中的所有元素添加到另一个集合中
remove:从集合中删除指定的元素
removeAll:从一个集合中删除和另一个集合的交集
contains:判断集合中是否包含某个指定元素
containsAll:判断两个集合是否具有交集
7. 三种遍历数组、删除元素的方法和区别(注意代码中的注释)
总之:
- 如果就删除集合中的某一个元素,可以采用新循环(记得break)
- 如果要删除满足某个条件的所有元素,则采用迭代器
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("four");
list.add("five");
list.add("five");
System.out.println(list);
//利用for循环遍历list,并删除"three"
for (int i = 0; i < list.size(); i++) {
if ("three".equals(list.get(i))) {
list.remove(i);
}
}
//这种方式会改变list.size()的大小,无法遍历到所有的元素
System.out.println(list);
//利用新循环遍历list,并删除"four"
for (String string : list) {
if ("four".equals(string)) {
list.remove(string);
break;
//如果list中只有一个"four"时可以正确执行
//当有多个"four"时就会报错,所以加了break
}
}
System.out.println(list);
//利用迭代器循环遍历list,并删除"five"
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
if ("five".equals(iterator.next())) {
iterator.remove();
}
}
//这种方法不管有多少个"five"都能删除
System.out.println(list);
//总之:如果就删除集合中的某一个元素,可以采用新循环(记得break)
//如果要删除满足某个条件的所有元素,则采用迭代器
}
}
队列,栈常用的方法
- 单端队列(Queue) 常用的方法:
- add :增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
- remove :移除并返回队列头部的元素, 如果队列为空,则抛出一个NoSuchElementException异常
- element :返回队列头部的元素 ,如果队列为空,则抛出一个NoSuchElementException异常
- offer :添加一个元素并返回true, 如果队列已满,则返回false
- poll:移除并返问队列头部的元素 ,如果队列为空,则返回null
- peek :返回队列头部的元素, 如果队列为空,则返回null
- put :添加一个元素 ,如果队列满,则阻塞
- take: 移除并返回队列头部的元素 ,如果队列为空,则阻塞
- 双端队列(Deque) 常用的方法:
- offerFirst:在队列开头添加某个元素
- offerLast:在队列末尾添加某个元素,和offer功能一样
- pollFirst:获取队列开头的元素,并删除,和poll功能一样
- pollLast:获取队列末尾的元素,并删除
- peekFirst:获取队列开头的元素,不删除
- peekLast:获取队列末尾的元素,不删除
- 栈常用的方法:栈结构其实就是双端队列
- push:在队列开头添加元素,和offerFirst功能一样
- pop:获取队列开头元素,并删除
- 虽然这几种方法,不同的方法名,功能却一样,但是针对不同的应用场景要调用对应的方法,如果是栈的添加元素,虽然可以用offerFirst,但是最好还是用其对应的添加方法push
数组集合之间的转换
1. 数组转换为集合
- 数组转换为集合,对集合的操作就是操作原数组,所以只能更新元素,不能增删元素
public static void main(String[] args) {
String[] arr = {"one","two","three"};
System.out.println("array: " + Arrays.toString(arr));
List<String> list = Arrays.asList(arr);
System.out.println(list);
List<String> list2 = new ArrayList<>(list); //把list集合进行复制,生成list2
System.out.println(list2);
list2.add("five");
System.out.println(list2);
}
2. 集合转换为数组
集合转换为数组,如果操作数组,和原集合没有关系,随便搞(手动笑脸)
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("one");
collection.add("two");
collection.add("three");
collection.add("four");
System.out.println(collection);
String [] arr = collection.toArray(new String[collection.size()]);
arr[1] = "1";
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
System.out.println(collection);
}