java集合List
需求: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的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合概述
容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...
- 深入java集合系列文章
搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...
随机推荐
- coding++:Spring Boot 全局事务解释及使用(二)
什么是全局事务: Spring Boot(Spring) 事务是通过 aop(aop相关术语:通知(Advice).连接点(Joinpoint).切入点(Pointcut).切面(Aspect).目标 ...
- [noip模拟]食物中毒<暴搜+状压优化>
问题描述 Bqc经过一段时间的研究发现,要解这种毒需要一种特殊的药物.不幸的是,这种药物在 市面上不存在,没有办法Bqc只好亲自制得这种药物.它含有M种化学物质A1,A2,…,AM.现 在Bqc的手上 ...
- Babel快速入门
作者:姜瑞涛 Github仓库:https://github.com/jruit/babel-tutorial 博客:姜瑞涛的官方网站 原文链接:https://www.jiangruitao.com ...
- 在 UITextField 中添加删除绑定(绑定删除)
要解决的问题 在输入框中,需要整体删除诸如 “xxx@xx.com” 或 “@xxxx” 等文本 实现思路 在删除动作时,获取到当前光标的位置,如果在光标正在处在上述文本范围内,就删除一整串文本 如何 ...
- SSM项目启动的三种方式
SSM整合Maven项目的三种启动方式 项目部署如图: 1.从父工程的的tomcat插件中直接启动 2.从web子工程的tomcat插件中启动,(需要先执行父工程的install) 如果没有执行父工程 ...
- 计算机网络学习笔记NO.2 物理层
2.1 基本概念 2.1.1 物理层概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体. 物理层主要任务:确定与传输媒体接口有关的一些特性(定义标准) 机械特性:定 ...
- Linux基础:Day02
Linux文件管理 创建 touch vim/vi echo重定向 touch 管理:atime mtime ctime touch 文件名 //如果文件不存在就创建文件 touch -a -t [ ...
- linux之进程管理(二)
一.查看进程 ps aux 查看系统所有的进程数据 ps -lA 查看所有系统的数据 ps axjf 连同部分进程树状态 ps参数 -A 显示所有进程,等效 -e -a 不与ter ...
- C++ stringstream(强制类型转换)
#include <iostream>#include <string>#include <sstream>using namespace std;int main ...
- 29.3 ArrayList、List、LinkedList(链表)优缺点
ArrayList.List特点:查询快.增删慢 链表特点:查询慢,增删快 案例 package day29_collection集合体系; import java.util.ArrayList; i ...