java基础之容器的记忆方法和使用(代码详解)

java基础之容器的记忆方法和使用(代码详解)

1136法:

一个图;一个类;三个知识点;六个接口。

一个图:

java基础之容器的记忆方法和使用(代码详解)

一个类:

Collections类:
Collections(要记住的类),提供了一些静态方法实现了基于List容器的一些常用方法suffle(随机排序)、binarySearch(二分查询)等。

package javaBasic.collection;
import java.util.*;
/**
 * @author yn
 */
public class TestLinkedList3 {
    public static void main(String[] args){
        List l1 = new LinkedList();
        List l2 = new LinkedList();
        for (int i=0;i<=9;i++){
            l1.add("a"+i);
        }
        System.out.println(l1);
        Collections.shuffle(l1);//随机排列;
        System.out.println(l1);
        Collections.reverse(l1);//逆序;
        System.out.println(l1);
        Collections.sort(l1);
        System.out.println(l1);
        System.out.println(Collections.binarySearch(l1,"a5" ));//二分查找
    }
}

3个知识点:

1. For(基础);

2. Generic:泛型

  • 在定义集合时同时定义集合中对象的类型,使用<>;
  • 好处:增强程序的可读性和稳定性;

3.Auto-boxing/unboxing:在合适的时候自动打包解包

  • 打包: 自动将基础类型转换为对象;
  • 解包:自动将对象转换为基础类型。

6个接口:

Set, List, Map, Collection, Iterator, Comparable

1.set:

package javaBasic.collection;

import java.util.*;

/**
 * @author yn
 * @description  两个HashSet之间可以做运算,(由于Set集合元素不重复的特性)求交集,求并集。
 */
public class TestHashSet3 {
    public static void main(String[] args){
        Set s1 = new HashSet();
        Set s2 = new HashSet();
        s1.add("a");s1.add("b");s1.add("c");
        s2.add("d");s2.add("a");s2.add("b");
        //Set和List容器都具有construction(Collection c)
        //构造方法用以初始化容器类
        Set sn = new HashSet(s1);
        sn.retainAll(s2);
        Set su = new HashSet(s1);
        su.addAll(s2);
        System.out.println(sn);
        System.out.println(su);
    }
}

输出:
[a, b]
[a, b, c, d]

2. List:

  • LinkedList的底层实现是链表(改快读慢),ArrayList的底层实现是数组(读快改慢)。
  • hash两者之间。
  • Linked底层链表add的时候:只需要切换指针的指向,便可以添加一个元素;
  • Array底层数组add的时候,需要将后边的元素依次向后移动才能在某个位置添加一个元素。
package javaBasic.collection;

import java.util.*;
/**
 * @author yn
 * @description List方法举例 LinkedList的底层实现是链表(改快读慢),ArrayList的底层实现是数组(读快改慢)。
 * hash两者之间。
 * Linked底层链表add的时候:只需要切换指针的指向,便可以添加一个元素;
 * Array底层数组add的时候,需要将后边的元素依次向后移动才能在某个位置添加一个元素。
 */
public class TestLinkedList2 {
    public static void main(String[] args){
        List l1 = new LinkedList();
        for (int i=0;i<=5;i++){
            l1.add("a"+i);
        }
        System.out.println(l1);
        l1.add(3,"a100");
        System.out.println(l1);
        l1.add(6,"a200");//在某个位置上直接添加
        System.out.println(l1);
        System.out.println(l1.get(2)+" ");
        System.out.println(l1.indexOf("a3"));
        l1.remove(1);
        System.out.println(l1);
    }
}

3.Map:

package javaBasic.collection;
import java.util.*;

/**
 * @author yn
 * @description Map方法举例
 */
public class TestMapExample {
    public static void main(String[] args){
        Map<String,Integer> m1 = new HashMap();
        Map m2 = new TreeMap();
        //m1.put("one",new Integer(1));  //旧的写法;
        m1.put("one", 1);                        //新的写法;
        //m1.put("two",new Integer(2));
        m1.put("two", 2);
        //m1.put("three",new Integer(3));
        m1.put("three", 3);
        //m2.put("A",new Integer(1));
        m2.put("A",1 );
        //m2.put("B",new Integer(2));
        m2.put("B",2 );
        System.out.println(m1.size());
        System.out.println(m1.containsKey("one"));
        System.out.println(m2.containsValue(new Integer(1)));

        if (m1.containsKey("two")){
            //int i = (Integer) m1.get("two");
            int i =  m1.get("two");//加入泛型之后,不用再添加类型,写法越来越简单。
            System.out.println(i);
        }
        Map m3 = new HashMap(m1);
        m3.putAll(m2);
        System.out.println(m3);
    }
}

4.Collection ; 5.Iterator

package javaBasic.collection;

import java.util.*;
import java.util.HashSet;
import java.util.Iterator;


/**
 * @author yn
 * @description set,Iterator
 */
public class TestHashSet1 {
    public static void main(String[] args){
        Collection hs = new HashSet();
        hs.add(new Name("f1", "l1"));
        hs.add(new Name("f2","l2" ));
        hs.add(new Name("f3","l3" ));
        hs.add(new Name("f1", "l1"));//相同的元素不会被加入
        Iterator iterator = hs.iterator();
        while (iterator.hasNext()){
            //next()的返回值为Object类型,需要转换为相应的类型;
            Name name  = (Name)iterator.next();
            //也可以给Name写valueOf方法;
            System.out.println(name.getFirstname() + " " + name.getLastname());

        }
        System.out.println(hs);
    }
}

输出:
f1 l1
f2 l2
f3 l3
[f1 l1, f2 l2, f3 l3]

6.Comparable

  • Comparable 这个j接口只有一个方法:compareTo(T o),传入的参数是泛型,
  • 使用的时候需要实现这个接口,并且要实现这个方法;(接口中的方法没有实现)
package javaBasic.collection;
import java.util.*;
/**
 * @author yn
 */
public class UseComparable {
    public static void main(String[] args){
        List l1 = new LinkedList();
        l1.add(new Name("Kar1", "M"));
        l1.add(new Name("Steven", "Lee"));
        l1.add(new Name("John", "o"));
        l1.add(new Name("Tom", "M"));
        System.out.println(l1);
        Collections.sort(l1);
        System.out.println(l1);
    }
}

输出:
[Kar1 M, Steven Lee, John o, Tom M]
[Steven Lee, Kar1 M, Tom M, John o]

package javaBasic.collection;

public class Name implements Comparable{
    private String firstname,lastname;

    Name(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }
    public String getFirstname(){
        return firstname;
    }
    public String getLastname(){
        return lastname;
    }
    public String toString(){
        return firstname + " " + lastname;
    }
    //增加Name类的equals和hashCode方法如下:
    public boolean equals(Object obj){
        if (obj instanceof Name){
            //如果这个obj是个Name对象,名等于名,姓等于姓,那就返回true
            //如果传的不是Name对象,就交给父类处理。
            Name name = (Name)obj;
            return (firstname.equals(name.firstname))&&(lastname.equals(name.lastname));
        }
        return super.equals(obj);
    }
    public int hashCode(){
        return firstname.hashCode();
    }

    public int compareTo(Object o){
        Name name = (Name)o;
        int lastCmp = lastname.compareTo(name.lastname);
        return (lastCmp!=0?lastCmp:firstname.compareTo(name.firstname));
    }
}