您的位置:首页 > 理论基础 > 数据结构算法

List集合和List集合特有的功能,常见数据结构及其特点

2018-08-02 21:33 169 查看

List集合的概述及特点:

              元素有序,并且每一个元素都存在一个索引.元素可以重复。

List集合特有的功能:
              void add(int index,E element):    在指定索引处添加元素
              E remove(int index):移除指定索引处的元素  返回的是移除的元素
              E get(int index):获取指定索引处的元素
              E set(int index,E element):更改指定索引处的元素 返回的而是被替换的元素

List特有功能的举例:

[code]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方法来进行遍历。

     

三种遍历方式以及反向遍历的举例:

[code]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循环遍历集合 添加元素 不会报错

[code]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);

}

}

 

数据结构之栈和队列:

        数据结构概述及常见数据结构
                 数据结构其实就是存储数据的格式            分类:    栈 , 队列 , 数组 , 链表 , 树 , 哈希表
                 栈特点:     先进后出
                 队列:        先进先出

        数据结构之数组和链表:

                 数组特点:    查询快 , 增删慢
                 链表特点:    查询慢 , 增删快

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: