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查找快

HashMap通过计算关键字的hash值,生成键值对,查找时直接定位,只有hashcode相同时需要比较

posted @ 2021-03-09 22:34  Colin13  阅读(40)  评论(0编辑  收藏  举报