黑马程序元----集合框架

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

这里写图片描述

常用集合类
常用集合类

Collection:表示一组对象,这些对象也称为 collection 的元素。
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

集合与数组的比较:
1.数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
2.数组中可以存储任意数据类型,集合只能存储对象。

int i=10;
List list=new ArrayList();
list.add(i);
  list.get(0).getClass();
//而i是基本数据类型,i.getClass()编译不通过,说明将i加到list中是有自动装箱

Iterator:Collection实现的Iterable接口,能够通过 iterator() 方法获得以一个迭代器 Iterator对象,而 Iterator提供了一下方法供操作元素。
这里写图片描述

public class Demo1 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        Iterator iterator=list.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+":");
        }
    }
}

输出1:2:3:4:5:6:

foreach:而实现Iterable的类对象可通过foreach语句迭代容器内的元素。

public class Demo1 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        for (Object object : list) {
            System.out.print(object+":");
        }
    }
}

输出结果1:2:3:4:5:6:

ListIterator:Iterator子接口,专门输出List中的元素;

Set无法记住添加的顺序,不允许包含重复的元素。
判断两个对象是否相等用equals,而不是使用==。也就是说两个对象equals比较返回true,Set集合是不会接受这个两个对象的。
常用子类:
HashSet:散列存放
HashSet类是Set接口最常用的实现类,采用hash算法存储数据,具有良好的存储和查找功能。散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;线程不安全的,多个线程访问一个HashSet要使用同步代码;HashSet集合元素值允许是null,但是最多只能有一个;

hash(翻译为哈希,或散列)算法的功能:
保证通过一个对象快速找到另一个对象;
其算法价值体现在速度,可以保证查询快速执行;
当从HashSet中访问元素时,HashSet先计算该元素的hashCode(也就是该对象的hashCode方法返回值),然后直接到该HashCode对应的位置取出该元素;
在这里对象的hashCode就好比是数组里的索引,但是不是索引;

当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加的对象的hashCode值一致:若不一致:直接添加进去;若一致,再进行equals方法比较,equals方法如果返回true,表明对象已经添加进去了,就不会再添加新的对象了,否则添加进去;如果我们重写了equals方法,也要重写hashCode方法,反之亦然;。HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。如果需要某个类的对象保存到HashSet集合中,覆写该类的equals()和hashCode()方法,应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。

不同类型取得hashCode的方法引用块内容

TreeSet:有序存放,使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序;TreeSet(Comparator<? super E> comparator) 参与排序的元素必须是同一类型的,不然会发生ClassCastException异常; 。
TreeSet是SortedSet 接口唯一的实现,与HashSet相比额外的方法有
Comparator comparator():返回当前Set使用的Comparator,若返回null,表示以自然顺序排序。
Object first()Object last()
SortedSet subSet(Object fromElement, E toElement) 返回此 set 的部子集,其元素从 fromElement(包括)到 toElement(不包括)。
SortedSet headSet(Object toElement)返回此 set 的部分子集,其元素严格小于 toElement。
SortedSet tailSet(Object fromElement) 返回此 set 的部分子集,其元素大于等于 fromElement。
自然排序:元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int compareTo(Object o)方法;
=========================
List是有序的集合,集合中每个元素都有对应的顺序序列。List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加顺序设置元素的索引,比如第一个元素的索引就是0,好似数组。
由于是有序集合,因此能按照脚标顺序操作元素。

void add(int index,Object e);boolean addAll(int index,Collection c);Object get(int index);int indexOf(Object o);int lastIndexOf(object o);Object remove(int index);Object set(int index,Object e);List subList(int fromIndex,int toIndex)。

ListIterator:Iterator的子接口,专门用于操作List集合的输出。
支持双向输出:

boolean hasPrevious():返回该迭代器关联集合是否还有上一个元素;
Object previous():返回该迭代器的上一个元素;

常用实现类:
Vector:线程安全,但速度慢,已被ArrayList替代。
ArrayList*线程不安全,查询速度快。***List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。

public class ArrayListDemo1 {

    public static void main(String[] args) {
        List list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        ListIterator i = list.listIterator();
        //list.remove(0);此行代替后面两行会报错ConcurrentModificationException
        i.next();
        i.remove();
        while(i.hasNext()){
            System.out.println(i.next());
        }
    }
}

ArrayList是线程不安全的,而Vector是线程安全的,但是即使这样,也不推荐使用Vector,因为Collections有方法可以得到线程安全的ArrayList对象;
Collections类: List list = Collections.synchronizedList(new ArrayList(…)); 返回指定列表支持的同步(线程安全的)列表。

LinkedList:链表结构,增删速度快。
Queue接口:模拟队列,先进先出(FIFO),被LinkedList实现,提供一下方法。

void add(Object e):将e插入到队列尾部;
Object element():获取队列头部的元素;
boolean offer(Object e):将e插入到队列的尾部,当使用有容量限制的队列时,此方法比add(Object e)方法更好。
Object peek():获取队列头部的元素。如果此双端队列为空,则返回 nullObject poll():获取并删除队列头部的元素。如果此双端队列为空,则返回 nullObject remove():获取并删除队列头部的元素。

LinkedList接口继承了Deque接口,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。被LinkedList实现。
提供方法:

