Collection框架及List集合

集合:Collection

  • Collection是集合的顶级父类:是一个接口,其下又两个子类:List和Set。
  1. List:元素可重复,List都是有序的。
  2. Set:元素不可重复,Set大部分是无序的。
  • Collection常用方法
方法 说明
int size(); 返回包含对象的个数
boolean isEmpty(); 返回是否为空
boolean contains(Object o); 判断是否包含指定对象
void clear(); 清空集合
boolean add(E e); 向集合中添加对象
boolean remove(Object o); 从集合中删除对象
boolean addAll(Collection<?extends E> c); 将另一集合中的所有元素添加到集合中
boolean removeAll(Collection<?> c); 删除集合中与另外一个集合中相同的全部元素
Iterator<E> iterator(); 返回该集合的对应的迭代器

List

  • List:可重复集的父接口,是Collection的子接口,用于定义线性表数据结构;可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。
  • List接口的两个常用的实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。
  • 可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问而LinkedList更适合插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别。


    QQ图片20180228184228.png
import java.util.ArrayList;
import java.util.List;
/**
 * List(线性表)
 * List本身不能实例化!我们可以使用其几个子类实现
 */
public class ListTest {
    public static void main(String[] args) {
        /**
         * 创建一个ArrayList实例
         * 使用List我们不需要在创建的时候考虑容量。
         * 集合的容量是根据其所保存的元素决定的。
         * 换句话说,集合的容量是可以自动扩充的。
         */
        List list = new ArrayList();//多态的写法,推荐使用
        //ArrayList list = new ArrayList();正常的写法
        /**
         * add方法,向集合末尾追加一个新元素
         * add(Object obj)
         * 从改方法的参数定义不难看出,集合可以存放任意类型的元素,
         * 但在实际编程中我们发现,几乎不会向集合中存放一种以上不同
         * 类型的元素。
         */
        list.add("One");//向集合中添加一个字符串。
        list.add("Two");
        list.add("Three");
        //不建议这样操作!尽量不在同一个集合中存放不同类型元素
        //list.add(1);
        /**
         * ArrayList同样重新了toString()方法。
         * 返回的是每个元素的toString()返回值的序列
         * System.out.println()方法默认会调用对象的toString()方法
         */
        System.out.println(list);//[One, Two, Three]
        /**
         * contains(Object obj)方法检测给定对象是否被包含在集合中
         * 检测规则是将obj对象与集合中每个元素进行equals比较
         * 若equals返回true,则改方法返回true。
         * 若比对了所以元素均没有equals为true的则返回false
         * 被存放元素的equals方法在集合中决定的事情还很多!
         * 是否重写元素的equals方法对集合的操作结果有很大的效果不同。
         */
        System.out.println(list.contains("One"));//true
        list.remove("One");
        System.out.println(list);//[Two, Three]
        list.clear();//清空集合
        System.out.println(list);//[]
        List list1 = new ArrayList();
        List list2 = new ArrayList();
        List list3 = new ArrayList();
        //为第一个集合添加元素
        list1.add("One");
        list1.add("Two");
        list1.add("Three");
        //为第二个集合添加元素
        list2.add("Four");
        list2.add("Five");
        //为第三个集合添加元素
        list3.add("One");
        /**
         * 将集合2的所有元素放到集合1中
         * 集合的addAll(Collection c)
         * 该方法运行将c对应的集合中的所有元素存入该集合
         * 注意,这里的参数为Collection,所有换句话说,任何集合
         * 类型都可以将其元素存入其它集合中!
         */
        list1.addAll(list2);
        list1.addAll(list3);
        System.out.println(list1);//[One, Two, Three, Four, Five, One]
        //从list1中删除list3中相同(equals为true的)的元素
        list1.removeAll(list3);
        System.out.println(list1);//[Two, Three, Four, Five]
        //保留list1中与list3中相同(equals为true)的元素
        list1.retainAll(list2);//list1和list2取交集
        System.out.println(list1);//[Four, Five]
        /**
         * 想获取集合中的元素我们可以使用get()方法
         * Object get(int index);
         * 根据元素下标获取对应位置的元素并返回
         * 这里元素下标和数组相似。
         */
        //因为get方法是以Object类型返回的元素,所有需要转型
        String element = (String) list1.get(0);//获取第一个元素
        System.out.println(element);//Four
        //遍历集合
        for (int i = 0; i < list1.size(); i++) {
            System.out.println(list1.get(i));
        }
        /*
        * set方法,用于修改集合中的元素
        * Object set(int index,Object newElement);
        * 将index位置的元素修改为newElement,修改后会将被修改的元素返回。
        */
        Object old = list1.set(0,"四");
        System.out.println("被替换的元素:"+old);//被替换的元素:Four
        System.out.println(list1);//[四, Five]
        /**
         * 向集合中插入一个元素
         * add(int index,Object newElement);
         * 使用add的重载方法,我们可以向index指定位置插入newElement
         * 原位置的元素自动向后移动
         * 所谓的“插队”
         */
        list1.add(1,"4.5");
        System.out.println(list1);//[四, 4.5, Five]
        /**
         * 根据下标删除元素
         * Object remove(int index)
         * 将集合中下标为index的元素删除,并将被删除的元素返回
         * boolean remove(Object obj)//这个方法删除equals方法返回true的对象后,返回true,否则返回false
         */
        Object obj = list1.remove(2);
        System.out.println("被删除的元素:"+obj);//被删除的元素:Five
        System.out.println(list1);//[四, 4.5]
        list1.add("4.5");
        list1.add("4.5");
        System.out.println(list1);//[四, 4.5, 4.5, 4.5]
        System.out.println(list1.indexOf("4.5"));//1
        System.out.println(list1.lastIndexOf("4.5"));//3
        /**
         * 如何将一个集合转换为数组?
         * Object[] toArray()
         * 该方法会将集合以对象数组的形式返回
         */
        Object[] array = list1.toArray();
        /**
         * toArray的重载方法,可以很方便的让我们装换出实际的数组类型;
         * 参数的作用是作为返回数组的类型,所有参数传入的数组不需要
         * 任何的长度,因为用不到,就没必要浪费空间
         */
        String[] array1 = (String[]) list1.toArray(new String[0]);
        /**
         * 泛型定义基本类型时使用其包装类
         */
        List<Integer> list4 = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list4.add(i);
        }
        System.out.println(list4);//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        //取子集(3-7)
        List<Integer> subList = list4.subList(3,8);//含头不含尾
        System.out.println(subList);//[3, 4, 5, 6, 7]
        /**
         * 若我们对自己的元素进行修改会不会影响原来的集合?
         * 注意,我们在获取子集后,若对自己元素进行修改,会影响
         * 原来的集合元素。
         */
        for (int i = 0; i < subList.size(); i++) {
            subList.set(i,subList.get(i)*10);
        }
        System.out.println(subList);//[30, 40, 50, 60, 70]
        System.out.println(list4);//[0, 1, 2, 30, 40, 50, 60, 70, 8, 9]
    }
}

