java 12
集合
1、Collection
到目前位置,我们学习过哪些可以存储元素的容器
1、数组
优点:不同的数组可以存储不同数据类型的元素
缺点:长度不可变
2、StringBuffer|StringBuilder
优点:长度可以跟随元素的数量而改变
缺点:里面的元素只有一种字符数据类型
我们今后会根据元素的是否重复,存储和取出的顺序等来决定我们该使用什么样的容器来进行存储
根据我现实生活中经验来说,容器应该是丰富多彩的,多种多样的
java应该要使用若干个不同的类来描述不同的容器,表示不同容器的特点。
容器应该都有若杠共同的特点,都可以装东西等。
那么java中提供的这些类中成员应该也会有相同的部分,那我们将其向上提取,由继承或实现来构建关系
这样我们就可以得到一个继承体系。
Collection【接口】:
我们通过帮助文档发现,Collection是一个接口,不能直接new对象
根据元素是否可以发生重复,继续分类
- List【接口】元素可以发生重复,且有索引的概念
ArrayList
- Set【接口】元素不可以发生重复,没有索引
借助ArrayList子类对象来使用Collection接口中的方法
学习java中任意一个集合的步骤:
1、创建相关集合对象
2、创建元素对象
3、将元素添加到集合中
4、遍历集合
Collection中的成员方法:
一
boolean add (E e)
boolean remove (Object o)
void clear ()
boolean contains (Object o)
boolean isEmpty ()
int size ()
public class CollectionDemo1 {
public static void main (String[] args) {
Collection c1 = new ArrayList ();
c1.add(100 );
c1.add(true );
c1.add(12.34 );
c1.add(1000L );
c1.add(100 );
c1.add(12.34 );
System.out.println("c1: " + c1);
System.out.println("-----------------------------------------" );
c1.remove(100 );
System.out.println("c1: " + c1);
System.out.println("-----------------------------------------" );
System.out.println("-----------------------------------------" );
System.out.println(c1.contains(12.34 ));
System.out.println("-----------------------------------------" );
System.out.println(c1.isEmpty());
System.out.println("-----------------------------------------" );
System.out.println(c1.size());
}
}
二
boolean addAll (Collection c)
boolean removeAll (Collection c)
boolean containsAll (Collection c)
boolean retainAll (Collection c)
public class CollectionDemo2 {
public static void main (String[] args) {
Collection c1 = new ArrayList ();
c1.add("java" );
c1.add("maven" );
c1.add("clickhouse" );
c1.add("redis" );
Collection c2 = new ArrayList ();
c2.add("java" );
c2.add("hadoop" );
c2.add("maven" );
c2.add("hive" );
c2.add("hbase" );
c2.add("数据采集" );
System.out.println("c1: " +c1);
System.out.println("c2: " +c2);
System.out.println("------------------------------" );
c1.retainAll(c2);
System.out.println("c1: " +c1);
System.out.println("c2: " +c2);
}
}
问题:如何遍历一个集合
方法一:Object[] toArray() 把集合转成数组,可以实现集合的遍历
public class CollectionDemo3 {
public static void main (String[] args) {
Collection c1 = new ArrayList ();
c1.add("hello" );
c1.add("world" );
c1.add("java" );
c1.add("hadoop" );
c1.add("world" );
Object[] objects = c1.toArray();
for (int i=0 ;i<objects.length;i++){
Object obj = objects[i];
String s = (String)obj;
System.out.println(s+"-" +s.length());
}
}
}
方法二:Iterator iterator() 迭代器,集合的专用遍历方式
public class CollectionDemo4 {
public static void main (String[] args) {
Collection c1 = new ArrayList ();
c1.add("hello" );
c1.add("world" );
c1.add("java" );
c1.add("hadoop" );
c1.add("world" );
Iterator iterator = c1.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
String s = (String)obj;
System.out.println(s+"-" +s.length());
}
}
}
运用
public class CollectionDemo5 {
public static void main (String[] args) {
Collection c1 = new ArrayList ();
Student s1 = new Student ("李刚" , 15 );
Student s2 = new Student ("江川" , 11 );
Student s3 = new Student ("钱志强" , 17 );
Student s4 = new Student ("祝帅" , 15 );
c1.add(s1);
c1.add(s2);
c1.add(s3);
c1.add(s4);
Iterator iterator = c1.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
Student s = (Student) obj;
System.out.println(s.getName()+"-" +s.getAge());
}
}
}
2、List集合
List集合:元素可以发生重复,有序(指存储和取出的顺序一致)
Collection【接口】:
- List【接口】
ArrayList
- Set【接口】
List集合中特有的成员方法:
void add (int index,E element)
E remove (int index)
E get (int index)
E set (int index,E element)
ListIterator listIterator ()
public class ListDemo1 {
public static void main (String[] args) {
List list1 = new ArrayList ();
list1.add("hello" );
list1.add("apple" );
list1.add("banana" );
list1.add("watermelon" );
list1.add("mango" );
System.out.println("list1: " + list1);
System.out.println("==================================" );
list1.add(2 ,"grape" );
System.out.println("list1: " + list1);
System.out.println("==================================" );
System.out.println(list1.remove(2 ));
System.out.println("list1: " + list1);
System.out.println("==================================" );
System.out.println(list1.get(3 ));
System.out.println("list1: " + list1);
System.out.println("==================================" );
System.out.println(list1.set(3 , "orange" ));
System.out.println("list1: " + list1);
System.out.println("==================================" );
ListIterator listIterator = list1.listIterator();
while (listIterator.hasNext()){
System.out.println(listIterator.next());
}
System.out.println("==================================" );
while (listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
问题:
/*
需求:遍历集合,当遇到mango的时候,向集合中添加一个元素"java"
我们发现如果使用迭代器遍历,集合发生修改的话,报错了
ConcurrentModificationException
*/
public class ListDemo2 {
public static void main (String[] args) {
List list1 = new ArrayList ();
list1.add("hello" );
list1.add("apple" );
list1.add("banana" );
list1.add("watermelon" );
list1.add("mango" );
list1.add("peach" );
list1.add("pear" );
System.out.println("list1: " + list1);
System.out.println("======================================" );
ListIterator listIterator = list1.listIterator();
while (listIterator.hasNext()) {
Object obj = listIterator.next();
String s = (String) obj;
if ("mango" .equals(s)) {
listIterator.add("java" );
}
}
System.out.println("list1: " + list1);
}
}
ArrayList迭代器源码
public interface List extends Collection {}
class ArrayList implements List {
public Iterator<E> iterator () {
return new Itr ();
}
private class Itr implements Iterator <E> {
int cursor;
int lastRet = -1 ;
int expectedModCount = modCount;
Itr() {}
public boolean hasNext () {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next () {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException ();
Object[] elementData = ArrayList.this .elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException ();
cursor = i + 1 ;
return (E) elementData[lastRet = i];
}
public void remove () {
if (lastRet < 0 )
throw new IllegalStateException ();
checkForComodification();
try {
ArrayList.this .remove(lastRet);
cursor = lastRet;
lastRet = -1 ;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException ();
}
}
@Override
@SuppressWarnings("unchecked")
public void forEachRemaining (Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
final int size = ArrayList.this .size;
int i = cursor;
if (i >= size) {
return ;
}
final Object[] elementData = ArrayList.this .elementData;
if (i >= elementData.length) {
throw new ConcurrentModificationException ();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[i++]);
}
cursor = i;
lastRet = i - 1 ;
checkForComodification();
}
final void checkForComodification () {
if (modCount != expectedModCount)
throw new ConcurrentModificationException ();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理