Java基础篇——集合框架
集合——对象的容器
集合与数组相似,不同的是,集合的长度可变并且只能组合引用类型数据,如果要组合基本类型,则需要装箱成包装类
Collection体系集合
-
Collection父接口
Collection的实现类中含有许多的方法可供使用
boolean add (0bject obj) //添加一一个对象。 boolean addA1l (Collection c) //将参数集合中的所有对象添加到此集合中。 boolean contains (Object o) //检查此集合中是否包含参数对象 boolean equals (Object o) //比较此集合是否与参数对象相等。 boolean isEmpty() //判断此集合是否为空 boolean remove (Object o) //在此集合中移除参数对象 void clear() //清空此集合中的所有对象。 int size() //返回此集合中的元素个数。 Object[] toArray() //将此集合转换成数组。
用Iterator迭代器遍历Collection集合
Iterator类中有三个方法可供遍历时使用
//next()方法,返回迭代的下一个元素 //hasNext()方法,判断迭代有无更多元素(如果next方法返回的是元素而不是错误,该方法为true) //remove()方法,删除迭代器当前迭代的对象,在使用迭代器删除元素时,只能使用remove方法
-
List子接口
List接口的实现类继承Collection实现类,所以List接口中含有Collection类的方法,除此之外,该类也有自己的子方法
void add(int index, 0bject o) //在index位置插入对象o。 boolean addA1l(int index, Collection c) //将一个集合中的元素添加到此集合中的index位置。 0bject get(int index) //返回集合中指定位置的元素。 List subList(int fromIndex, int toIndex) //返回fromIndex和toIndex之间的集合元素。
List对象的遍历
与Collection类实例不同的是,List对象是有序的,所以可以用下标引用集合成员,可以通过get方法实现for循环等
在普通迭代器的基础上,List类还提供了ListIterator迭代器(列表迭代器),支持从任意方向遍历集合(逆向用hasPrevious()方法和previous()方法)
List实现类
-
ArrayList
用数组结构实现,查询快,增删慢,运行效率快,线程不安全
//默认容量,初始化容量为0,任意添加一个元素后,容量变为10,满则扩容 private static final int DEFAULT_CAPACITY = 10; //每次扩容为原容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1);
-
Vector
数组结构实现,查询快,增删慢,运行效率慢,线程安全
vector中提供了一种额外的遍历方法:枚举器
用法类似于迭代器
Enumeration a =vector.elements(); while(a.hasMoreElements()){ System.out.println(a.nextElement()); }
-
LinkedList
双向链表结构实现,增删快,查询慢
泛型
-
泛型类
public class MyGeneric<T> { //用泛型创建变量,不能实例化(不能确保类类型) T t; //用泛型做参数 public void print(T t){ System.out.println(t); } //泛型作为返回值 public T test(){ return t; } } //语法:类名+<T>
创建泛型类
MyGeneric<String> myGeneric =new MyGeneric<String>(); //创建后可以用类中的方法 myGeneric.t="粗莓"; myGeneric.print("啦啦啦"); //不同的泛型类之间不能相互赋值
-
泛型接口
public interface MyGenericInterface<T>{} //语法:接口名+<T>
-
泛型方法
public <T> void generic(){...} //返回值和参数也可以是T类型 public <T> T generic(T t){return t;} //语法:<T>+返回值+方法名
Set实现类
-
HashSet
基于HashCode(哈希值)计算元素存放位置
存储过程
(1)根据hashcode计算存储位置,如果为空,则存储,否则执行第二步
(2)执行equals方法,如果为true则为重复元素,否则形成链表
-
TreeSet
实现了SortedSet接口,基于红黑树排列元素,通过Comparable接口指定排序规则,通过CompareTo方法确认是否为重复元素,所以该集合自定义元素必须实现Comparable接口并重写CompareTo方法
还有一种方法可以避免元素对接口的实现,即Comparator,定制比较器。实现方法如下:
TreeSet<Person> treeSet = new TreeSet<>(new Comparator<Person>(){ @Override public int compare(Person o1, Person o2) { //重写方法,o1和o2为比较双方 } });
Map集合体系
存储任意键——值(Key——Value)对儿
-
Map父接口
常用方法
V put(K key,V value) //将对象存入到集合中,关联键值。key重复则覆盖原值。 0bject get (Object key) //根据键获取对应的值。 keySet() //返回所有的key Collection<V> values()//返回包含所有值的Collection集合 Set<Map.Entry<K, V>> //键值匹配的Set集合
Map集合元素不允许重复,当有一个key值重复的元素加入时,如果Value值不同,则更新Key对应的Value,如果Value值相同则不加入
-
HashMap
HashMap的判重方式和HashSet类似,如果需要比较对象元素内容,则需要重写hashCode和equals方法
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//hashMap初始容量大小 static final int MAXIMUM_CAPACITY = 1 << 30;//hashmap的数组最大容量 static final float DEFAULT_L0AD_FACTOR = 0.75f; //默认加载因子 static final int TREEIFY_THRESHOLD = 8;//jdk1.8 当链表长度大于8时,调整成红黑数 static final int UNTREEIFY_THRESHOLD = 6; //jdk1.8 当链表长度小于6时,调整成链表 static final int MIN_TREEIFY_CAPACITY = 64;// jdk1.8 当链表长度大于8时,并且集合元素个数大于等于64 时,调整成红黑数 transient Node<K, V>[] table;//哈 希表中的数组 size;//元素个数 //HashMap刚创建时,table是nu1l,为了节省空间,当添加第-一个元素时,table容量调整为16 //当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。 //jdk1.8当每个链表长度大于8,并且元素个数大于等于64时,会调整为红黑树,目的提高执行效率 //jdk1.8当链表长度小于6时,调整成链表 //jdk1.8以前,链表时头插入,jdk1 .8以后时是尾插入
-
Hashtable
-
TreeMap
和TreeSet类似,需要对象元素实现Comparable接口并重写CompareTo方法或者使用定制比较器conparator
-
Properties集合
与流相关的集合,设计了许多用来存储和加载流的方法
list(PrintWriter T);//流写入 store(FileOutputStream T,"注释");//集合保存 load(FileInputStream T)//流加载
Collections工具类
-
public static void reverse(List<?> list) //反转集合中元素的顺序 public static void shuffle(List<?> list) //随机重置集合元素的顺序 public static void sort(List<T> list) //升序排序(元素类型必须实现Comparable接口) static <T> void copy(List<? super T> dest, List<? extends T> src) //将src集合copy到dest集合中,dest集合的大小必须等于src集合