黑马程序员——java 集合

来源:互联网 发布:怎么禁止mac休眠 编辑:程序博客网 时间:2024/05/19 13:08

 ——- android培训、java培训、期待与您交流! ———-

Collection接口:

Collection 接口是List和Set的父接口List 接口存储一组允许重复,有序(插入顺序)的对象Set 接口存储一组唯一,无序的对象 

List接口:

List 接口存储一组允许重复,有序(插入顺序)的对象(包括null),可以通过索引(下标)来进行访问存储(添加)boolean add(Object o)   继承自Collectionvoid add (int index,Object o)     加塞儿专用替换set(int index,Object o)删除remove(Object o)  继承自Collectionremove(int index)void clear()  继承自Collection判断boolean contains(Object o)   继承自Collection    思考:内部怎么实现?boolean isEmpty()   继承自Collectionint indexOf(Object o)int lastIndexOf(Object o)获取int size()   继承自Collection    集合中存了多少个数据    相当于数组.lengthObject get(int index)    相当于arr[i]Object[] toArray()    继承自Collection

List接口常用实现类:

Vector(向量列表):底层数据结构是动态的数组结构,线程安全,无论增删还是查询都非常慢。默认初始容量为10,增量为10。ArrayList(线性列表):底层数据结构是动态的数组结构,线程不安全,增删的效率很慢(因为要移动数据),但是随机查询的效率很高。默认初始容量为10,增量未指定(经调试发现:原容量的50%)。LinkedList(链式列表):底层是链表数据结构,线程不安全,对元素的增删的操作效率很高,随机查询的效率低(因为要移动指针寻址)。默认初始容量为0,增量不明确。

Vector:

构造方法:public Vector()public Vector(int initialCapacity)public Vector(int initialCapacity,int capacityIncrement)其他常用方法来自List接口

ArrayList:

构造方法:public ArrayList()public ArrayList(int initialCapacity)其他常用方法来自List接口

LinkedList:

构造方法public LinkedList()独有方法:public void addFirst(Object e)   相当于add(0, e)public void addLast(Object e)   相当于add(e)public Object getFirst()  相当于get(0)public Object getLast()  相当于get(al.size()-1)public Object removeFirst()   相当于remove(0)public Object removeLast()   相当于remove(al.size()-1) 
//--------------测试效率(加塞操作)-----------------ArrayList al=new ArrayList();long begin=System.currentTimeMillis();for (int i = 0; i < 200000; i++) {              al.add(0,"1");}long end=System.currentTimeMillis();System.out.println(end-begin);

泛型:

集合可以存储任意类型的对象,因此在从集合中取出这些对象时需要强转,但如果存储的不是同一种类型,取出对象时怎么强转?这就是类型安全问题泛型即(Generic type),是Java 5新加入的特性,它只能用于引用数据类型(基本数据类型使用包装类),用来解决类型安全问题,怎么解决?泛型的本质是类型参数化,即让类型“任意化”,就是在定义(类型的定义,方法的定义,参数的定义,成员变量的定义等等)的时候,设置它的类型可变,也就是数据类型可以是任意的类型
public class FanxingLei<T> {    private T name1;    private Object name2;    public void  setName1(T name) {    }    public T getName1(){           return name1;    }    public void  setName2(Object name) {    }    public Object getName2(){            return name2;    }}
FanxingLei fLei=new FanxingLei();fLei.setName2(new Student("a", 20));fLei.setName2("abc");Student temp=(Student)fLei.getName2();FanxingLei<Student> fLei2=new FanxingLei<Student>();fLei2.setName1(new Student("a", 20));//fLei2.setName1("abc");temp=fLei2.getName1();

Set接口:

Set 接口存储一组唯一,无序的对象唯一:Set集合中不允许出现重复的元素,如果向Set集合中存储重复的元素是无效的,但不会报错无序:Set集合不会维护集合中元素的插入顺序,也不存在下标或索引Set接口中没有自有方法,全部继承自Collection接口,可查阅帮助文档进行使用

