List集合的概述及特点:
元素有序,并且每一个元素都存在一个索引.元素可以重复。
List集合特有的功能:
void add(int index,E element): 在指定索引处添加元素
E remove(int index):移除指定索引处的元素 返回的是移除的元素
E get(int index):获取指定索引处的元素
E set(int index,E element):更改指定索引处的元素 返回的而是被替换的元素
List特有功能的举例:
package org.westos.Demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo {
public static void main(String[] args) {
// void add(int index,E element): 在指定索引处添加元素
// E remove(int index):移除指定索引处的元素 返回的是移除的元素
// E get(int index):获取指定索引处的元素
List list = new ArrayList();//创建一个List集合
list.add(1);
list.add(2);
list.add(3);
// void add(int index,E element)
list.add(0, 10);
//遍历集合
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// E remove(int index)
Integer remove = (Integer) list.remove(0);
System.out.println("被移除的元素:"+remove);
System.out.println(list);
//E get(int index)
System.out.println(list.get(list.size() - 1));
}
}
List特有的迭代器ListIterator(列表迭代器):
ListIterator的特有功能
boolean hasPrevious():是否存在前一个元素
E previous():返回列表中的前一个元素
以上两个方法可以实现反向遍历 但是注意 要完成反向遍历之前 要先进行正向遍历 这样指针才能移到最后
如果直接反向遍历是没有效果的 因为指针默认位置就在最前面 他前面没有元素
List集合元素的遍历方式:
List集合元素的遍历方式有三种:
1 用父接口中的iterator()获取迭代器,用迭代器中的hasNext() 和next()方法来进行遍历
2 ListIterator获取迭代器,用迭代器中的的hasNext() 和next()方法来进行遍历来遍历。方法1同理。
2 通过自己本身的size()方法和get方法来进行遍历。
三种遍历方式以及反向遍历的举例:
package org.westos.Demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
//测试类
public class Demo2 {
//主方法
public static void main(String[] args) {
List list = new ArrayList();//创建一个list集合
Student s1 = new Student("小米", 21);//创建4个学生类对象
Student s2 = new Student("小明", 22);
Student s3 = new Student("小华", 24);
Student s4 = new Student("小涛", 23);
list.add(s1);//将四个学生对象放到集合中
list.add(s2);
list.add(s3);
list.add(s4);
bianli(list);//调用遍历方法
}
//遍历方法
public static void bianli(List list) {
Iterator iterator = list.iterator();//获取一个迭代器
while (iterator.hasNext()) {//判断有没有下一个元素
Student student = (Student) iterator.next();//将下一个元素拿出来向下转型
System.out.println(student.getName() + "-----" + student.getAge());//打印
}
System.out.println("------------------------------------");
ListIterator listIterator = list.listIterator();//获取一个列表迭代器
while (listIterator.hasNext()) {//判断有没有下一个元素
Student student1 = (Student) listIterator.next();//将下一个元素拿出来向下转型
System.out.println(student1.getName() + "------" + student1.getAge());//打印
}
System.out.println("-------------------------------------------");
while (listIterator.hasPrevious()) {//判断有没有前一个元素
Student student2 = (Student) listIterator.previous();//将前一个元素拿出来向下转型
System.out.println(student2.getName() + "-----" + student2.getAge());//打印
}
System.out.println("---------------------------------------");
for (int i = 0; i < list.size(); i++) {
Student student3 = (Student) list.get(i);//用get()方法吧第i个元素拿出来向下转型
System.out.println(student3.getName() + "------" + student3.getAge());
}
}
}
package org.westos.Demo;
public class Student {
private String name;
private int age;
//无参构造
public Student() {
}
//有参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//setXXX和getXXX方法
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;
}
//重写toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
并发修改异常产生问题及其解决方法:
需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素。
ConcurrentModificationException(并发修改异常)出现;
我们用Iterator这个迭代器遍历采用hasNext方法和next方法,集合修改集合 会出现并发修改异常
原因是我们的迭代依赖与集合 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数
这个时候你在遍历的时候又突然想给 集合里面加一个元素(用的是集合的add方法) 那迭代器不同意 就报错了
解决方案 :我们用ListIterator迭代器遍历 用迭代器自带的add方法添加元素 那就不会报错了
a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
b:集合遍历元素,集合修改元素
解决方案2 使用for循环遍历集合 添加元素 不会报错
package org.westos.demo2;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListDemo5 {
public static void main(String[] args) {
// A:案例演示
// 需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
List<String> arrayList = new ArrayList<String>();
arrayList.add("hello");
arrayList.add("world");
ListIterator<String> iterator = arrayList.listIterator();
while (iterator.hasNext()) {
String ele = iterator.next();
if("world".equals(ele)) {
//arrayList.add("javaee"); // ConcurrentModificationException 并发修改异常
iterator.add("javaee");//用迭代器的添加方法
}
}
System.out.println(arrayList);
//为什么会出现并发修改异常:我现在用的是迭代器,进行遍历,在遍历之前,迭代器已经知道了,你集合中的所有元素
//然后你在迭代的过程当中,突然间想要添加一个元素,迭代器肯定加不进去的
//解决方案1:用迭代器中的添加方法
//解决方法2 用for 进行遍历
for(int i=0;i<arrayList.size();i++) {
String ele = arrayList.get(i);
if("world".equals(ele)) {
arrayList.add("javaee"); // ConcurrentModificationException 并发修改异常
}
}
System.out.println(arrayList);
//set() 替换集合中指定索引处的元素,返回的是被替换的元素
String set = arrayList.set(arrayList.size()-1, "JSP");
System.out.println(set);
System.out.println(arrayList);
}
}
数据结构之栈和队列:
数据结构概述及常见数据结构
数据结构其实就是存储数据的格式 分类: 栈 , 队列 , 数组 , 链表 , 树 , 哈希表
栈特点: 先进后出
队列: 先进先出
数据结构之数组和链表:
数组特点: 查询快 , 增删慢
链表特点: 查询慢 , 增删快