Java中的集合框架

集合的由来

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
数组和集合的区别
(1): 长度区别:
数组的长度是固定的而集合的长度是可变的
(2): 存储数据类型的区别:
数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
(3): 内容区别:
数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素

ps:在这里从网上找了一张集合框架的图
在这里插入图片描述

Collection集合的功能

Collection的功能概述(通过API查看即可得到)
a:添加功能
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合的元素 (给一个集合添加进另一个集合中的所有元素)
b:删除功能
void clear():移除所有元素
boolean remove(Object o):移除一个元素
boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素
如果没有交集元素 则删除失败 返回false
c:判断功能
boolean contains(Object o):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)
比如:1,2,3 containsAll 12=true 1,2,3 containsAll 2,3,4=false
boolean isEmpty():判断集合是否为空
d:获取功能
Iterator iterator()(重点)
e:长度功能
int size():元素的个数
f:交集功能
//例如:A集合对B集合取交集,获取到的交集元素在A集合中。返回的布尔值表示的是A集合是否发生变化
boolean retainAll(Collection c):获取两个集合的交集元素(交集:两个集合都有的元素)
g:把集合转换为数组
Object[] toArray()

集合的遍历之迭代器遍历

迭代器

Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet…,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。

因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器模式!

把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。
使用迭代器遍历集合:

public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("张三1");
          list.add("张三2");
          list.add("张三3");
          list.add("张三4");
          
         List<String> linkList = new LinkedList<String>();
          linkList.add("link1");
         linkList.add("link2");
         linkList.add("link3");
         linkList.add("link4");
         
         Set<String> set = new HashSet<String>();
         set.add("set1");
         set.add("set2");
         set.add("set3");
         set.add("set4");
         //使用迭代器遍历ArrayList集合
         Iterator<String> listIt = list.iterator();
         while(listIt.hasNext()){
             System.out.println(listIt.next());
         }
         //使用迭代器遍历Set集合
         Iterator<String> setIt = set.iterator();
         while(setIt.hasNext()){
             System.out.println(listIt.next());
         }
         //使用迭代器遍历LinkedList集合
         Iterator<String> linkIt = linkList.iterator();
         while(linkIt.hasNext()){
             System.out.println(listIt.next());
         }
 }

Iterator遍历时不可以删除集合中的元素问题
  在使用Iterator的时候禁止对所遍历的容器进行改变其大小结构的操作。例如: 在使用Iterator进行迭代时,如果对集合进行了add、remove操作就会出现ConcurrentModificationException异常。

List<String> list = new ArrayList<String>();
          list.add("张三1");
          list.add("张三2");
          list.add("张三3");
          list.add("张三4");
          
          //使用迭代器遍历ArrayList集合
          Iterator<String> listIt = list.iterator();
          while(listIt.hasNext()){
             Object obj = listIt.next();
             if(obj.equals("张三3")){
                 list.remove(obj);
             }
         }

因为在你迭代之前,迭代器已经被通过list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步list做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常)
for循环与迭代器的对比:
效率上各有各的优势:
ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是随机访问的方法,因此在ArrayList里for循环快。
LinkedList则是顺序访问比较快,Iterator中的next()方法采用的是顺序访问方法,因此在LinkedList里使用Iterator较快。
主要还是要依据集合的数据结构不同的判断。

List接口

List接口中的元素的特点为:
List中存储的元素实现类排序,而且可以重复的存储相关元素。
同时List接口又有两个常用的实现类ArrayList和LinkedList
1)ArrayList:
ArrayList数组线性表的特点为:类似数组的形式进行存储,因此它的随机访问速度极快。
ArrayList数组线性表的缺点为:不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。
可以这样理解ArrayList就是基于数组的一个线性表,只不过数组的长度可以动态改变而已。
2)LinkedList
LinkedList的链式线性表的特点为: 适合于在链表中间需要频繁进行插入和删除操作。
LinkedList的链式线性表的缺点为: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。速度你懂的。
可以这样理解LinkedList就是一种双向循环链表的链式线性表,只不过存储的结构使用的是链式表而已。
List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。

 //产生一个 List 集合,典型实现为 ArrayList
          List list = new ArrayList();
          //添加三个元素
          list.add("Tom");
          list.add("Bob");
          list.add("Marry");
          //构造 List 的迭代器
          Iterator it = list.iterator();
          //通过迭代器遍历元素
         while(it.hasNext()){
             Object obj = it.next();
             //System.out.println(obj);
         }
         
         //在指定地方添加元素
         list.add(2, 0);
          
         //在指定地方替换元素
         list.set(2, 1);
                  //获得指定对象的索引
         int i=list.indexOf(1);
        System.out.println("索引为:"+i);
        
        //遍历:普通for循环
         for(int j=0;j<list.size();j++){
              System.out.println(list.get(j));
         }
Java 集合框架主要分为两个部分:`java.util` 和 `java.util.concurrent`。其,`java.util` 包含了大部分的集合框架,而 `java.util.concurrent` 则包含了一些并发集合框架。 在 `java.util` 包集合框架主要分为两类:`Collection` 和 `Map`。`Collection` 接口表示一组对象,它是所有集合框架的基础接口,提供了对集合元素的基本操作,例如添加、删除、查找等。`Map` 接口则表示一组键值对,提供了根据键来查找值的操作。 在 `Collection` 接口下,Java 常用的集合框架包括: 1. `List`:有序列表,元素可以重复。常用的实现类有 `ArrayList`、`LinkedList` 和 `Vector`。 2. `Set`:无序集合,元素不可以重复。常用的实现类有 `HashSet`、`LinkedHashSet` 和 `TreeSet`。 3. `Queue`:队列,元素按照一定的顺序进行排列,常用的实现类有 `LinkedList` 和 `PriorityQueue`。 4. `Deque`:双端队列,可以在队列的两端进行插入和删除操作,常用的实现类有 `ArrayDeque` 和 `LinkedList`。 在 `Map` 接口下,Java 常用的集合框架包括: 1. `HashMap`:无序键值对集合,键不可以重复。 2. `LinkedHashMap`:有序键值对集合,键不可以重复。 3. `TreeMap`:有序键值对集合,键可以按照自然顺序进行排序。 4. `Hashtable`:与 `HashMap` 类似,但是是线程安全的,不推荐使用。 总之,Java 集合框架提供了丰富的数据结构和算法,可以大大简化程序的开发,提高程序的效率和可维护性。需要根据具体的需求来选择合适的集合框架和实现类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值