Java基础(02)-15总结对象数组,集合Collection,集合List

3:集合(List)(掌握)

(1)List是Collection的子接口

特点:有序(存储顺序和取出顺序一致),可重复。

package cn.itcast_01;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
/*
 * 需求:List集合存储字符串并遍历。
 */
public class ListDemo {
 public static void main(String[] args) {
 // 创建集合对象
 List list = new ArrayList();
 // 创建字符串并添加字符串
 list.add("hello");
 list.add("world");
 list.add("java");
 // 遍历集合
 Iterator it = list.iterator();
 while (it.hasNext()) {
 // 向下转型
 String s = (String) it.next();
 System.out.println(s);
 }
 }
}
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
 * List集合的特点:
 *  有序(存储和取出的元素一致),可重复的。
 */
public class ListDemo2 {
 public static void main(String[] args) {
 // 创建集合对象
 List list = new ArrayList();
 // 存储元素
 list.add("hello");
 list.add("world");
 list.add("java");
 list.add("javaee");
 list.add("android");
 list.add("javaee");
 list.add("android");
 // 遍历集合
 Iterator it = list.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 System.out.println(s);
 }
 }
}
                       学生类遍历:
package cn.itcast_02;
public class Student {
 // 成员变量
 private String name;
 private int age;
 // 构造方法
 public Student() {
 super();
 }
 public Student(String name, int age) {
 super();
 this.name = name;
 this.age = age;
 }
 // 成员方法
 // getXxx()/setXxx()
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
}
package cn.itcast_02;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
 * 存储自定义对象并遍历
 */
public class ListDemo {
 public static void main(String[] args) {
 // 创建集合对象
 List list = new ArrayList();
 // 创建学生对象
 Student s1 = new Student("白骨精", 30);
 Student s2 = new Student("蜘蛛精", 40);
 Student s3 = new Student("观音姐姐", 22);
 // 把学生对象添加到集合对象中
 list.add(s1);
 list.add(s2);
 list.add(s3);
 // 遍历
 Iterator it = list.iterator();
 while (it.hasNext()) {
 Student s = (Student) it.next();
 System.out.println(s.getName() + "---" + s.getAge());
 }
 }
}

(2)List的特有功能:(自己补齐)

A:添加功能

B:删除功能

C:获取功能

D:迭代器功能

E:修改功能

package cn.itcast_03;
import java.util.ArrayList;
import java.util.List;
/*
 * List集合的特有功能:
 * A:添加功能
 *  void add(int index,Object element):在指定位置添加元素
 * B:获取功能
 *  Object get(int index):获取指定位置的元素
 * C:列表迭代器
 *  ListIterator listIterator():List集合特有的迭代器
 * D:删除功能
 *  Object remove(int index):根据索引删除元素,返回被删除的元素
 * E:修改功能
 *  Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
 */
public class ListDemo {
 public static void main(String[] args) {
 // 创建集合对象
 List list = new ArrayList();
 // 添加元素
 list.add("hello");
 list.add("world");
 list.add("java");
 // void add(int index,Object element):在指定位置添加元素
 // list.add(1, "android");//没有问题
 // IndexOutOfBoundsException
 // list.add(11, "javaee");//有问题
 // list.add(3, "javaee"); //没有问题
 // list.add(4, "javaee"); //有问题
 // Object get(int index):获取指定位置的元素
 // System.out.println("get:" + list.get(1));
 // IndexOutOfBoundsException
 // System.out.println("get:" + list.get(11));
 // Object remove(int index):根据索引删除元素,返回被删除的元素
 // System.out.println("remove:" + list.remove(1));
 // IndexOutOfBoundsException
 // System.out.println("remove:" + list.remove(11));
 // Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
 System.out.println("set:" + list.set(1, "javaee"));
 System.out.println("list:" + list);
 }
}

(3)List集合的特有遍历功能

A:由size()和get()结合。

B:代码演示

 //创建集合对象
 List list = new ArrayList();
 //创建并添加元素
 list.add("hello");
 list.add("world");
 list.add("java");
 //遍历集合
 Iterator it = list.iterator();
 while(it.hasNext()) {
 String s =(String) it.next();
 System.out.println(s);
 }
 System.out.println("----------");
 for(int x=0; x<list.size(); x++) {
 String s =(String) list.get(x);
 System.out.println(s);
 }