迭代器

  • 所有Collection的实现类都实现了其iterator方法,该方法返回一个Iterator接口类型对象,用于实现对集合元素的迭代遍历。Iterator定义有三个方法:
  1. boolean hasNext();判断指针后面是否有元素
  2. next();指针后移,返回当前元素
  3. void remove(); 在原集合中删除刚刚返回的元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * 迭代器
 * 用于遍历集合中的元素使用
 */
public class IteratorTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("1");
        list.add("#");
        list.add("2");
        list.add("#");
        list.add("3");
        list.add("#");
        /*
        * iterator()方法
        * 改方法会返回一个Iterator的实现类实例,用于遍历当前集合
        * Iterator在java.util包下
        * 其是一个接口,定义了遍历器应有的方法
        * 不同集合返回的Iterator不都是同一个子类实现
        * 了解即可。
        * 迭代器的使用方式:先问后拿
        * 问:boolean hasNext()该方法询问迭代器当前集合是否还有元素。
        * 拿:Object next()该方法会获取当前元素。
        * 迭代器的迭代方法是为while循环量身定制的
        */
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){ //集合中是否还有下一个元素
            Object element = iterator.next();//有就将其取出
            /**
             * 在迭代器迭代的过程中,我们不能通过集合的增删改等操作
             * 来改变集合的元素数量!否则会引发迭代异常!
             * 若想删除迭代出来的元素,只能通过Iterator
             */
            if ("#".equals(element)){
                //list.remove(element);//不可以这样修改集合,会引发迭代异常
                /**
                 * 迭代器的remove()方法可以将刚刚获取的元素删除,
                 * 但是不能重复调用两次,因为你remove一次之后
                 * 当前元素已经不存在了,再次remove肯定会报错
                 */
                iterator.remove();//删除当前位置的元素
            }
            System.out.println(element);
        }
        System.out.println(list);
    }
}

For-Each循环

java1.5的另一个特性:新循环(增强for循环)新循环的作用是专为遍历数组和集合使用的。
for(ElementType element:ArrayOrCollection){
...
}
遍历数组或集合,将每一个元素依次赋值给element后进入循环体。直到所有元素均被迭代完毕后退出循环。

import java.util.ArrayList;
import java.util.List;
/**
 * For-Each循环
 */
public class ForEach {
    public static void main(String[] args) {
        //和常规for循环在遍历数组上的差异
        int[] array = new int[]{1,2,3,4,5,6,7};
        /**
         * 常规循环:
         *      自己维护循环次数
         *      循环体从自行维护获取元素的方式
         */
        for (int i = 0; i < array.length; i++) { //维护循环次数
            int element = array[i];//获取数组元素
            System.out.println(element);
        }
        /*
        * For-Each循环
        *       自动维护循环次数(由遍历的数组或集合的长度决定)
        *       自动获取每次迭代的元素
        * 该循环执行流程:
        *       遍历数组array中每个元素,将元素依次赋值给element
        *       后进入循环体,直到所有元素均被迭代完毕后退出循环
        * 注意事项:
        *       使用该循环,element的类型应与循环迭代的数组或集合
        *       中的元素类型一致!至少要是兼容类型。
        * 这个循环的内部实现是使用迭代器Iterator完成的。
        */
        for(int element : array){
            System.out.println(element);
        }
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        /**
         * 使用ForEach循环来遍历集合
         * 注意:
         *      集合若使用ForEach,应该为其定义泛型,否则我们只能
         *      使用Object作为接收元素
         */
        for (String element : list){
            System.out.println(element);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位...
    聂叼叼阅读 491评论 0 2
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    Oneisall_81a5阅读 901评论 0 11
  • 集合类简介 为什么出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进...
    阿敏其人阅读 1,417评论 0 7
  • 一、查看重复依赖 如果出现重复依赖一般会出现以下错误: Error:Execution failedfortask...
    格老子阅读 9,703评论 0 1
  • 亲爱的妹妹,你好! 当哥的一直以来都想为你做点什么,可是如今的状况想必你也知晓,哥的能力目前有限,一直都愧对于你,...
    肖先生肖军阅读 324评论 0 0