List集合(重中之重)
基本概念
java.util.List集合是Collection集合的子集合,元素有先后放入次序并且可以重复。
该集合的主要实现类有:ArrayList类、LinkedList类、Stack类以及Vector类。
其中ArrayList类的底层是采用数组进行数据管理的,访问方便但增删不方便。
其中LinkedList类的底层是采用链表进行数据管理的,增删方便但访问不方便。
其中Stack类的底层是采用数组进行数据管理的,该类主要用于描述具有后进先出特性的数据结构,叫做栈(last in first out 简称为:LIFO)。
其中Vector类的底层是采用数组进行数据管理的,与ArrayList类相比属于早期提供的类,支持线程安全,但效率比较低,以后的开发中首选ArrayList类。
常用的方法
void add(int index,E element) - 向集合中指定位置添加元素.
boolean addAll(int index, Collection<?extends E> c) - 向集合中添加所有元素.
boolean remove(Object o) - 从集合中删除对象.
E get(int index) - 从集合中获取指定位置元素.
E set(int index,E element) - 修改指定位置的元素.
E remove(int index) - 删除指定位置的元素.
toArray() - 继承自Collection的方法,可以将集合中对象序列以对象数组的形式返回。
1 2 3 4 5 6 List list = new ArrayList(); list.add("one"); list.add("two"); list.add("three"); String[] arry = (String[])list.toArray(new String[]{}); System.out.println(Arrays.toString(arry));
subList(int i,int j) - 截取集合的i到j(前包括,后不包括)为子集合
此子集合与原集合占有相同的存储空间,对子集合的操作会影响到原集合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 import java.util.LinkedList;import java.util.List;public class ListTest { public static void main (String[] args) { List lt1 = new LinkedList (); System.out.println("lt1 = " + lt1); lt1.add(0 , "one" ); System.out.println("lt1 = " + lt1); lt1.add(1 , 3 ); System.out.println("lt1 = " + lt1); lt1.add(1 , "two" ); System.out.println("lt1 = " + lt1); System.out.println("--------------------------------------" ); String str1 = (String) lt1.get(0 ); System.out.println("获取到的元素是:" + str1); Integer it1 = (Integer) lt1.get(2 ); System.out.println("获取到的元素是:" + it1); System.out.println("--------------------------------------" ); StringBuilder sb2 = new StringBuilder (); sb2.append("[" ); for (int i = 0 ; i < lt1.size(); i++) { if (lt1.size()-1 == i) { sb2.append(lt1.get(i)).append("]" ); } else { sb2.append(lt1.get(i)).append("," ).append(" " ); } } System.out.println("lt1 = " + sb2); System.out.println("--------------------------------------" ); Integer it2 = (Integer) lt1.set(2 , "three" ); System.out.println("下标为2的旧元素是:" + it2); System.out.println("lt1 = " + lt1); System.out.println("--------------------------------------" ); String str2 = (String) lt1.remove(1 ); System.out.println("被删除的元素是:" + str2); System.out.println("删除后集合中的元素有:" + lt1); System.out.println("--------------------------------------" ); System.out.println("--------------------------------------" ); List lt2 = lt1.subList(0 , 1 ); System.out.println("lt2 = " + lt2); lt2.set(0 , 2 ); System.out.println("lt2 = " + lt2); System.out.println("lt1 = " + lt1); } }
泛型机制(重点)
基本概念
通常情况下集合中可以存放不同类型的对象,是因为集合将这些对象全部看做Object类型放入的,当从集合中取出元素时也是Object类型的,为了表达该元素最真实的数据类型则需要进行强制类型转换,此时可能引发类型转换异常。
为了避免上述错误的发生,从jdk1.5开始提出泛型机制,也就是在集合名称的右侧使用<数据类型>的方式明确要求该集合中可以存放元素的类型,若放入其他类型的元素则编译报错,如:
List lt1 = new LinkedList();
泛型的本质
泛型的本质就是参数化类型,也就是让数据类型作为参数传递,其中集合中E作为形参负责占位,当使用集合时<>中的数据类型作为实参给E进行赋值操作,从而使得集合中所有的E都被替换为实参指定的类型。
由于实参的传递支持各种各样广泛的类型,因此得名为"泛型机制".
如:
1 2 3 4 5 6 7 8 9 10 // 其中i表示形式参数,负责占位 其中E表示形式参数,负责占位 // int i = 2; E = String; // int i = 5; E = Student; public void show(int i) { public class List<E> { ... ... } } // 其中2表示实际参数,用于给形参初始化 // 其中String表示实际参数 show(2); List<String> lt1 = ...; show(5); List<Student> lt2 = ...;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import java.util.LinkedList;import java.util.List;import cn.itxdl.day15.Student;public class ListTypeTest { public static void main (String[] args) { List<String> lt1 = new LinkedList <String>(); lt1.add("one" ); System.out.println("lt1 = " + lt1); System.out.println("-----------------------------" ); String str1 = lt1.get(0 ); System.out.println("获取到的元素是:" + str1); System.out.println("-----------------------------" ); List<Integer> lt2 = new LinkedList <Integer>(); lt2.add(1 ); Integer it1 = lt2.get(0 ); System.out.println("获取到的元素是:" + it1); System.out.println("-----------------------------" ); List<Student> lt3 = new LinkedList <>(); lt3.add(new Student (1001 , "zhangfei" , 30 )); Student st1 = lt3.get(0 ); System.out.println("st1 = " + st1); } }
Stack集合(栈,后进先出)
boolean push(E e) - 将一个对象添加至栈顶,若成功则返回true。
E pop() - 从栈顶删除并返回一个元素。
E peek() - 返回栈顶的元素(但并不删除)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import java.util.Stack;public class StackTest { public static void main (String[] args) { Stack<Integer> s = new Stack <Integer>(); for (int i = 1 ; i <= 5 ; i++) { s.push(i*11 ); System.out.println("栈中的元素有:" + s); } System.out.println("-------------------------------" ); System.out.println("栈顶元素是:" + s.peek()); System.out.println("-------------------------------" ); int len = s.size(); for (int i = 1 ; i <= len; i++) { System.out.println("出栈的元素是:" + s.pop()); } System.out.println("最终栈中的元素有:" + s); } }
Queue集合(重点)
基本概念
java.util.Queue集合是Collection集合的子集合,与List集合属于平级关系。
该集合主要用于描述具有先进先出特征的数据结构,叫做队列(first in first out,FIFO)。
该集合的主要实现类有:LinkedList类,该类在增删方面有优势。
常用的方法
boolean offer(E e) - 将一个对象添加至队尾,若成功则返回true。
E poll() - 从队首删除并返回一个元素。
E peek() - 返回队首的元素(但并不删除)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import java.util.LinkedList;import java.util.Queue;public class QueueTest { public static void main (String[] args) { Queue<Integer> q1 = new LinkedList <Integer>(); for (int i = 1 ; i <= 5 ; i++) { boolean b1 = q1.offer(i*11 ); System.out.println("队列中的元素有:" + q1); } System.out.println("-----------------------------" ); System.out.println("队列中队首元素是:" + q1.peek()); System.out.println("-----------------------------" ); int len = q1.size(); for (int i = 1 ; i <= len; i++) { System.out.println("出队的元素是:" + q1.poll()); } System.out.println("队列中最终的元素有:" + q1); } }