List
2.1 List集合概述和特点
public interface List<E> extends Collection<E>
~List有序集合也称为序列。该界面的用户可以精确的控制列表中每个元素的插入位置。用户可以通过整数索引访问元素。并搜索列表中的元素。
~与Set集合不同,列表通常允许重复元素。
List集合特点:
有序:存储和取出的元素顺序一致;
可重复:存储的元素可以重复。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("hello");
l.add("world");
l.add("java");
l.add("java");
System.out.println(l);
Iterator<String> it = l.iterator();
while (it.hasNext()){
String s = it.next()
System.out.println(s);
}
}
}
2.2List集合特有方法
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除此集合中指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素
package daily_collection;
import java.util.ArrayList;
import java.util.List;
public class ListDemo02 {
public static void main(String[] args) {
List<String> l=new ArrayList<String>();
l.add("hello");
l.add("world");
l.add("java");
l.add("java");
l.add(0,"oh");
System.out.println(l.get(0));
System.out.println(l.remove(0));
System.out.println(l.get(0));
System.out.println(l.set(0,"good"));
System.out.println(l.get(0));
}
}
循环遍历:
for(int i=0;i<l.size();i++)
System.out.println(l.get(i));
案例:List集合存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储个学生对象,使用程序实现在控制台遍历该集合。
思路:
1.定义学生类
2.创建List集合对象
3.创建学生对象
4.把学生添加到集合
5.遍历集合(迭代器、for循环)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo03 {
public static void main(String[] args) {
List<Student> ls=new ArrayList<Student>();
Student s1=new Student("AA",23);
Student s2=new Student("BB",24);
Student s3=new Student("CC",16);
ls.add(s1);
ls.add(s2);
ls.add(s3);
Iterator<Student> it=ls.iterator();
while(it.hasNext()){
Student ss=it.next();
System.out.println(ss.getName()+"="+ss.getAge());
}
for (int i=0;i<ls.size();i++){
Student s = ls.get(i);
System.out.println(s.getName()+"-"+s.getAge());
}
}
}
2.3并发修改异常
通过迭代器获取next的值的时候,都会去判断预期修改值和实际修改值是否相等。如果不同,会抛出并发修改异常。
用for循环,get方法去获取要修改的值,然后使用list.add去修改。因为get方法中并没有判断的条件,所以就不会出发并发修改异常。
2.4ListIterator
ListIterator:列表迭代器
1.通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器。
2.该方法允许从任一方向遍历列表的列表迭代器,在迭代器修改列表,并获得列表中迭代器的当前位置。
ListIterator的常用方法:
1.E next():返回迭代器中的下一个元素;
2.boolean hasNext():如果迭代具有更多元素,则返回true;
3.E previous():返回列表中的上一个元素;
4.boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true;
5.void add(E e):将指定的元素插入列表。
package daily_collection;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListDemo04_listIterator {
public static void main(String[] args) {
List<String> l=new ArrayList<String>();
l.add("hello");
l.add("world");
l.add("java");
ListIterator<String> listit=l.listIterator();
while(listit.hasNext()){
String s = listit.next();
System.out.println(s);
}
System.out.println("------------------------------");
while (listit.hasPrevious()){
String sp=listit.previous();
System.out.println(sp);
}
System.out.println("------------------------------");
ListIterator<String> listit2=l.listIterator();
while (listit2.hasNext()){
String s2 = listit2.next();
if(s2.equals("world")){
listit2.add("jjjjjj");
}
}
System.out.println(l);
}
}
输出结果:
hello
world
java
------------------------------
java
world
hello
------------------------------
[hello, world, jjjjjj, java]
notes:ListIterator里面的add方法会将实际修改值赋值给预期修改值,所以在迭代的next方法做判断的时候,不会出现并发异常。
2.5增强for循环
增强for:简化数组和Collection集合的遍历
1.实现Iterable接口的类允许其对象称为增强for语句的目标
2.它是JDK5之后出现的,其内部原理是一个Iterator迭代器
增强for的格式:
for(元素数据类型的变量名:数组或者Collection集合){
//在此使用变量即可,该变量就是元素
}
示例:
int[] arr={1,2,3,4};
for(int i:arr){
System.out.println(i);
}
package daily_collection;
import java.util.ArrayList;
import java.util.List;
public class ListDemo05_for {
public static void main(String[] args) {
int[] arr= {1,2,4,5};
for (int i:arr){
System.out.println(i);
}
System.out.println("-----------------");
List<String> l=new ArrayList<String>();
l.add("hello");
l.add("world");
l.add("java");
for (String s:l){
System.out.println(s);
}
}
}
案例:List集合存储学生对象用三种方式遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
普通for循环(带有索引的遍历方式)
迭代器:集合特有的遍历方式
增强for循环(最方便)
思路:
1、定义学生类
2、创建List集合对象
3、创建学生对象
4、将学生添加到集合
5、遍历集合
package daily_collection;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
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 daily_collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo05_demo {
public static void main(String[] args) {
List<Student> l=new ArrayList<Student>();
Student s1=new Student("A",1);
Student s2=new Student("B",2);
Student s3=new Student("C",3);
l.add(s1);
l.add(s2);
l.add(s3);
Iterator<Student> it=l.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s.getName()+"-"+s.getAge());
}
System.out.println("---------------");
for(int i=0;i<l.size();i++) {
Student s = l.get(i);
System.out.println(s.getName()+"-"+s.getAge());
}
System.out.println("---------------");
for(Student s:l){
System.out.println(s.getName()+","+s.getAge());
}
}
}
2.6数据结构
数据结构是计算存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
2.7常见数据结构之栈
先进后出、后进先出。
最后进栈的元素称为栈顶元素,最先进栈的元素称为栈底元素。
2.8常见数据结构之队列
先进先出、后进后出。
2.9常见数据结构之数组
查询数据通过索引定位,查询任意数据耗时相同,查询速度快。
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低。
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低。
note:所以数组时一种查询快、增删慢的模型。
2.10常见数据结构之链表
链表中有结点的概念,结点分为数据域和指针域。
链表相对于数组是一种增删快,查询慢的模型。链表增删只需要修改指针域的指向即可,但是链表的查询每次都需要从head头指针开始查询,所以查询效率相对于数组较慢。
2.11List集合子类特点
List集合常用子类:ArrayList,LinkedList
2.11.1ArrayList(extends AbstractList implements List)
Array’List底层数据结构是数组
ArrayList是List接口的可调整大小的数组实现。所以ArrayList类的查询快、增删慢。
2.11.2LinkedList(extends AbstractSequentialList implements List)
LinkedList底层数据结构是链表
LinkedList是双链表实现List和Deque接口。所以LinkedList类是查询慢、增删快。
2.11.3分别使用ArrayList和LinkedList完成存储字符串并遍历
ArrayList:
import java.util.ArrayList;
import java.util.Iterator;
public class ListDemo06_arrayList {
public static void main(String[] args) {
ArrayList<String> array=new ArrayList<String>();
array.add("hello");
array.add("world");
array.add("java");
Iterator<String> it =array.iterator();
while (it.hasNext()){
String s = it.next();
System.out.println(s);
}
for(int i=0;i<array.size();i++) {
String s=array.get(i);
System.out.println(s);
}
for(String s:array) {
System.out.println(s);
}
}
}
输出结果:
hello
world
java
hello
world
java
hello
world
java
LinkedList:
import java.util.Iterator;
import java.util.LinkedList;
public class ListDemo06_linkedList {
public static void main(String[] args) {
LinkedList<String> linkedlist=new LinkedList<String>();
linkedlist.add("hello");
linkedlist.add("world");
linkedlist.add("JAVA");
Iterator<String> it=linkedlist.listIterator();
while(it.hasNext()){
String s=it.next();
System.out.println(s);
}
for(int i=0;i<linkedlist.size();i++){
String s=linkedlist.get(i);
System.out.println(s);
}
for(String s:linkedlist){
System.out.println(s);
}
}
输出结果:
hello
world
java
hello
world
java
hello
world
java
2.11.4案例:ArrayList集合存储学生对象用三种方式遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现控制台遍历该集合
思路:
1、定义学生类
2、创建ArrayList集合对象
3、创建学生类对象
4、将学生对象添加到ArrayList集合中
5、遍历集合
迭代器:集合特有的遍历方式
普通for循环:带有索引的遍历方式
增强for循环:最方便的遍历方式
Student类:
package daily_collection;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
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;
}
}
import java.util.ArrayList;
import java.util.Iterator;
public class ListDemo06_arrayList_obj {
public static void main(String[] args) {
ArrayList<Student> arrayList=new ArrayList<Student>();
Student s1=new Student("A",1);
Student s2=new Student("B",2);
Student s3=new Student("C",3);
arrayList.add(s1);
arrayList.add(s3);
arrayList.add(s2);
Iterator<Student> it=arrayList.iterator();
while(it.hasNext()){
Student s=it.next();
System.out.println(s.getName()+"_"+s.getAge());
}
| | |
|--|--|
| | |
for(int i=0;i<arrayList.size();i++){
Student s=arrayList.get(i);
System.out.println(s.getName()+"-"+s.getAge());
}
for(Student s:arrayList){
System.out.println(s.getName()+","+s.getAge());
}
}
}
2.12 LinkedList集合的特有功能
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该链表开头插入指定元素 |
public void addLast(E e) | 在该链表末尾添加指定元素 |
public E getFirst() | 返回该链表的第一个元素 |
public E getLast() | 返回该链表的最后一个元素 |
public E removeFirst() | 删除列表中第一个元素,并返回 |
public E removeLast() | 从此列表中删除最后一个元素,并返回 |
import java.util.LinkedList;
public class ListDemo_linkedList_class {
public static void main(String[] args) {
LinkedList<String> linkedList=new LinkedList<String>();
linkedList.add("hello");
linkedList.add("world");
linkedList.add("JAVA");
linkedList.addFirst("first word!");
linkedList.addLast("last word!");
System.out.println(linkedList.removeFirst());
System.out.println(linkedList.removeLast());
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
System.out.println(linkedList);
}
}
first word!
last word!
hello
JAVA
[hello, world, JAVA]