集合总结:
单列集合:Collection(所有单列集合的根接口)
collection集合中的方法:
add(添加);
remov(删除指定元素):
clear:(清空集合中的元素):
contains:(集合中是否包含元素):
isEmpty():判断元素是否为空:
size():求出集合的长度
功能案例:
Collection c = new ArrayList();
c.add("abcd");向集合中添加元素
c.remove("abcd");删除集合中指定的元素
c.clear();清空集合中的元素;
c.contains("a");判断集合中是否包含指定元素;
c.isEmpty();判断集合是否为空;
int x = c.size();求出集合的长度;
Collection集合遍历的几种方式:
1、Collection集合之普通遍历:
Collection c = new ArrayList();
c.add(a);
c.add(b);
c.add(c);
Object [] arr = c.toArray();
for(int i = 0; i<arr.length;i++){
System.out.println(arr[i]);
}
分析:
1、将集合转换为Object类型的数组;
2、使用length作为判断条件,
3、使用for循环进行遍历
2、Coolection集合遍历之迭代器遍历:
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Iterator<String> it = c.iterator();//获取迭代器
while(it.hasNext()){//判断集合中是否还有可以迭代的元素
System.out.println(it.next());//获取下一个迭代元素
}
注:在刚开始调用it.next();的时候,他指向的是集合第一个元素的最前面
执行一次他就指向下一个元素并且获取到他
复习arr.length;和s.length();
在遍历数组时使用arr.length;
在遍历字符串时使用s.length();
package com.Collection;
public class Demo11 {
public static void main(String[] args) {
String s = "ascdgfghfghgjhfg";
for (int i = 0; i < s.length(); i++) {
System.out.println(s.charAt(i));
}
}
}
Collection遍历自定义对象;
public static void main(String[] args) {
Collection<student> c = new ArrayList<>();
c.add(new student("cc",23));
c.add(new student("bb",22));
c.add(new student("dd",24));
c.add(new student("ee",25));
Iterator<student> it = c.iterator();
while(it.hasNext()){
//student s = (student)it.next();//如果不使用泛型则一定需要向下转型
System.out.println(it.next());
}
}
集合框架(Collection集合的带All功能测试)
addAll(Collection c);将指定集合全部添加到该集合中
removeAll(Collection c);删除制定集合中全部元素
containsAll(Collection c);判断集合中是否全部包含指定指定集合的所有元素
Collection的子接口:
list:(list中的集合元素是有序,有索引,并且重复的)
1、list中特有的功能概述:
add(index, c);在指定索引位置插入元素
remove(index);删除指定位置的元素
get(inedx);获取指定位置的元素
set(int index,e);替换指定位置的元素
*size()和get(),遍历集合案例
public static void main(String[] args) {
List<String> li = new ArrayList<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
for (int i = 0; i < li.size(); i++) {//使用size()作为循环判断条件
System.out.println(li.get(i));//使用li.get(i)获取元素
}
}
*******并发修改异常产生的原因和解决办法
1、并发修改异常产生的原因是,在迭代器迭代集合中的元素时,删除元素,会导致迭代器预期迭代次数
发生改变,导致迭代结果不准确;所以迭代器会抛出,ConcurrentModifficationException并发修改异常
2、解决办法
第一种:如果只是删除某元素,并不需要遍历全部元素,我们可以在迭代到该元素时删除后,跳出循环;
方法演示:
public static void main(String[] args) {
//解决并发异常的第一种方法
List<String> li = new ArrayList<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
li.add("e");
li.add("f");
Iterator<String> it = li.iterator();//获取迭代器
while(it.hasNext()){//判断是否还有迭代元素
Object obj = it.next();//获取迭代元素
if("a".equals(obj)){//判断指定元素是否和迭代出来的元素相等
li.remove(obj);//如果相等删除
break;//跳出循环
}
}
System.out.println(li);//检验元素是否被删除
}
第二种解决办法:如果要在迭代期删除元素,怎可以调用迭代器本身的remove()方法;这样改变迭代次数,迭代器是可以预期的
//解决并发修改异常的第二中办法
List<String> li = new ArrayList<>();
li.add("a");
li.add("b");
li.add("c");
Iterator<String> it = li.iterator();//获取迭代器
while(it.hasNext()){
Object obj = it.next();
if("b".equals(obj)){
it.remove();//如果想在迭代期间删除元素,就使用迭代器自带的remove方法
}
}
System.out.println(li);
}
第三种解决方法:是有List中特有的迭代器
List<String> li = new ArrayList<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
ListIterator<String> lis = li.listIterator();//list中特有的迭代器
while(lis.hasNext()){
String s = lis.next();
if(s.equals("c")){
lis.add("m");//如果想在迭代期间添加或者删除元素,可以使用迭代器本身自带的add和remove方法
}
}
System.out.println(li);
List接口的三大子类集合框架
1、Vector:Vector集合框架底层是数组结构,存储的是有序的,重复的有索引的;是线程安全的,增删慢,查询也慢
Vector中特有的方法:
* public void addElement(E obj)
* public E elementAt(int index)
* public Enumeration elements()
C:案例演示
* Vector的迭代
Vector v = new Vector();//创建集合对象,List的子类
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
//Vector迭代
Enumeration en = v.elements(); //获取枚举
while(en.hasMoreElements()) { //判断集合中是否有元素
System.out.println(en.nextElement());//获取集合中的元素
}
2.ArrayList:有序,重复,有索引,线程不安全,底层是数组结构,查找快,增删慢
ArrayList中去除重复元素的思路:
a.新创建一个集合;
b.遍历老集合,判断新集合中是否包含老集合中元素,如果不包含,就把他添加到新集合中,
C.清空老集合,将新集合中的元素全部添加到老集合中
代码演示:
public static void main(String[] args) {
ArrayList<String> li = new ArrayList<>();
li.add("a");
li.add("a");
li.add("b");
li.add("b");
li.add("c");
li.add("c");
ListIterator<String> it = li.listIterator();
ArrayList<String> newli = new ArrayList<>();//创建新集合
while(it.hasNext()){
String s = it.next();
if(!newli.contains(s)){//判断新集合中是否包含该该元素
newli.add(s);//如果不包含,则添加到新集合中
}
}
li.clear();//清空老集合
li.addAll(newli);//将新集合中的元素,全部添加到新集合中
System.out.println(li);//则新集合中不含重复元素
}
去除ArrayList中重复的自定义对象:
思路分析:
a.创建新集合;
b.重写equlas方法:(重点)
代码演示:
public static void main(String[] args) {
//demo();
ArrayList<student> li = new ArrayList<>();
li.add(new student("张三",23));
li.add(new student("张三",23));
li.add(new student("李四",23));
li.add(new student("张三",23));
ListIterator<student> list = li.listIterator();
ArrayList<student> newli = new ArrayList<>();//创建新集合
while(list.hasNext()){
student s = list.next();//记录老集合中迭代出来的所有元素
if(!newli.contains(s)){//contains()方法判断是否包含,底层依赖的是equals方法,所以在判断自定义对象是一定要重写
newli.add(s);//不包含就添加到新集合中
}
}
System.out.println(newli);//这样就是去除了重复元素
} |