void addFirst(Object e):把元素插入到该双向队列的开头;
void addLast(Object e):把该元素插入到该双向队列的末尾。
Object getFirst():获取但不删除队列第一个元素;
Object getLast():获取但不删除队列最后一个元素;
boolean offerFirst(Object e):将指定的元素插入到该双向队列的开头;
boolean offerLast(Object e):将指定元素插入到双向队列的末尾;
Object removeFirst():删除第一个元素
Object removeLast():删除最后一个元素

LinkedList提供方法

Object peekFirst():获取但不删除队列第一个元素,如队列为null,返回null;
Object peekLast():获取但不删除队列最后一个元素,如队列为null,返回null;
Object pollFirst():获取并删除队列第一个元素,如队列为null,返回null;
Object pollLast():获取并删除队列最后一个元素,如队列为null,返回null;
Object  pop():从此双端队列所表示的堆栈中弹出一个元素。
void push(Object e):将e推入进该队列栈中。
Object removeFirst():获取并删除队列第一个元素。
Object removeFirstOccurrence(Object o):删除队列第一次出现的o元素;
removeLast():获取并删除队列最后一个元素;
removeLastOccurrence(Object o):删除队列中最后一次出现的o元素;

Map
映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是value。Map里的key不允许重复。通过key总能找到唯一的value与之对应。常用方法:

Set keySet():返回该Map中所有key所组成的Set集合;
Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;
void putAll(Map m):将m中的key-value赋值到调用该方法的Map对象中;
Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,若key不存在,返回null;
int size():返回该Map里面key-value对的个数;
Collection values():返回Map里所有value组成的Collection。

Map.Entry是Map接口的内部接口,用于封装key- value,有3个方法:

Object getKey();返回Entry里包含的keyObject getValue();返回Entry里包含的value值
Object setValue(Object value):设置Entry里包含的value值,并返回新设置的value值;

Map集合本身并不能直接为Iterator实例化,如果此时非要使用Iterator输出Map集合中内容的话,则要采用如下的步骤:
方法一:
1.通过entrySet方法变成Set对象
2.调用Set的Iterator方法,此时每个Iterator对象是Map.Entry对象
3.对Map.Entry分离出 key - value
方法二:
1.通过keySet得到Map集合多有key的Set集合
2.调用Set的Iterator方法,此时每个Iterator对象是key值
3.通过Map的getValue(key)得到value值

HashMap:线程不安全,速度快,允许存放null键,null值。类中的key都属于无序存放的(HashMap里的key存储和保存HashSet里面的元素一致)。

可用此方法包装HashMap,以保证线程安全
Collections类: public static  Map synchronizedMap(Map m)来返回线程同步的映射;

TreeMap:对key进行排序,排序原理与TreeSet相同。key本身也是对象,那么对象所在的类就必须实现Comparable接口,key不能为null,value可以是 null。

Properties:Hashtable子类;Properties类的主要功能是用于操作属性,在各个语言(包括操作系统)都会存在着许多的配置文件。所有的属性文件中的属性都是按照“key=value”的形式保存的,而且保存的内容都是String(字符串)。
常用方法

public Object setProperty(String key,String value):设置属性;
public String getProperty(String key):根据属性的名字取得属性的内容,如果没有返回null结果;
public String getProperty(String key,String defaultValue):根据属性的名字取得属性内容,如果没有则返回默认值(defaultValue);
void load(InputStream/Reader inStream) 
void loadFromXML(InputStream in) 
public void list(PrintStream out):从一个输出流中显示所有的属性内容;
public void store(OutputStream/Writer out, String comments)
public void storeToXML(OutputStream os, String comment)  

实例代码:

public class PropertiesDemo {

    public static void main(String[] args) throws IOException {
        Properties p = new Properties();
        p.load(PropertiesDemo.class.getClassLoader().getResourceAsStream("a.properties"));
        System.out.println(p.getProperty("name"));
    }
}
根目录创建“a.properties”文件,内容为
name = Tom
gerder = man

打印结果
Tom

Collections:操作集合的工具类
提供了对集合进行包装的一系列以synchronized为方法名开始的方法,使其变为线程。
其他常用方法:

static void reverse(List list):反转指定List集合中的顺序;
static void shuffle(List list):对集合元素随机排序
static void sort(List list):自然升序排序
static vois swap(List list,int i, int j):将指定的List集合i处元素和j处元素进行交换;
static void rotate(List list, int distance):
    若distance为正数,将list集合后的distance个元素移到前面;
    当distance为负数,将list集合前的distance个元素移到后面;
static  int binarySearch(List list, Object key) 使用二分搜索法搜索指定列表,以获得指定对象。 
调用之前 必须调用 Collections.sort(List list)(完成自然排序);
static Object max(Collection coll) 根据元素的自然顺序,返回给定 collection 的最大元素。   
static Object min(Collection coll) 根据元素的自然顺序,返回给定 collection 的最小元素。       
static  void fill(List list, Object obj)  使用指定元素替换指定列表中的所有元素。
static int frequency(Collection c, Object o)  返回指定 collection 中等于指定对象的元素数。 
static int indexOfSubList(Listsource, List target) 返回指定源列表中第一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1static int lastIndexOfSubList(List source, List target)  返回指定源列表中最后一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1static boolean  replaceAll(List list, Object oldVal, Object newVal)  使用另一个值替换列表中出现的所有某一指定值。

Arrays此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。

public static List asList(Object… a)返回一个受指定数组支持的固定大小的列表(返回的是不可变的List(长度固定))。
(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:
List list= Arrays.asList(“Larry”, “Moe”, “Curly”);
list.add(“Will”);×

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值