package cn.itcast_03;
import java.util.ArrayList;
import java.util.List;
/*
 * List集合的特有遍历功能:
 *  size()和get()方法结合使用
 */
public class ListDemo2 {
 public static void main(String[] args) {
 // 创建集合对象
 List list = new ArrayList();
 // 添加元素
 list.add("hello");
 list.add("world");
 list.add("java");
 // Object get(int index):获取指定位置的元素
 // System.out.println(list.get(0));
 // System.out.println(list.get(1));
 // System.out.println(list.get(2));
 // IndexOutOfBoundsException
 // System.out.println(list.get(3));
 // 用循环改进
 // for (int x = 0; x < 3; x++) {
 // System.out.println(list.get(x));
 // }
 // 如果元素过多,数起来就比较麻烦,所以我们使用集合的一个长度功能:size()
 // 最终的遍历方式就是:size()和get()
 for (int x = 0; x < list.size(); x++) {
 // System.out.println(list.get(x));
 String s = (String) list.get(x);
 System.out.println(s);
 }
 }
}

C:普通for循环

package cn.itcast_03;
public class Student {
 // 成员变量
 private String name;
 private int age;
 // 构造方法
 public Student() {
 super();
 }
 public Student(String name, int age) {
 super();
 this.name = name;
 this.age = age;
 }
 // 成员方法
 // getXxx()/setXxx()
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
}
package cn.itcast_03;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
 * 存储自定义对象并遍历,用普通for循环。(size()和get()结合)
 */
public class ListDemo3 {
 public static void main(String[] args) {
 // 创建集合对象
 List list = new ArrayList();
 // 创建学生对象
 Student s1 = new Student("林黛玉", 18);
 Student s2 = new Student("刘姥姥", 88);
 Student s3 = new Student("王熙凤", 38);
 // 把学生添加到集合中
 list.add(s1);
 list.add(s2);
 list.add(s3);
 // 遍历
 // 迭代器遍历
 Iterator it = list.iterator();
 while (it.hasNext()) {
 Student s = (Student) it.next();
 System.out.println(s.getName() + "---" + s.getAge());
 }
 System.out.println("--------");
 // 普通for循环
 for (int x = 0; x < list.size(); x++) {
 Student s = (Student) list.get(x);
 System.out.println(s.getName() + "---" + s.getAge());
 }
 }
}

(4)列表迭代器的特有功能;(了解)

可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。

package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
 * 列表迭代器:
 *  ListIterator listIterator():List集合特有的迭代器
 *  该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
 * 
 * 特有功能:
 *  Object previous():获取上一个元素
 *  boolean hasPrevious():判断是否有元素
 * 
 *  注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
 */
public class ListIteratorDemo {
 public static void main(String[] args) {
 // 创建List集合对象
 List list = new ArrayList();
 list.add("hello");
 list.add("world");
 list.add("java");
 // ListIterator listIterator()
 ListIterator lit = list.listIterator(); // 子类对象
 // while (lit.hasNext()) {
 // String s = (String) lit.next();
 // System.out.println(s);
 // }
 // System.out.println("-----------------");
 // System.out.println(lit.previous());
 // System.out.println(lit.previous());
 // System.out.println(lit.previous());
 // NoSuchElementException
 // System.out.println(lit.previous());
 while (lit.hasPrevious()) {
 String s = (String) lit.previous();
 System.out.println(s);
 }
 System.out.println("-----------------");
 // 迭代器
 Iterator it = list.iterator();
 while (it.hasNext()) {
 String s = (String) it.next();
 System.out.println(s);
 }
 System.out.println("-----------------");
 }
}

(5)并发修改异常

A:出现的现象

迭代器遍历集合,集合修改集合元素

B:原因

迭代器是依赖于集合的,而集合的改变迭代器并不知道。

C:解决方案

a:迭代器遍历,迭代器修改(ListIterator)

元素添加在刚才迭代的位置

