集合 
集合概述
  Java集合类存放于java.util包中,是一个用来存放对象的容器。
        1.集合只能存放对象。比如你存一个int型数据1放到集合中,其实他是自动转换成Integer类后存入的,Java中每一个基本类型都对应一个引用类型。
        2.集合存放的是多个对象的引用,对象本身还是放到堆内存中。
        3.集合可以存放不同类型,不限数量的数据类型。
  Java集合可分为Set、List和Map三种体系
        Set:无序,不可重复的集合。
        List:有序,可重复的集合。
        Map:具有映射关系的集合。
1. HashSet
  HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类,我们大多数说Set集合指的都是HashSet。
  HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
  HashSet具有以下特点:
        不能保存元素的排列顺序。
        不可重复。
        HashSet不是线程安全的。
        集合元素可以使用null。
  当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。
  如果两个元素的equals()方法返回true,但他们的hashCode()返回值不相等,hashSet将会把他们存储在不同的位置,但依然可以添加成功。
  hashCode()方法:
        HashSet集合判断两个元素相等的标准:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
        如果两个对象通过equals()方法返回true,这两个对象的hashCode值也相等。
  实例:
  public class Test1 {
      public static void main(String[] args) {
          Set set = new HashSet();
          //添加
          set.add(1);
          set.add("a");
          System.out.println(set);
          //移除
          set.remove(1);
          System.out.println(set);
          //是否存在
          System.out.println(set.contains(1));
          set.add("a");
          set.add("b");
          set.add("c");
          set.add("d");
          set.add("d");//set集合存的值是不存在的
          System.out.println(set);
          //使用迭代器遍历集合
          Iterator it = set.iterator();
          while (it.hasNext()){
              System.out.println(it.next());
          }
          //for each迭代集合
          for (Object obj : set){//把set的每一个值取出来,赋值给obj,直到循环set的所有值
              System.out.println(obj);
          }
          //获取集合的元素个数
          System.out.println(set.size());
          //如果让集合只能存同样类型的对象,使用泛型
          Set<String> set1 = new HashSet<String>();
          set1.add("sbc");
          //set1.add(1);
      }
  }

2. TreeSet
  TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
  TreeSet支持两种排序方法:自然排序和定制排序。默认使用自然排序。
  自然排序:
        TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。
        如果this>obj,返回正数1
        如果this<obj,返回负数1
        如果this=obj,返回0,则认为这两个对象相等。
        必须放入同样类的对象(默认会进行排序)否则可能会发生类型转换异常.我们可以使用泛型来进行限制。
  实例:
  public class Test3 {
      public static void main(String[] args) {
          Person p1 = new Person("张三",23);
          Person p2 = new Person("lisi",16);
          Person p3 = new Person("mazi",12);
          Person p4 = new Person("didi",27);
          Set<Person> set = new TreeSet<Person>(new Person());
          set.add(p1);
          set.add(p2);
          set.add(p3);
          set.add(p4);
          for (Person p : set){
              System.out.println(p.name+"   "+p.age);
          }
      }
  }
      //把Person对象存到TreeSet中并且按照年龄排序
      class Person implements Comparator<Person>{
          int age;
          String name;
          public Person(){
          }
          public Person(String name,int age) {
              this.age = age;
              this.name = name;
          }
          @Override
          public int compare(Person o1, Person o2) {
              if (o1.age < o2.age){
                  return 1;
              }else if (o1.age > o2.age){
                  return -1;
              }else{
                  return 0;
              }
          }
      }

3. List与ArrayList
  List代表一个元素有序且可重复的集合,集合中的每个元素都有其对应的顺序索引。
  List允许使用重复元素,可以通过索引来访问指定位置的集合元素。
  List默认按元素的添加顺序设置元素的索引。
  List集合里添加了一些根据索引来操作集合元素的方法。
  实例:
  public class Test4 {
      public static void main(String[] args) {
          List<String> list = new ArrayList<String>();
          list.add("d");//第一个,索引下标为0
          list.add("a");//索引下标为1
          list.add("b");//索引下标为2
          list.add("c");//索引下标为3
          list.add("d");//允许使用重复元素
          System.out.println(list);
          //通过索引来访问指定位置的集合元素
          System.out.println(list.get(2));
          //在指定索引下标位置插入数据
          list.add(1,"f");
          System.out.println(list);
          List<String> l = new ArrayList<String>();
          l.add("123");
          l.add("456");
          //在指定索引下标的位置插入集合
          list.addAll(2,l);
          System.out.println(list);
          //获取指定元素在集合中第一次出现的索引下标
          System.out.println(list.indexOf("d"));
          //获取指定元素在集合中最后一次出现的索引下标
          System.out.println(list.lastIndexOf("d"));
          //根据指定的索引下标移除元素
          list.remove(2);
          System.out.println(list);
          //根据指定的索引下标修改元素
          list.set(1,"ff");
          System.out.println(list);
          //根据索引下标的起始位置截取一段元素,形成一个新的集合,截取的时候包含开始的索引,不包含结束时的索引
          List<String> sublist = list.subList(2,4);
          System.out.println(sublist);
          //集合长度
          System.out.println(list.size());
      }
  }

