JavaSE核心API--List接口

java.util.List等

1)理论讲解:数组转换为集合

通过数组的工具类Arrays提供的方法:asList
可以将一个数组转换为一个List集合。

代码演示:

    String[] array = { "one", "two", "three" };

    List<String> list = Arrays.asList(array);
    System.out.println("size:" + list.size());
    System.out.println("list:" + list);

    list.set(1, "2");
    System.out.println("list:" + list);
    System.out.println("array:" + Arrays.toString(array));
    /*
     * 从数组转换的集合不支持增删元素
     */
//  list.add("four");
//  System.out.println("list:"+list);
//  System.out.println("array:"+Arrays.toString(array));
    /*
     * 可以自行创建一个集合来操作元素
     */
//  List<String> list2 = new ArrayList<>();
//  list2.addAll(list);
    /*
     * 所有集合都支持一个参数为集合的构造方法,作用是创建当前集合的同时包含给定集合所有元素
     */
    List<String> list2 = new ArrayList<>(list);
    System.out.println("list2:" + list2);
    list2.add("four");
    System.out.println("list2:" + list2);

2)理论讲解:集合转换为数组

Collection接口提供了一个方法:toArray,可以将当前集合转换为一个数组。任何集合都可以转换为数组。

代码演示:

    Collection<String> c = new ArrayList<>();
    c.add("one");
    c.add("two");
    c.add("three");
    System.out.println(c);

//  Object[] array = c.toArray();
    String[] array = c.toArray(new String[c.size()]);
    System.out.println(array.length);
    System.out.println(Arrays.toString(array));

3)理论讲解:双端队列

java.util.Deque接口,该接口继承自Queue
双端队列是两端都可以做出入队操作的队列。
常用实现类:java.util.LinkedList

代码演示:

    Deque<String> deque = new LinkedList<String>();
    deque.offer("one");
    deque.offer("two");
    deque.offer("three");
    System.out.println(deque);

    deque.offerFirst("four");
    System.out.println(deque);

    deque.offerLast("five");
    System.out.println(deque);

    String str = deque.poll();
    System.out.println(str);
    System.out.println(deque);

    str = deque.pollFirst();
    System.out.println(str);
    System.out.println(deque);

    str = deque.pollLast();
    System.out.println(str);
    System.out.println(deque);

4)理论讲解:List接口

java.util.List
List接口
List是Collection的一个常用子接口,表示可重复集,并且
该集合有序。特点是可以通过下标操作元素。
常见实现类:
java.util.ArrayList
数组实现,查询性能更好

java.util.LinkedList
链表实现,增删元素性能更好,尤其收尾增删元素效率最佳。

对性能没有极端苛刻要求时,通常使用ArrayList

代码演示:

    List<String> list = new ArrayList<String>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    System.out.println(list);
    /*
     * E get(int index) 
     * 获取指定下标对应的元素
     */
    String str = list.get(1);
    System.out.println(str);

    for (int i = 0; i < list.size(); i++) {
        str = list.get(i);
        System.out.println(str);
    }

    /*
     * E set(int index,E e) 
     * 将给定元素设置到指定位置,返回值为原位置对应的元素。(替换元素操作)
     * 
     */
    String old = list.set(1, "2");
    System.out.println(list);
    System.out.println("old:" + old);

5)理论讲解:List提供了一对重载的add,remove方法

代码演示:

    List<String> list = new ArrayList<>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    System.out.println(list);

    /*
     * void add(int index,E e)
     * 将给定元素插入到指定位置 
     */
    list.add(1, "2");
    System.out.println(list);

    /*
     * E remove(int index)
     * 删除并返回指定位置的元素
     */
    String old = list.remove(2);
    System.out.println(list);
    System.out.println(old);

6)理论讲解:List集合支持截取子集: List subList(int start,int end)

代码演示:

    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < 10; i++) {
        list.add(i);
    }
    System.out.println(list);
    /*
     * 获取2-7
     */
    List<Integer> subList = list.subList(2, 8);
    System.out.println(subList);

    /*
     * 将子集中每个元素扩大10倍
     */
    for (int i = 0; i < subList.size(); i++) {
        int num = subList.get(i);
        num = num * 10;
        subList.set(i, num);
    }
    System.out.println(subList);
    /*
     * 对子集操作就是对元集合对应的操作
     */
    System.out.println(list);
    // 删除2-7
    list.subList(2, 8).clear();
    System.out.println(list);

7)理论讲解:队列

java.util.Queue接口,该接口是队列接口,规定了队列具有的相关方法。Queue接口继承自Collection,所以同时具备集合的相关方法。

队列可以保存一组元素,但是存取元素必须遵循先进先出原则。
常用实现类:java.util.LinkedList