b:集合遍历,集合修改(size()和get()) (普通for循环遍历)

元素添加在集合的末尾

package cn.itcast_04;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
 * 问题?
 *  我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
 * 
 * ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 
 * 产生的原因:
 *  迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
 *  其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
 * 如何解决呢?
 *  A:迭代器迭代元素,迭代器修改元素
 *  元素是跟在刚才迭代的元素后面的。
 *  B:集合遍历元素,集合修改元素(普通for)
 *  元素在最后添加的。
 */
public class ListIteratorDemo2 {
 public static void main(String[] args) {
 // 创建List集合对象
 List list = new ArrayList();
 // 添加元素
 list.add("hello");
 list.add("world");
 list.add("java");
 // 迭代器遍历
 // Iterator it = list.iterator();
 // while (it.hasNext()) {
 // String s = (String) it.next();
 // if ("world".equals(s)) {
 // list.add("javaee");
 // }
 // }
 // 方式1:迭代器迭代元素,迭代器修改元素
 // 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
 // ListIterator lit = list.listIterator();
 // while (lit.hasNext()) {
 // String s = (String) lit.next();
 // if ("world".equals(s)) {
 // lit.add("javaee");
 // }
 // }
 // 方式2:集合遍历元素,集合修改元素(普通for)
 for (int x = 0; x < list.size(); x++) {
 String s = (String) list.get(x);
 if ("world".equals(s)) {
 list.add("javaee");
 }
 }
 System.out.println("list:" + list);
 }
}

(6)常见数据结构

A:栈 第一个进入最后一个出来 先进后出

B:队列 第一个进入第一个出来 先进先出

C:数组 用来存储同一种数据类型的元素的一个集合 查询快,增删慢

D:链表 把多个节点链接起来的一串数据 查询慢,增删快 (单向链表,单向循环链表,双向链表,双向循环链表)

(7)List的子类特点(面试题)

ArrayList

底层数据结构是数组,查询快,增删慢。

线程不安全,效率高。

Vector

底层数据结构是数组,查询快,增删慢。

线程安全,效率低。

LinkedList

底层数据结构是链表,查询慢,增删快。

线程不安全,效率高。

到底使用谁呢?看需求?

分析:

要安全吗?

要:Vector(即使要,也不使用这个,后面再说)

不要:ArrayList或者LinkedList

查询多;ArrayList

增删多:LinkedList

什么都不知道,就用ArrayList。

(8)List集合的案例(遍历方式 迭代器和普通for)

A:存储字符串并遍历

B:存储自定义对象并遍历

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2016-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lgp20151222

java中两个map比较

15820
来自专栏java学习

Java每日一练(2017/8/17)

每日一句 学的到东西的事情是锻炼,学不到的是磨练。 查看以前的所有练习题目以及答案:https://mp.weixin.qq.com/mp/homepage?_...

30190
来自专栏Bingo的深度学习杂货店

Q7 Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 1...

30240
来自专栏闻道于事

Java之集合初探(一)

一、集合概述、区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器。 为什么出现集合类? 面向对象语言对事物的体现都...

25970
来自专栏郭耀华‘s Blog

剑指offer第五天

28.数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2...

28050
来自专栏LanceToBigData

JavaSE(八)之Collection总结

  前面几篇把集合中的知识大概都详细的说了一遍,但是我觉得还是要总结一下,这样的话,可以更好的理解集合。 一、Collection接口 首先我们要一张图来说明:...

24660
来自专栏Duncan's Blog

四则运算表达式求值

16020
来自专栏一个会写诗的程序员的博客

第7章 集合类第7章 集合类

在 Java 类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java 类库的基础上进...

8820
来自专栏编程

Python基础1

数据类型 Python3中有6钟标准的数据类型:Number(数字)、String(字符 串)、List(列表)、Tuple(元组)、Sets(集合)、Dict...

241100
来自专栏null的专栏

python基础知识——内置数据结构(集合)

python中的set是指一系列无序元素的集合,其中的元素都是相异的,常见的操作包括集合的并集,交集和补集等操作。 1、set的创建 格式 set_name =...

34970

扫码关注云+社区

领取腾讯云代金券