Android面试准备(第一弹:Java集合)

ArrayList、LinkedList、Vector区别

  • ArrayList 是一个可改变大小的数组,其大小将会动态地增长。
  • LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义。
    LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等。
  • Vector 和ArrayList类似,但属于强同步类,开销会比较大。Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.

Queue队列

其接口定义为:

public interface Queue<E> extends Collection<E> {
    //获取但不移除队列头,
    E element();
    //添加元素到队尾
    boolean offer(E o);
    //获取但不移除队列头的元素 
    E peek();
    //移除对头元素
    E poll();
    //移除对头元素
    E remove();
}
  • Queue主要特征在于FIFO,的实现一般并不容许插入null,只有LinkedList是一个例外,它容许插入null。
  • 当Queue的元素已经到达限制数目时,add会抛出 IllegalStateException异常,offer会返回false。
  • 当Queue为空时,remove抛出NoSuchElementException异常,而poll返回null。
  • element和peek返回但不删除Queue中的头元素,它们的区别类似remove与poll。
BlockingQueue与CountDownLatch
  • BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量:

    当容量满时,往BlockingQueue中添加数据时会造成阻塞。
    当容量为空时,取元素操作会阻塞。

其两个常用子类是ArrayBlockingQueue和LinkedBlockingQueue。

  • CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。主要方法:
    public CountDownLatch(count); 
    public void countDown(); 
    public void await() ;

    构造方法指定了计数的次数。countDown方法,当前线程调用此方法则计数减一。await方法,调用该方法会一直阻塞当前线程,直到计时器的值为0。

Map

  • Hashtable:底层是哈希表数据结构,不可以存入null健null值,该集合是线程同步的 。
  • 底层是哈希表数据结构,允许使用null健null值,该集合是不同步的 。
  • TreeMap: 底层是二叉树数据结构,可以用于给map集合中的健进行排序 该集合线程不同步。
  • HashMap添加元素,如果出现添加相同的健时,后添加的值会覆盖原有健对应的值。
  • Map的遍历方法之一
    HashMap<String,String> source = new HashMap<>();
    for (Map.Entry<String,String> entry: source.entrySet()){
      System.out.println(entry.getKey());
      System.out.println(entry.getValue());
    }

    Map的遍历方法之二

    Collection<String> values =source.values();
      for (Iterator<String> it = values.iterator(); it.hasNext();) {
          String s = it.next();
          System.out.println(s);
      }

    Map的遍历方法之三

    //需要Java8以上的版本
    source.forEach((k,v)->System.out.println( k + " : " + v));

Collections、Collection与Arrays

  • Collection是一个集合接口,是List、Set、Queue接口。
  • Collections包含有各种有关集合操作的静态多态方法,此类不能实例化,就像一个工具类。如Collections的排序方法sort。

    ArrayList<Integer> list=new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(5);
    list.add(3);
    list.add(2);
    //默认升序,输出1 2 2 3 5
    Collections.sort(list);
    //降序,输出5 3 2 2 1
    Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
  • Arrays类能方便地操作数组,它提供的所有方法都是静态的,主要方法:

    给数组赋值:通过fill方法。
    对数组排序:通过sort方法,按升序,有些重载方法可以传入Comparator接口。
    比较数组:通过equals方法比较数组中元素值是否相等。
    查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

int[] ints=new int[5];
//数组全部赋值为6
Arrays.fill(ints,6);
//数组第2个和第4个赋值为7,未赋值的未0
Arrays.fill(ints,1,4,7);

//升序
Arrays.sort(ints);
//对第1个到第4个进行升序
Arrays.sort(ints,1,4);

int[] ints1=ints.clone();
Arrays.equals(ints,ints1); //true
int[] ints2=new int[5];
Arrays.fill(ints2,8);
Arrays.equals(ints,ints2);//true

//使用二分搜索算法查找指定元素所在的下标(必须是排序好的,否则结果不正确)
Arrays.sort(ints);
//会返回第一个找到的下标
System.out.println(Arrays.binarySearch(ints,6));
点赞