1. Collection

Collection是整个集合框架的基础,作用只是提供维护一组对象的基本接口。

1.1 创建集合

父类引用指向子类对象

Collection<元素类型> 变量名=new ArrayList<元素类型>();//只可存储<>指定的类型Collection 变量名=new ArrayList();//集合元素默认为Object,任何元素类型都可存储

1.2 求元素个数

size():返回Collection中元素的个数

  • length:数组的属性,返回数组中元素个数
  • length():字符串的方法,返回其中元素个数

1.3 遍历方式

通用获取方式:

  1. 判断集合中有没有元素
  2. 有,取出,回1——迭代
  3. 没有,结束

1、无get方法,得用Object[] toArray(),转换为数组后,才可用get();

2、iterator(),可返回一个迭代器对象,可通过迭代对象来迭代集合。

1.4 常用方法

boolean add(E e)

void clear()

boolean contains(Object o)

boolean remove(Object o)

boolean isEmpty()

int size()

Object[] toArray()

Iterator<E> iterator()

1.5 注意

  • 集合中存放的其实是对象的地址
  • 集合中存基本数值时,都自动装箱了
  • 存储时,提升为了Object,取出时要使用元素的特有内容时,应向下转型。
  • 如果集合中存储的是多种对象,此时进行向下转型是会发生类型转换异常ClassCastException

2. 迭代器

Iterator是一个对象,工作是遍历并选择序列中的对象。创建代价小,又称为轻量级的容器。

2.1使用步骤

  1. 使用本容器的iterator()返回一个Iterator,然后通过Iterator的next()返回第一个元素;
  2. 使用Iterator的hasNext()判断容器中是否还有元素,如果有,可以使用next()获取下一个元素;
  3. 可以通过remove()删除迭代器返回的元素。

2.2 ListIterator

ListIterator只存在于List中,可用List.ListIterator()获取

支持在迭代器件向List中添加或删除元素,并且可以在List中双向滚动。

2.3区别

Iterator和ListIterator的区别:

  • Iterator只能正向遍历集合,适用于获取移除元素;
  • ListIterator继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改

2.3 使用

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class Main {public static void main(String[] args) {Collection c=new ArrayList();c.add("hello");c.add("world");c.add("java");if(c.contains("java"))c.add("android");for(Iterator it=c.iterator();it.hasNext();) {System.out.println(it.next());}}
}

运行结果

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class Main {public static void main(String[] args) {Collection c=new ArrayList();c.add("hello");c.add("world");c.add("java");Iterator it=c.iterator();while(it.hasNext()) {String s=(String)it.next();if(s.equals("java"))c.add("android");}for(Iterator is=c.iterator();is.hasNext();) {System.out.println(is.next());}}
}

出错:

并发修改异常。这通常是由于使用Iterator遍历容器的同时又对容器做增加或删除操作导致的,或者由于多线程操作导致,当一个线程使用迭代器遍历容器的同时,另外一个线程对这个容器进行增加后删除操作。

主要原因:当容器调用iterator()返回Iterator对象时,把容器中的包含对象的个数赋值给了一个变量expectedModCount,在调用next()时会比较变量expectedModeCount与容器中实际对象的个数modCount是否相等,若二者不等,则会抛出ConcurrentModificationException。

解决方法:在遍历过程中把需要删除的对象保存在一个集合中,等遍历结束后再调用removeAll()来删除,或者使用iter.remove()。

多线程情况的解决方法:

  1. JDK 1.5引入了线程安全的容器,比如ConcurrentHashMap和CopyOnWriteArrayList。可以使用这些线程安全的容器替代费线程安全的容器。
  2. 在使用迭代器遍历容器时对容器的操作放在synchronized代码块中,但是当引用程序并发程度比较高时,这会严重影响程序性能。

2.4  增强for循环

for(数据类型 变量名:数组或集合){

....

}

int[] arr={3,1,0,9};
for(int i:arr){System.out.println(i+1);
}

将arr中的元素值赋给i,i+1改变的是i的值,不是arr中元素的值。

好处:代码少,方便对容器的遍历;

缺点:无索引,不可操作容器内的元素。

在增强for中不能修改集合,否则会发生并发修改异常——增强for底层是迭代器

3. Collections

此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。

如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都将抛出 NullPointerException。

3.1 Collection和Collections

Collection:结合体系的最顶层,包含了集合体系的共性

Collections:一个工具类,构造方法私有,方法为static,用于操作Collection

3.2 常用方法

static  int binarySearch(List list,T key):使用二分搜索法搜索指定列表,以获得指定对象在指定列表中地索引。

  • 前提:list有序,

static void copy(List des,List src): 将所有元素从一个列表复制到另一个列表。

  • 目标列表的长度至少等于源列表

static void fill(List list,T obj):使用指定元素替换指定列表中的所有元素。

static void reverse(List list):反转指定列表中元素的顺序。

static void shuffle(List list):使用默认随机源对指定列表进行置换。

