Collection容器
1、首先我们要了解为什么JAVA中要有容器?
我们知道数组的长度一旦指定,程序在执行过程中就不能改变,正是因为数组有这样的缺陷,所以才出现就(collection)容器,容器的大小可以任意改变,容器的大小就是根据你实际放入了多少的数据而相应的变大。
2、容器中包括Set 和List,那么他们有什么区别呢?
Set是无序唯一的,底层是用Map实现的;List是有序不唯一的,底层是数组,所以可以用索引来得到值
注意:在list中删除数据时,当删除的是里面的整数数据类型时要知道使用包装类型进行删除,我们要知道JAVA会自动装箱和拆箱 但是在Set就不需要使用包装类型来删除,因为Set中没有索引
3、List又分为Arrylist和LinkedList,他们之间又有什么区别呢?各适用于什么情况呢?
ArrayList(数组)的内存地址连续,这个容器中的数据是经常用来查找的;LinkedList(链表)内存地址不连续,这个容器中的数据经常用来更新
4、Iterator(容器的迭代器)
所有实现了Collection接口的类都有一个iterator方法,这个方法会得到一个实现了Iterator的类的对象;List虽然有索引,但是也可以使用JAVA5.0以后出来的增强for循环,其实就相当于.Net中的foreach(),但是因为不能方便的操作索引,只用于简单的遍历,如果增强的for循环迭代的是容器的话内部默认的也是使用的Iterator迭代器实现的。但是也必须要使用迭代器来实现,因为这是唯一县城安全的方法
5、Collections类
该类提供了一系列的方法来对List进行操作,比如说我们自己写的类要进行比较大小或者是排序,那么和它相关的一切规则需要我们自己来定义,比如比较对象是否相等或者是判断大小的规则,如果是要实现比较大小的类一定要实现Comparable接口然后重写public int compareTo(Object o)方法,为了更美观的输出到控制台上也建议重写public String toString()方法。
如下程序调用collections类中的sort方法对list进行排序,在自己写的类当中规定好排序的方法:
1 import java.util.*; 2 3 public class test{ 4 public static void main(String[] args){ 5 6 Listlist = new ArrayList (); 7 list.add(new Person("jack",23)); 8 list.add(new Person("tom",19)); 9 list.add(new Person("rose",22));10 list.add(new Person("mack",21));11 list.add(new Person("twins",34)); 12 13 Collections.sort(list); //因为该方法是静态的所以可以直接使用 类名.方法名 直接调用14 System.out.println(list);15 } 16 }17 18 class Person implements Comparable{19 20 public Person(String name,int age){21 this.name = name;22 this.age = age;23 }24 String name;25 int age;26 public String toString(){27 return "name "+this.name +" age:"+this.age ;28 }29 public int compareTo(Object o){30 Person p = (Person)o;31 if(this.age > p.age){32 return 1;33 }else if(this.age < p.age){34 return -1;35 }else{36 return 0;37 }38 39 }40 41 }
6、JAVA5.0之后出现的泛型
概念:指定当前的容器中只能放置什么样的类型,并且泛型中没有父类的引用指向子类的对象
7、容器中为什么会出现Map?
因为Set是无序的,唯一的,hashSet没有索引,不方便通过索引来对容器进行操作,所以出现了Map,所以Map就是可以创建索引,而且这个索引还是自己定义的。Map是以Key-value(键-值)对的形式来保存数据的,添加数据是使用Map.put( index,value);index是自定义的类型,可以是自己规定的;获取数据是使用Map.get(index) 其实Map就相当于List只是Map是添加了索引的功能
Map的迭代方法有两种:
1)、先使用map.keySet()方法获得map里面的所有Key值封装成Set类型,然后再使用set的iterator迭代器来进行迭代,获得key值就可以获得value值 如下代码:
import java.util.*;public class test{public static void main(String[] args){ Mapmap = new HashMap (); map.put("1","zhong"); map.put("2","ke"); map.put("3","wen"); map.put("4","good"); map.put("5","night !!"); Set set = map.keySet(); for(Iterator i = set.iterator();i.hasNext();){ String key = (String)i.next(); System.out.println(map.get(key)); }} }
2)、使用Map中的EntrySet方法来获得键值对Entry,包装成Set试图在使用Set中的Iterator方法进行迭代。Entry代表的是一对key-value,我们可以把他看成是Map的属性(成员变量)
如下代码所示:
import java.util.*;public class test{public static void main(String[] args){ Mapmap = new HashMap (); map.put("1","zhong"); map.put("2","ke"); map.put("3","wen"); map.put("4","good"); map.put("5","night !!"); Set > entrys = map.entrySet(); for(Iterator > i = entrys.iterator();i.hasNext();){ Map.Entry entry = i.next(); System.out.println(entry.getValue()); } } }