List
- java.util.List 线性表
- List是Collection常用的子接口,是一个可重复集合并且有序。其单独提供了一套可以通过下标操作元素的方法
- 常用实现类:
- java.util.ArrayList: 使用数组实现,查询效率好,增删元素慢
- java.util.LinkedList: 使用链表实现,增删元素效率好(首尾增删元素最快),查询效率慢。
- 在对性能没有特别苛刻的要求时通常用ArrayList
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>(list1);//所有集合都支持的构造方法,new的时后可以传入一个同泛型的集合,这样list2新建的时候就包含了list1的元素
API
- E get(int index):获取集合中指定下标对应的元素,下标从0开始
- E set(int index,E elment)将给定的元素存入给定为值,并将原为值的元素返回。(替换)
- List还提供了一对重载的add,remove方法
- void add(int index,E element):将给定的元素插入到指定位置,原位置及后续元素都向后移动。
- E remove(int index):删除给定位置的元素,并将被删除的元素返回
- List subList(fromIndex, toIndex):获取list的子集,下标含头不含尾。
注意:
1.子集和原list数据是共享的,通过哪个对数据修改,另一个里的数据都会改变。
2.获取从index直到结尾的子集可以写为subList(fromIndex,list.size()),且并不会下标越界。
集合和数组的转换
- toArray: 集合转成数组,Collection提供了将当前集合转换为数组的方法。
- Object[] toArray()
- T[] toArray(T[] a) 这个方法比较常用,可以传入一个指定类型的数组,然后返回的也是这个类型的数组。传入时需要指定长度,若不够长,toArray会new一个新的同类型的数组并返回,超过长度则多的元素值为null。
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
c.add("five");
String[] arr = c.toArray(new String[c.size()]);//需要指定数组长度,当够长时,多的是null,不够长时toArray会自动new一个新数组
System.out.println(Arrays.toString(arr));
}
- static List asList<T…array>: 数组转换为List集合
注意:
- 数组是定长的,增删操作都是新建了一个数组,原数组不能增删
- 集合的增删操作都是在原集合的基础上进行的
- 对数组转换得来的集合进行操作就是对原数组对应元素的操作。所以增删元素的操作都是不支持的,set方法改元素可以
- 若是集合转成数组,对数组操作不会影响集合,数组是new的
List集合的排序
- 集合的工具类:java.util.Collections
- 其提供了很多便于操作集合的方法,其中有一个sort方法用来对List集合进行自然排序(从小到大)
- static void sort(List list):自然排序
- static void sort(List list,Comparator c):该重载方法要求我们再传入一个参数,是一个比较器,此方法会利用这个比较器来比较集合元素并按照比较结果从小大大排序
- static void shuffle(List<?> list):打乱顺序
Collections.sort(list2);
Collections.sort(list,new Comparator<Point>() {
public int compare(Point p1,Point p2) {
return (p1.getX()*p1.getX()+p1.getY()*p1.getY())-(p2.getX()*p2.getX()+p2.getY()*p2.getY());//到原点的距离从小到大排序
//return p1.getX()-p2.getX();//x坐标从小到大排序
//return p2.getX()-p1.getX();//x坐标从大到小
}
});
注意:sort方法在注意集合时,要求集合元素必须实现接口:Comparable,否则编译不通过,java提供的类,比如包装类,String都实现了Comparable接口,可以直接使用。但是排序自定义类型元素时不推荐这样做
- String 已经实现了Comparable接口,定义的比较规则是按照字符的unicode编码大小比较,对于排序中文时没什么意义。
队列
- java.util.Queue: 继承至Collection,队列可以保存一组元素,但是存取元素必须遵循先进先出。排队专用
- 队列是一个接口,LinkedList(链表)实现了这个接口,但是ArrayList没有实现
- boolean offer(E e): 进队操作,从末尾添加元素
- E poll(): 出队操作,从队首删除一个元素,并返回
- E peek(): 引用队首元素,返回队首元素的操作,但是并不删除
双端队列
- java.util.Deque
- Deque接口继承至Queue接口,双端队列是队列两端都可以做进出队操作的队列
- 常用实现类:java.util.LinkedList
- offer()/offerLast() 从队尾进队
- offerFirst() 从队首进队
- poll()/pollFirst() 从队首出队
- pollLast() 从队尾出队
- peek()/peekFirst() 引用队首元素
- peekLast() 引用队尾元素
Deque<String> deque = new LinkedList<>();
deque.offer("one");
deque.offer("two");
deque.offer("three");
System.out.println(deque);
//[one, two, three]
deque.offerFirst("zero");
System.out.println(deque);
//[zero, one, two, three]
deque.offerLast("four");
System.out.println(deque);
//[zero, one, two, three, four]
System.out.println(deque.poll());
System.out.println(deque);
//[one, two, three, four]
System.out.println(deque.pollFirst());
System.out.println(deque);
//[two, three, four]
System.out.println(deque.pollLast());
System.out.println(deque);
//[two, three]
栈结构
- 栈可以保存一组元素,但是存取元素必须遵循先进后出 的原则。
- 通过栈可以完成前进、后退 这样的功能
- 双端队列为栈结构提供了对应的方法