标题:java的集合
作者:网友
日期:2019-11-06 06:41:54
内容:

1、集合时存储对象的最常用的方式。 2、集合类的特点:集合只用于存储对象,集合的长度是可变的(这是不同与数组的,数组的长度是不变的),集合可以存储不同类型的对象 3、集合框架的顶层是Collection接口,这是一个根接口,该接口中具有的共性功能包括 (1)添加元素 boolean add(Object obj) (2)删除元素 void clear() boolean remove(Object obj) boolean removeAll(Collection c)//将原集合去掉原集合与集合c相同的元素 (3)获取长度 int size() (4)判断 boolean isEmpty() boolean contains(Object obj) boolean contaisAll(Collection c) (5)将集合转成数组 toArray() toArray([]) (6)遍历集合元素 Iterator iterator()//获取集合中元素上迭代功能的迭代器对象 4、常用的两个集合list和set |—–List(子接口):有序的(存入的顺序和取出的顺序一致),有索引。使用频率很高,允许重复元素 List接口中的特有方法: add(index,element) remove(index) set(index,newelement) indexOf(element) get(index) List集合具体子类(数据结构不同): |—Vector:数据结构是数组,且数组是可变长度的,线程同步的。 |—ArrayList:数据结构是数组,且数组是可变长度的,线程不同步的。优点是查询速度快,缺点是增删速度慢 |—LinkedList:链表结构,线程不同步,优点是增删速度快,缺点是查询速度慢 特有方法: addFirst(Object obj) removeFirst(Object obj)//返回被去掉的第一个对象 如何通过LinkedList实现一个堆栈或者队列数据结构

PRivate LinkedList link; MyQueue(){ link = new LinkedList(); } public Object myAdd(Object obj){ link.addFisrt(obj); } public Object myGet(){ return link.removeLast(); } public boolean isNull(){ return link.isEmpty(); } }public static void main(String[] args){ MyQueue queue = new MyQueue(); queue.myAdd("aaa"); queue.myAdd("bbb"); queue.myAdd("ccc"); queue.myAdd("ddd"); while(!queue.isNull()){ system.out.println(queue.myGet()); } }

|—–set:不允许重复元素(最大的区别) |—HashSet:不保证存取的顺序,不允许存储重复元素,比数组查 询的效率高;该集合的数据结构是哈希表结构(散列表结构) 通过哈希算法算出的哈希值相同的情况就是哈希冲突,这种情况下,做进一步的判断是否存入的数据相同(equals方法), |—TreeSet:不保证有序,同时使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。注意:自定义对象的时候,要让对象实现Comparable接口。 TreeSet的比较器:元素本身具备的比较功能是自然排序,如果不需要自然排序,需要自定义排序方式,而且存储的TreeSet中的元素可能不具备比较功能。在这种情况下,可以使集合具备比较功能。 Set set = new TreeSet(new ComparatorByName);//初始化TreeSet集合时,明确一个比较器,自定义的比较器ComparatorByName实现了comparator接口,覆盖了compare方法。 4、JDK1.5之后collection接口继承了Iterable接口,这样实现了接口的集合对象就可以使用foreach语句。 增强for循环:用于遍历collection集合或者数组 格式:for(元素类型 变量 : collection或数组)

Collection coll = new ArrayList();coll.add("1");coll.add("2");coll.add("3");coll.add("4");for(Object obj : coll){System.out.println(obj);}

5、Enumeration:取出元素的一种方式,枚举,只有Vector容器具备枚举的取出方式。 6、集合的泛型 为了运行时期不出现类型异常,可以在定义集合时就明确集合中元素的类型,API中List后面的<E>就是指元素类型。 这里写图片描述

List<String> list = new ArrayList<String>()

在JDK1.4版本之前,集合中任何类型的对象都可以存储,在取出元素时,需要用到对象的特有内容时,需要做向下转型,但是对象的类型不一致,就会导致向下转型发生classcastexception异常。 JDK1.5之后,在定义集合时,就直接明确集合中存储元素的具体类型,这样编译器在编译时就可以对集合中存储的对象类型进行检查,一旦发现类型不匹配,就会编译失败,这个技术就是泛型技术。也就是说泛型其实就是编译时期的一种安全机制。 (1)泛型的擦除:编译器通过泛型对元素类型进行检查,检查通过之后生成的class文件中,就将泛型标识去掉了。也就是加不加泛型,生成的class文件是相同的。 (2)静态方法无法访问类上定义的泛型的。如果静态方法需要定义泛型,泛型只能定义在方法上。 7、接口 Map<K,V> Map是双列集合,一次存一对对象,也就是键值对。要保证键的唯一性。 没有继承Iterable接口,无法用迭代器遍历。 (1)添加元素 V put(K key,V value) (2)遍历元素 Set<K> keySet()—>返回此映射中包含的键的 Set集合 将指定的值,在用迭代器遍历该set集合 Set<Map.Entry<K,V>> entrySet()—>返回此映射中包含的映射关系的 Set 集合 Collection<V> values()—>返回此映射中包含的值的 Collection 集合。该集合元素是可以重复的,因为值是可以重复的。 |—–HashTable:数据结构是哈希表,是同步的。不允许null键和null值。 |—–HashMap:数据结构是哈希表,是不同步的。允许null键和null值。(特别注意HashMap和HashTable的区别) |—–TreeMap:数据结构是二叉树,不同步。可以对map集合中的键进行排序。 |—–LinkedHashMap



返回列表 网站首页