Set接口常用实现类:

HashSet是无序的吗?是唯一的吗?往Set集合中存储对象时,Java如何判断集合中是否已存在该对象?遍历集合、逐个用equals比较?可行吗?效率怎么样?    先判断hashCode,不相等就添加;如果相等则判断equals,不相等就添加HashSet采用哈希(散列)数据结构来存储对象,大大提高查询效率。不保证线程安全

Set接口常用实现类:

TreeSet无序、唯一以树形结构(平衡二叉树)存储,访问或遍历的速度快,默认按自然顺序进行存储是自然顺序作为遍历顺序吗?不保证线程安全自有方法:public Object ceiling(Object e)public Object floor(Object e)public Object first()public Object last()public Object higher(Object e)public Object lower(Object e)

Java集合迭代器:

ArrayList<String> al=new ArrayList<>();Iterator<String> it=al.iterator();while(it.hasNext()){    String temp=it.next();    System.out.println(temp);}HashSet<String> hs=new HashSet<>();Iterator<String> itt=hs.iterator();while(itt.hasNext()){    System.out.println(itt.next());}

迭代器设计模式:

迭代器是一种设计模式,可以遍历某容器(集合)。自定义一个集合类通过数组模拟迭代器设计模式(画结构图)Java集合中的迭代器如何设计?java.lang.Iterable接口Iterator<T> iterator()       返回一个迭代器,相当于一个导游java.util.Iterator接口boolean hasNext()     还有没有下一个E next()    获得下一个void remove()   用来解决ConcurrentModificationException(并发修改异常)可以查阅ArrayList和HashSet的源码进行了解迭代器也支持泛型

Map接口:

Map是比较特殊的集合,也叫映射,它一次存储两个数据(一个键值对,Entry)。键(key)和值(value)可以是任何类型,键不允许重复,值允许重复。一个键有且只能对应一个值。存储V put(K key, V value)       键如果重复会覆盖值删除void clear()V remove(Object key)      根据键删除键值对儿判断boolean containsKey(Object key)   先判断hashCode  然后判断equalsboolean containsValue(Object value)    判断equalsboolean isEmpty()获取V get(Object key)  根据键得到对应的值int size()Set<K>  keySet()Collection<V>  values()Set<Map.Entry<K,V>> entrySet()   

Map接口常用实现类:

HashMap,基于哈希表结构的Map实现,允许使用null值和null键,不保证顺序,不保证线程安全。构造方法    public HashMap(),构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空HashMap对象。其他方法来自Map接口LinkedHashMap,基于哈希表和链表结构的Map实现,允许使用null值和null键,维护插入顺序做为遍历顺序,不保证线程安全。构造方法    public LinkedHashMap(),构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空LinkedHashMap对象。其他方法来自Map接口

Map接口常用实现类:

TreeMap,基于平衡二叉树结构的Map实现,不允许null键,允许null值。根据其键的自然顺序进行排序。不保证线程安全。构造方法:    public TreeMap(),使用键的自然顺序构造一个空的对象。自有方法:    public Map.Entry<K,V> ceilingEntry(K key)    public K ceilingKey(K key)    public Map.Entry<K,V> firstEntry()    public K firstKey()    public Map.Entry<K,V> lastEntry()    public K lastKey()    public Map.Entry<K,V> higherEntry(K key)    public K higherKey(K key)    public Map.Entry<K,V> lowerEntry(K key)    public K lowerKey(K key)

Map的迭代器:

如果只遍历所有的键,Set<K> keySet()如果只遍历所有的值,Collection<V> values()如果想成对儿遍历,能用foreach或昨天的迭代器直接对Map集合进行遍历吗?如果想成对儿遍历,有如下两种方式:方式一:获得所有的key,然后根据key找到value (上午已讲)方式二:Map.Entry接口,用于获取键值对的集合K getKey()返回与此项对应的键。V getValue()返回与此项对应的值。

 ——- android培训、java培训、期待与您交流! ———-

0 0