Java集合
容器类ArrayList
容器的容量会随着对象的增加自动增长,不需要考虑边界
常见容器类:ArrayList
ArrayList实现了接口List类型
1 public static void main(String[] args) { 2 //新建容器类 3 ArrayList<Integer> ints = new ArrayList<Integer>(); 4 ArrayList<Integer> ints1 = new ArrayList<Integer>(); 5 ints.add(1); 6 ints.add(2); 7 ints.add(3); 8 ints1.add(1); 9 ints1.add(2); 10 ints1.add(3); 11 //contains判断是否存在 12 System.out.println(ints.contains(1)); 13 //get(i)获取指定位置i的对象 14 System.out.println(ints.get(0)); 15 //indexOf判断对象所处的位置 16 System.out.println(ints.indexOf(2)); 17 //remove(i)删除i位置的对象 18 ints.remove(0); 19 //set(i,x)将i位置的对象替换为x 20 ints.set(0,4); 21 //size()获取ArrayList的大小 22 System.out.println(ints.size()); 23 //addAll添加另一个容器的所有对象 24 ints.addAll(ints1); 25 //toArray转换为数组 26 //用法待补充 27 //清空ArrayList 28 ints.clear(); 29 }
泛型
不指定泛型的容器,可以存放任何类型的元素
指定了泛型的容器,只能存放指定类型的元素及其子类
1 //引入泛型Generic:容器+<Type> 2 //声明容器的时候,就指定了这种容器,只能放Hero及其子类,放其他的就会出错 3 List<Hero> genericheros = new ArrayList<Hero>();
遍历
1 //for循环遍历 2 for (int i = 0; i < heros.size(); i++) { 3 Hero h = heros.get(i); 4 System.out.println(h); 5 } 6 7 //迭代器iterator遍历 8 //while写法 9 while(it.hasNext()){ 10 Hero h = it.next(); 11 System.out.println(h); 12 } 13 //for写法 14 for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) { 15 Hero hero = (Hero) iterator.next(); 16 System.out.println(hero); 17 } 18 19 //增强型for循环遍历 20 //缺点:无法用于初始化,无法得知当前的下标 21 for (Hero h : heros) { 22 System.out.println(h); 23 }
LinkedList
LinkedList实现了双向链表Deque、队列Queue接口
1 LinkedList<Hero> ll =new LinkedList<Hero>(); 2 //尾部插入新对象 3 ll.addLast(new Hero("hero1")); 4 //头部插入新对象 5 ll.addFirst(new Hero("heroX")); 6 //查看头部的对象 7 System.out.println(ll.getFirst()); 8 //查看尾部的对象 9 System.out.println(ll.getLast()); 10 //取出头部的对象 11 System.out.println(ll.removeFirst()); 12 //取出尾部的对象 13 System.out.println(ll.removeLast()); 14 15 //LinkedList实现了List和Queue接口 16 List ll =new LinkedList<Hero>(); 17 Queue<Hero> q= new LinkedList<Hero>(); 18 //offer插入队列末尾 19 q.offer(new Hero("Hero1")); 20 //poll取出队列头 21 Hero h = q.poll(); 22 //peek查看队列头但不取出 23 h=q.peek();
HashMap
HashMap以键值对的方式储存数据
键key不可以重复,值可以重复
1 HashMap<String,String> dictionary = new HashMap<>(); 2 //put(关键字,值)插入 3 dictionary.put("1", "123"); 4 dictionary.put("2", "456"); 5 dictionary.put("3", "789"); 6 //get(关键值)输出 7 System.out.println(dictionary.get("3"));//输出789
HashSet
HashSet中的元素不能重复、无序
HashSet不提供get方法获取指定位置的元素,只能通过迭代器或增强型for循环,
1 HashSet<Integer> numbers = new HashSet<Integer>(); 2 //add(值)插入 3 numbers.add(9); 4 numbers.add(5); 5 numbers.add(1); 6 // Set中的元素排列,不是按照插入顺序 7 System.out.println(numbers); 8 9 // 10 for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) { 11 Integer i = (Integer) iterator.next(); 12 System.out.println(i); 13 } 14 for (Integer i : numbers) { 15 System.out.println(i); 16 }
HashSet内部封装了一个HashMap,HashSet作为Map的key,而value是名为PRESENT的静态Object对象,一个类属性
Collection
Collection是队列Set List Queue和双向链表Deque的接口
Collection和Map之间没有关系,Collection存放对象,Map存放键值对
Collections
Collections是一个类,容器的工具类
集合框架的比较
-
ArrayList vs HashSet
-
ArrayList:有序、可重复
-
HashSet:无序、不可重复
-
-
ArrayList vs LinkedList
-
ArrayList:插入删除慢,定位快(顺序)
-
LinkedList:插入删除快,定位慢(链表)
-
-
HashMap vs HashTable
-
HashMap:可以存null,非线程安全类
-
HashTable:不能存null,线程安全类
-
-
其他几种Set
-
HashSet: 无序
-
LinkedHashSet: 按照插入顺序
-
TreeSet: 从小到大排序
-
hashcode原理
HashMap查找比ArrayList查找快