static void sort(List list): 根据元素的自然顺序对指定列表按升序进行排序。

static void swap(List list,int i,int j):在指定列表的指定位置处交换元素。

返回值为void,说明备操作对象本身发生了变化

返回值为一个新对象,说明被操作的对象一般不会发生变化。(特殊:Buffer的append())

4. 泛型

用来灵活地将数据类型应用到不同的类、方法和接口中。

将数据类型作为参数传递。

public class Box<T> {// T stands for "Type"private T t;public void set(T t) { this.t = t; }public T get() { return t; }
}

4.1 定义格式

修饰符  class  类名<代表泛型的变量>{   }

ArrayList<String>——编译时限制arr.add(arg)若arg是String类型,编译成功;若不是,编译失败

但编译后的class文件无泛型。——所以Java是伪泛型

可以保证安全性吗?——可以,因为不符合的数据类型,首先编译不会通过

4.2 使用格式

创建对象时,确定泛型的类型。

4.3 含有泛型的方法

定义: 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){...}

使用:调用方法时,确定泛型的类型

4.4 好处

避免了类型转换的麻烦,将运行时的ClassCastException转移到了编译时期的编译失败。

4.5 泛型的通配

?:可匹配所有的数据类型

Collection<?> coll

Collection c=new ArrayList();——此处未规定泛型类型,所以是默认类型Object

此时使用增强for时,for(Object obj:数组或集合)

集合-1(Collection、迭代器、Collections、泛型)相关推荐

  1. JAVA day15 Collection(集合)、Iterator迭代器、泛型<E>

    1.Collection(集合) 集合:集合是java中提供的⼀种容器,可以⽤来存储多个数据. 集合与数组的区别: 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同⼀类型的元素,可以存储基本 ...

  2. Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)

    文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...

  3. java arraycollection_Java集合(三)--Collection、Collections和Arrays

    Collection: Collection是集合类的顶级接口,提供了对集合对象进行基本操作的通用接口方法.Collection接口的意义是为各种具体的集合提供了最大化 的统一操作方式,其直接继承接口 ...

  4. jav核心(十四):集合类型操作:Collection、List、Set;Map集合;Iterator迭代器

    一.java.util.List 1.List总结 List中允许保存重复的数据: List中允许保存多个null: 常用实现类:ArrayList[推荐使用].Vector.LinkedList: ...

  5. -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器...

    集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别?                 A:长度区别                  ...

  6. java可变参数 map_Java第6期Collection、Map、迭代器、泛型、可变参数、集合工具类、集合结构、Debug...

    集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值.集 ...

  7. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    欢迎访问我的个人网站:https://bengtian.club 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度 ...

  8. 2.Collection、Iterator迭代器、泛型、斗地主案例

    Collection集合 1.1 集合概念及其与数组的区别 集合:集合是java中提供的一种容器,可以用来存储多个数据. 与数组的区别 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型 ...

  9. Java集合之Collection集合、泛型 【集合综合案例:赌神、赌侠、赌神斗地主】

    第一章. Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. ...

  10. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

最新文章

  1. jittor和pytorch生成网络对比之cyclegan
  2. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
  3. 使用线程新建WPF窗体(公用进度条窗体)
  4. JavaScript技巧
  5. MySQL简单查询性能分析
  6. Stack(nowcoder 11253-K)
  7. linux matplotlib 中文显示乱码
  8. 画法几何与工程制图2
  9. 使用 IKuai 和 DDNSTO 外网访问你的设备(NAS、软路由)
  10. 微信公众号网页链接失效解决方案
  11. Python 数据框将某列设置为新索引、重新定义行索引、及获取列名
  12. 复杂 Excel 表格导入导出的最简方法
  13. HC-SR501红外人体传感模块封锁时间调整
  14. Python NLTK的学习(二) 获得文本语料和词汇资源
  15. 探访广东第二鬼城,一座长在石油上的城市
  16. vue项目接入e2e自动化测试
  17. 什么是Java的灵魂?了解JVM的结构模型,生命周期,Java王朝虚拟机的更替,各家大厂虚拟机百花齐放
  18. 樊氏族谱2-汝南樊银后裔家谱续谱-简书
  19. 免费在线工具分享 | 录屏、视频转gif、gif剪切、音频剪切、音频合并
  20. java语言程序设计丁振凡ppt_Java语言程序设计(第2版)丁振凡第2章.ppt

热门文章

  1. 搞定Oracle SCN -system change number
  2. 使用Oracle LogMiner分析archived log
  3. ASP.NET跨页面传值(二)
  4. IT服务台的进化(2)--企业外部服务台的优缺点
  5. react项目启动invalid host header问题
  6. 9开头的两位数相乘速算法
  7. Hbase 预写日志WAL处理源码分析之 LogCleaner
  8. 【问题】HDFS中块(block)的大小为什么设置为128M?
  9. sealos安装k8s集群注意事项:必须关闭任何形式的http_proxy代理
  10. jenkins基本使用