4. Map
Map
  Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的value值。
  Map中的key与value都可以是任何引用类型的数据。
  Map中的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较中返回false。
  key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的,确定的value值。
  实例:
  public class Test5 {
      public static void main(String[] args) {
    Map<String,Integer> map = new HashMap<String,Integer>();
    //添加数据
    map.put("b",1);
    map.put("d",2);
    map.put("e",2);
    System.out.println(map);
    //根据key取值
    System.out.println(map.get("d"));
    //根据key移除键值对
    map.remove("e");
    System.out.println(map);
    //map集合的长度
    System.out.println(map.size());
    //判断当前map集合是否包含指定的key
    System.out.println(map.containsKey("b"));
    //判断当前map集合是否包含指定的value
    System.out.println(map.containsValue(2));
    //获取map集合的key集合
    Set<String> keys = map.keySet();
    //获取集合的所有value值
    map.values();
    //遍历Map集合,通过map.keySet()
    for (String key : keys){
        System.out.println("key:"+key+",value:"+ map.get(key));
    }
    //通过map.entrySet()遍历
    Set<Map.Entry<String, Integer>> entries = map.entrySet();
    for (Map.Entry<String,Integer> en : entries){
        System.out.println("key:"+en.getKey()+",value:"+ en.getValue());
          }
      }
  }
TreeMap
  TreeMap存储Key-Value对时,需要根据key对key-value对进行排序,TreeMap可以保证所有的Key-Value对处于有序状态。
  TreeMap的Key的排序:
        自然排序:TreeMap的所有的Key必须实现Comparable接口,而且所有的Key应该是同一类的对象,否则将会抛出ClasssCastException。
  实例:
  public class Test6 {
      public static void main(String[] args) {
          //TreeMap的自然排序是字典排序
          Map<Integer,String> map1 = new TreeMap<Integer,String>();
          map1.put(8,"b");
          map1.put(9,"d");
          map1.put(5,"a");
          map1.put(3,"c");
          System.out.println(map1);
          Map<String,String> map = new TreeMap<String,String>();
          map.put("b","f");
          map.put("a","s");
          map.put("b","a");
          map.put("c","d");
          map.put("1","e");
          map.put("10","h");
          System.out.println(map);
      }
  }
5. 操作集合的工具类:collections
  Collections是一个操作Set、Map、List等集合的工具类。
  Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
  排序操作:
        reverse(List):反转List中元素的顺序。
        shuffle(List):对List集合元素进行随机排序。
        sort(List):根据元素的自然顺序对指定List集合元素按升序排序。
        swap(List,int,int):将指定List的集合中的i处元素和j处元素进行交换。
  实例:
  public class Test7 {
      public static void main(String[] args) {
          List<String> list = new ArrayList<String>();
          list.add("b");
          list.add("bd");
          list.add("ce");
          list.add("a");
          list.add("1");
          System.out.println(list);
          //反转List中元素的顺序
          Collections.reverse(list);
          System.out.println(list);
          //对List集合元素进行随机排序
          Collections.shuffle(list);
          System.out.println(list);
          //根据元素的自然顺序对指定List集合元素按升序排序
          Collections.sort(list);
          System.out.println(list);
          //将指定List的集合中的i处元素和j处元素进行交换
          Collections.swap(list,0,4);
          System.out.println(list);
          //返回最小值
          System.out.println(Collections.max(list));
          //返回最大值
          System.out.println(Collections.min(list));
          //返回指定集合元素出现次数
          System.out.println(Collections.frequency(list,"a"));
          //使用新值替换掉List对象的所有旧值
          Collections.replaceAll(list,"a","aa");
          System.out.println(list);
      }
  }
   sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序。
  实例:
  public class Test8 {
      public static void main(String[] args) {
          Student s1 = new Student(18,"小明");
          Student s2 = new Student(25,"小花");
          Student s3 = new Student(13,"小华");
          Student s4 = new Student(16,"小明");
          List<Student> stus = new ArrayList<Student>();
          stus.add(s1);
          stus.add(s2);
          stus.add(s3);
          stus.add(s4);
          for (Student stu : stus){
              System.out.println(stu.name+" "+stu.age);
          }
          System.out.println("-------------------------");
          Collections.sort(stus,new Student());
          for (Student stu : stus){
              System.out.println(stu.name+" "+stu.age);
          }
      }
  }
  class Student implements Comparator<Student> {
      int age;
      String name;
      public Student() {
      }
      public Student(int age, String name) {
          this.age = age;
          this.name = name;
      }
      //根据年龄升序排列
      @Override
      public int compare(Student o1, Student o2) {
          if (o1.age > o2.age) {
              return 1;
          } else if (o1.age < o2.age) {
              return -1;
          } else {
              return 0;
          }
      }
  }
 
                     
                    
                 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号