代码演示:

    Queue<String> queue = new LinkedList<>();
    /*
     * offer为入队操作,将元素添加到队列末尾
     */
    queue.offer("one");
    queue.offer("two");
    queue.offer("three");
    queue.offer("four");
    queue.offer("five");
    queue.offer("six");
    System.out.println(queue);

    /*
     * E poll() 出队操作,获取队首元素,获取后该元素即从队列 中被删除
     */
    String str = queue.poll();
    System.out.println(str);
    System.out.println(queue);
    /*
     * peek方法是引用队首元素,获取后该元素依然在 队列当中。
     */
    str = queue.peek();
    System.out.println(str);
    System.out.println(queue);
    /*
     * 使用迭代器遍历不影响队列元素
     */
    for (String s : queue) {
        System.out.println(s);
    }
    System.out.println(queue);

    /*
     * 使用poll方法遍历队列,这种方式遍历后队列 就没有元素了
     */
    while (queue.size() > 0) {
//  for(;queue.size()>0;) {
        str = queue.poll();
        System.out.println(str);
    }
    System.out.println(queue);

8)理论讲解:集合的排序

集合的工具类:java.util.Collections
其提供了一个静态方法:sort,可以对List集合进行自然排序
即:从小到大的排序

代码演示:

    List<Integer> list = new ArrayList<Integer>();
    Random random = new Random();
    for(int i=0;i<10;i++) {
        list.add(random.nextInt(100));
    }
    System.out.println(list);   
    Collections.sort(list);
    System.out.println(list);

9)理论讲解:排序保存自定义类型元素的集合

代码演示:

    List<Point> list = new ArrayList<Point>();
    list.add(new Point(3,4));
    list.add(new Point(7,8));
    list.add(new Point(1,6));
    list.add(new Point(5,0));
    list.add(new Point(4,8));
    System.out.println(list);
    /*
     * Collections的该sort方法在排序集合时要求集合
     * 元素必须实现Comparable接口并重写其中定义的比较
     * 方法。否则编译不通过。java API中常见数据类型
     * 都实现了该接口,比如包装类和字符串。
     * 但是我们自定义的元素通常不要去实现该接口。因为
     * 当我们使用某个方法时,该方法要求我们为其修改其他
     * 额外的代码时,这个方法就具有侵入性,这样的方法
     * 对程序结构不利。尽量避免使用。
     */
//  Collections.sort(list);

    /*
     * 重载的Collections.sort(List,Comparator)
     * 该方法要求我们传入要排序的集合外,在额外传入
     * 一个比较器,该比较器是用来为集合元素定义的一
     * 种比较大小的规则。这样sort方法就会利用给定的
     * 比较器的比较规则对集合元素进行比较大小后进行
     * 自然排序了。这也就不再要求集合元素必须去实现
     * 接口:Comparable了。
     */
//  Comparator<Point> c = new Comparator<Point>() {
        /**
         * 实现Comparator接口后,要求必须重写方法:
         * compare,该方法用来定义o1,o2的大小关系
         * 返回值为int型,该值不关心具体取值,只关注
         * 取值范围:
         * 当返回值>0:表示o1>o2
         * 当返回值<0:表示o1<o2
         * 当返回值=0:表示两个对象相等
         */
//  public int compare(Point o1, Point o2) {
//      int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//      int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//      return olen1-olen2;
//  } 
//          
//};

//  Collections.sort(list, c);

    Collections.sort(list,new Comparator<Point>() {
        public int compare(Point o1, Point o2) {
            int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
            int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
            return olen1-olen2;
        }   
    });

    System.out.println(list);

10)理论讲解:排序字符串

String已经实现了Comparable接口,但有时该比较规则不符合我们的排序需求,
这时我们也可以使用比较器来提供额外的比较规则并进行排序。

代码演示:

    List<String> list = new ArrayList<>();
    list.add("马冬梅");
    list.add("小明");
    list.add("王老师");
    System.out.println(list);
//  Collections.sort(list);     
    Collections.sort(list, new Comparator<String>() {
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    });
    System.out.println(list);

11)理论讲解:栈

双端队列若只从同一端做进出队操作时,就形成了栈结构。
栈结构存取元素遵循先进后出原则。

通常我们使用栈是完成"后退"这样的功能。

代码演示:

    Deque<String> stack = new LinkedList<>();
    stack.push("one");
    stack.push("two");
    stack.push("three");
    stack.push("four");
    System.out.println(stack);

    String str = stack.pop();
    System.out.println(str);
    System.out.println(stack);

    for (String s : stack) {
        System.out.println(s);
    }
    System.out.println(stack);

    while (stack.size() > 0) {
        str = stack.pop();
        System.out.println(str);
    }
    System.out.println(stack);

附件:作为集合元素测试集合排序

public class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
        super();
        this.x = x;
        this.y = y;
   }

   public int getX() {
        return x;
   }

   public void setX(int x) {
        this.x = x;
   }

   public int getY() {
        return y;
   }

   public void setY(int y) {
        this.y = y;
   }

   public String toString() {
        return "(" + x + "," + y + ")";
   }

   public boolean equals(Object o) {
        if (o == null) {
           return false;
        }
        if (o == this) {
           return true;
        }
        if (o instanceof Point) {
           Point p = (Point) o;
           return this.x == p.x && this.y == p.y;
        }
        return false;
   }
}