String[] arr=new String[2];
arr[0]="aa";
arr[1]="bb";
arr[3]="cc";
for(int i=0;i
上面一段代码会出现数组下标越界的异常,更何况我们大部分情况下都是从前端接收数据,对于数据量更不可控
集合解决了Java中数组不能动态扩充的特性
collection与list和set还有其他集合的关系图**
collection存储的是一组不唯一、无序的对象
list存储的是一组不唯一有序(插入顺序)的对象
set存储一组唯一,无序的对象
List list=new List();这样是被new不出的,因为List是接口,接口是不能被实例化的
List list=new ArrayList();这样就可以,因为ArrayList是List 的实现类
List list=new LinkedList();这样也可以,因为LinkedList也是List的实现类
ArrayList:遍历元素和随机访问元素的效率比较高;
LinkedList:插入、删除元素的效率比较个;
ArrayList和LinkedList都有add添加元素的方法
List接口常用方法
1 boolean add(Object o)
在列表额末尾顺序添加元素,起始索引位置从0开始
1 for循环遍历List
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
List list=new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
for(int i=0;i
2 第二种for循环遍历,语法懂通不过,因为list.add添加元素的时候并不知道添加的是什么类型,所以就用到了泛型
3 List指定泛型添加元素,遍历List,List list=new ArrayList();指定泛型为String类型,打印直接打印变量s就好
语法结构:for(引用类型 变量:引用实例){}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
List list=new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
for(String s:list){
System.out.println(s);
}
}
}
4 引用类型循环(List集合)
Person 是自定义类型,Person类的两个实例添加的是相同元素,打印出全部
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person=new Person();
person.setName("aa");
person.setAge(10);
Person person1=new Person();
person1.setName("aa");
person1.setAge(10);
List list=new ArrayList<>();
list.add(person);
list.add(person1);
for(Person s:list){
System.out.println(s.getName()+s.getAge());
}
}
}
5 set元素不能重复
Person 是自定义类型,Person类的两个实例添加的是相同元素,只打印出一组数据,重复的被自动过滤
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person=new Person();
person.setName("aa");
person.setAge(10);
Person person1=new Person();
person1.setName("aa");
person1.setAge(10);
Set set=new HashSet<>();
set.add(person);
set.add(person1);
for(Person s:set){
System.out.println(s.getName()+s.getAge());
}
}
}
6 set用迭代器遍历 Iterator
Person 是自定义类型,Person类的两个实例添加的是相同元素,只打印出一组数据,重复的被自动过滤
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person=new Person();
person.setName("aa");
person.setAge(10);
Person person1=new Person();
person1.setName("aa");
person1.setAge(10);
Set set=new HashSet();
set.add(person);
set.add(person1);
Iterator iterator=set.iterator();
/**
*用while循环,括号里用条件表达式,
*条件表达式为true时,才遍历,否则不进入循环
*/
while (iterator.hasNext()){
/**
*等号右边要加一个强制类型转换
* 强制类型转换的前提:类型一致,否则抛异常
* String s =(String) iterator.next();
* 写成上面那句也是不报错的,但是运行后会报错
* 因为类型不匹配,因为迭代器里的next方法返回的
* 是Object类型的引用
*/
Person s =(Person) iterator.next();
System.out.println(s.getName()+s.getAge());
}
}
}
JDK1.8之后增加了lambda表达式
List的3种遍历方法
1 普通for循环在list循环遍历的第一个就写了
1 forEach遍历普通类型
public class FirstClass {
@Test
public void test() {
List list=new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.forEach(s->System.out.println(s));
}
}
2 forEach遍历自定义(引用)类型,forEach里比普通类型加了大括号
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person = new Person();
person.setName("aa");
person.setAge(10);
Person person1 = new Person();
person1.setName("aa");
person1.setAge(10);
List list=new ArrayList();
list.add(person);
list.add(person1);
list.forEach(p -> {System.out.println(p.getName()+p.getAge());});
}
}
set也可以用forEach遍历与list相同(普通类型、自定义类型:传泛型)
List集合的其他方法
1 void add(int Index,Object o)把第index个以及第index个以后的元素都往后移一位,再把obj放到index的位置;这个过程需要考虑index的合理性以及是否会溢出等问题
public class FirstClass {
@Test
public void test() {
List list=new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add(0,"xx" );
list.forEach(s->System.out.println(s));
}
}
public class FirstClass {
@Test
public void test() {
List list=new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
System.out.println(list.size());
}
}
3 Object get(int Index)返回指定索引位置处的元素,取出的是Object类型,使用前需要进行强制类型转换,不过下面这个例子没强制转换也OK
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person = new Person();
person.setName("aa");
person.setAge(10);
Person person1 = new Person();
person1.setName("bb");
person1.setAge(11);
Person person2 = new Person();
person2.setName("cc");
person2.setAge(12);
List list=new ArrayList();
list.add(person);
list.add(person1);
list.add(person2);
Person p=list.get(2);
System.out.println(p);
}
}
4 boolean contains(Object o)判断列表中是否存在指定元素 contains(包含)
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person = new Person();
person.setName("aa");
person.setAge(10);
Person person1 = new Person();
person1.setName("bb");
person1.setAge(11);
Person person2 = new Person();
person2.setName("cc");
person2.setAge(12);
List list=new ArrayList();
list.add(person);
list.add(person1);
list.add(person2);
boolean s=list.contains(person);
System.out.println(s);
}
}
5 boolean remove(Object o)从列表中删除指定元素
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person = new Person();
person.setName("aa");
person.setAge(10);
Person person1 = new Person();
person1.setName("bb");
person1.setAge(11);
Person person2 = new Person();
person2.setName("cc");
person2.setAge(12);
List list=new ArrayList();
list.add(person);
list.add(person1);
list.add(person2);
list.remove(person);
list.forEach(s->{System.out.println(s);});
}
}
6 boolean remove(int Index)从列表中删除指定位置元素,起始索引位置从0开始
import lombok.Data;
@Data
public class Person {
private int age;
private String name;
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class FirstClass {
@Test
public void test() {
Person person = new Person();
person.setName("aa");
person.setAge(10);
Person person1 = new Person();
person1.setName("bb");
person1.setAge(11);
Person person2 = new Person();
person2.setName("cc");
person2.setAge(12);
List list=new ArrayList();
list.add(person);
list.add(person1);
list.add(person2);
list.remove(2);
list.forEach(s->{System.out.println(s);});
}
}