需求:List集合存储字符串并遍历。
List集合的特点:
有序(存储和取出的元素一致),可重复的。
package javatest;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class A {

public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();

// 创建字符串并添加字符串
list.add("hello");
list.add("world");
list.add("java");
list.add("hello1");
list.add("world2");
list.add("java3");

// 遍历数组
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
}
}
最后输出
hello
world
java
hello1
world2
java3

---------------------------------------------------------------------------------
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 static void main(String[] args){
//创建集合对象
List list = new ArrayList();

//添加元素
list.add("hello");
list.add("world");
list.add("java");

1 //void add(int index,Object element):在指定位置添加元素
list.add(1."android");//注意 索引不可越界 但是在这里可以是3 将android成为第四个元素

System.out.println("list:"+list);list:[hello,android,world,java]

2 //Object get(int index):获取指定位置的元素
System.out.println("get:"+list.get(1)); //get:world //不可越界

3 //ListIterator listIterator():List集合特有的迭代器

4 //Object remove(int index):根据索引删除元素,返回被删除的元素
System.out.println("remove:"+list.remove(1));remove:world//不可越界
System.out.println("list:"+list);list:[hello,java]

5 //Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
System.out.println("set:"+list.set(1,"javaee"));set:world
System.out.println("list:"+list);//[hello,javaee,java]
}

List集合的特有遍历功能:
size()和get()方法结合

public static void main(String[] args){
//创建对象
List list = new ArrayList();

//添加元素
list.add("hello");
list.add("world");
list.add("java");

//for(int x=0;x<list.size;x++){
String s = (String)list.get(x);
System.out.println(s);
}
}

//List存储自定义对象并遍历
测试类
package javatest;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class A {

public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();

AText s1 = new AText("林黛玉", 18);
AText s2 = new AText("刘奶奶", 88);
AText s3 = new AText("王熙凤", 38);

// 把AText添加到集合中
list.add(s1);
list.add(s2);
list.add(s3);

// 迭代器遍历
Iterator it = list.iterator();
while (it.hasNext()) {
AText s = (AText) it.next();
System.out.println(s);
}

// 普通for循环
for (int x = 0; x < list.size(); x++) {
AText s = (AText) list.get(x);
System.out.println(s);
}

}

}

工具类
package javatest;

public class AText {
// 成员变量
private String name;
private int age;

// 构造方法
public AText() {
super();

}

public AText(String name, int age) {
super();
this.name = name;
this.age = age;
}

// get方法set方法
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;
}

@Override
public String toString() {
return "Student: [name=" + name + ",age=" + age + "]";
}

}

ListIterator的特有功能(列表迭代器):
列表迭代器:ListIterator listIterator():List集合特有的迭代器
//该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法
//特有功能:
Object previous():获取上一个元素
boolean hasPrevious():判断是否有元素

注意:ListIterator可以实现逆向遍历,但是必须先正向遍历才能逆向遍历,所以一般没意义,不使用。

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);
}

//迭代器
Iterator it = list.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
}

//逆向遍历
while(lit.hasPrevious()){
String s = (String)lit.previous();
System.out.println(s);
}
}

问题:
我有一个集合,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javeee"元素,代码实现

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");
}
}
System.out.println(list);
}

结果报错了:ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
产生原因:
迭代器是依赖集合而存在的,在判断成功后,集合中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
如何解决呢?
//这两种方法都可以改集合元素,都可以避免并发修改异常的报错
A:迭代器迭代元素,迭代器修改元素。
元素是跟在刚才迭代的元素后面的。
B:集合遍历元素,集合修改元素。(普通for)
元素在最后添加的。

方式A:迭代器迭代元素,迭代器修改元素
而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
ListIterator lit = list.listIterator();
while(lit.hasNext()){
String s = (String)lit.next();
if("world".equals(s)){
lit.add("javaee")
}
}
System.out.println(list);//[hello, world, javaee, java]

方式B:集合遍历元素,集合修改元素。(普通for)
for(int x<0;x<list.size();x++){
String s = (String)list.get(x);
if("world".equals(x)){
list.add("javaee");
}
}
System.out.println(list);//[hello, world, java, javaee]

List:(面试List的子类特点)
ArrayList:
底层数据结构是数组,查询块,增删慢。
线程不安全,效率高。
Vector:
底层数据是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。

List有三个儿子,我们使用谁?
看需求。

安全性不好:
查询多用ArrayList
增删多用LinkedList

java集合List的更多相关文章

  1. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  2. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  3. java集合你了解多少?

    用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...

  4. 深入java集合学习1-集合框架浅析

    前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...

  5. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  6. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  7. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  8. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  9. Java集合概述

    容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...

  10. 深入java集合系列文章

    搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...

随机推荐

  1. vscode下搭建typescript时提示"无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称"错误的解决方法

    根据网上的教程,安装了node.js后,再安装了typescript,,,这时候编译生成或者在vscode的终端里调用npm或者tsc --version时,总是提示 npm : 无法将"n ...

  2. API开放平台接口设计-------基于OAuth2.0协议方式

    1,简介OAuth http://www.ruanyifeng.com/blog/2019/04/oauth_design.html OAuth 是什么? http://www.ruanyifeng. ...

  3. MATLAB 句柄绘图

    一.线句柄实例 >> h1=line([0:10],[0:10])%创建句柄值 h1 = Line (具有属性): Color: [0 0.4470 0.7410] LineStyle: ...

  4. Python学习-第四节:常用模块-logging,re,time

    1:logging模块 import logging logging.debug('This is debug message') logging.info('This is info message ...

  5. 前端之jQuery基础篇

    jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 很容易学习. jQuery 安装 网页中添加 jQuery 可以通过多种方法在 ...

  6. E - E CodeForces - 1100E(拓扑排序 + 二分)

    E - E CodeForces - 1100E 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方 ...

  7. Java并发基础10:原子性操作类的使用

    在 java5 以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含: ...

  8. mysql慢查询分析工具比较与实战

    00 前言 在进行mysql性能优化的时候,第一个想到的便是查看慢sql. 但是对于慢sql有没有什么好的工具进行分析呢? 推荐两个工具mysqldumpslow及pt-query-digest. m ...

  9. 各种版本docker下载的中国开源地址

    最近在群里听说Docker很火,于是自己抱着试试的态度,想玩玩,可是遇到了一些问题,记录下来,方便备忘,也方便防止大家被坑. 我的虚拟机装的是centos 6.5,百度了好多教程,丫的,都不解释,就一 ...

  10. mysql服务器内存使用情况总结

    活动链接(动态)使用的内存数量如下所示: per_connection_memory = read_buffer_size //memory for sequential table scans +r ...