前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

集合

作者头像
木瓜煲鸡脚
发布2019-07-22 16:05:42
3600
发布2019-07-22 16:05:42
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记

集合

Collection接口

来自java.util

用来存储数据和数组一样

和数组不同的是数组可以放任何类型,它只能放引用类型

并且可以自动扩充空间

下图体系结构:

Collection的其中几个方法演示

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Collection;

class Season{
  
  public static void main(String[] args) {
    
     Collection c1 = new ArrayList();// 注意接口不能创建对象,这里用多态的写法新建一个ArrayList对象
     c1.add("a");// add()往集合中添加元素,list都可以添加重复的元素。会有一个boolean返回值true
     c1.add("b");
     c1.add("c");
     c1.add(2);// 虽然写的时候可以写上基本类型,但实际上编译会对2会进行装箱操作还是引用类型
     
     Collection c2 = new ArrayList();
     c2.add("a");
     c2.add("b");
     
     System.out.println(c1);
     System.out.println(c1.contains("b"));// a中元素是否包含"b",返回一个boolean
     System.out.println(c1.size());// a集合的的元素个数
     Object[] obj = c1.toArray();// 转化为数组类型,并且是Object类型
     c1.remove("b");// 从集合a中移除元素"b"
     System.out.println(c1);
     
     c1.containsAll(c2);// 集合c1是否包含集合c2,返回boolean值
     c1.retainAll(c2);// 集合运算c1=c1交c2,返回boolean类型c1和以前相等就返回false变了就是true
     /*
       还有
       addAll(c)
       removeAll(c)
       iterator()
    */
  }
  
}

结果:
      [a, b, c,2]
      true
      3
      [a, c]

集合的遍历

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

class Season{
  
  public static void main(String[] args) {
    
     Collection c = new ArrayList();
     c.add("a");
     c.add("b");
     c.add("c");
     c.add("d");
     Object[] arr = c.toArray();// 第一种遍历是转化成数组
     for (Object i : arr) {
       System.out.println(i);
  }
  
  
     Iterator it = c.iterator();// 第二种是用迭代器打印游标指定的元素
     while(it.hasNext()) {// 判断游标指向是否为空
       System.out.println(it.next());// 游标后移,打打印当前
       
     }

  }
  
}


结果:
      a
      b
      c
      d
      a
      b
      c
      d

List接口

Collection的子接口,有序集合

特有方法其中几个演示

代码语言:javascript
复制
import java.util.List;
import java.util.ArrayList;

class Season{
  
  public static void main(String[] args) {
    
     List a = new ArrayList();
     
     a.add("a");
     a.add("b");
     a.add(1, "ss");// 插入值可以选择索引插入
     System.out.println(a);
     System.out.println(a.get(2));// 获取指定索引的值
     
     a.remove(1);// 移除指定索引对应的元素
     System.out.println(a);
    
  }
  
}

结果:
      [a, ss, b]
      b
      [a, b]

迭代过程修改集合的并发异常

试例:迭代器遍历集合时改动

代码语言:javascript
复制
class Season{
  
  public static void main(String[] args) {
    
     Collection c = new ArrayList();
     c.add("a");
     c.add("b");
     c.add("c");
     c.add("d");

     Iterator it = c.iterator();
     while(it.hasNext()) {
       String str = (String)it.next();
       if(str.equals("c")) {// 如果有"c"则给集合添加一个"f"
         c.add("f");
       }
       
     }
     System.out.println(c);

  }
  
}
// 报错 java.util.ConcurrentModificationException

在迭代器中不能对来源集合直接修改需要用迭代器实现类中已经定义好的方法。对于例子用的ArrayList对象创建的集合来说,ArrayList中就有三个方法除了重写的terator(),还有ListIterator()还有一个重载的,ArrayList类中定义了内部类实现Iterator接口,重写实现接口中相关方法详情见源码。方法会新建对应的内部类对象返回,例子中的Iterator it = c.iterator();c.iterator就会得到一个ArraysList中的一个内部类对象

ArrayList类

List接口的实现类

ArrayList中方法基本都是实现的List的方法没有特有方法

前面用的具体方法也都实际上是来自ArrayList

下面来用这些方法实现去掉集合中的重复元素

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Iterator;

class Season{
  
  public static void main(String[] args) {
    
     ArrayList c = new ArrayList();
     c.add("a");
     c.add("b");
     c.add("a");
     c.add("c");
     c.add("b");
     c.add("d");// 初始化有重复元素的目标集合c
     System.out.println(c);
     
     Iterator it = c.iterator();// 创建迭代器来遍历集合
     ArrayList newList = new ArrayList();// 创建新数组存放目标数组的过滤值
    while(it.hasNext()) {
       String s = (String) it.next();// 注意这里要用到两次当前游标值需要取一下当前值,不能在下面用两次next这样就不是一个值而且迭代器会越界
       if(!newList.contains(s)) {// 每次从c中取一个值,看newList是否包含
         newList.add(s);
       }
         
     }
    c = newList;// 最后把过滤的结果赋给c,从而达到去重的目的
    System.out.println(c);
  }
  
}


  结果:
      [a, b, a, c, b, d]
      [a, b, c, d]

linkedList类

List接口的实现类,与ArrayList不同的是它是链表结构

由于它是实现了List,所以它也是有索引添加删除等方法

但就不是像Array一样直接就定位到元素,链表只能不断找到下一个直到满足索引的次数

同时它有几个特有方法

代码语言:javascript
复制

import java.util.LinkedList;

class Season{
  
  public static void main(String[] args) {
    
     LinkedList c = new LinkedList();
     c.add("a");
     c.add("b");
     System.out.println(c);
     
     c.addFirst("F");
     c.addLast("d");
     System.out.println(c);
     
     System.out.println(c.getFirst()+" "+c.getLast()+" "+c.pop());
     System.out.println(c);
     c.push("G");
     System.out.println(c);
     
     /*
     还有
     removeFirst()
     removeLast()
     pollFist();
     pollLast();
     peek这些等等
     */
  }
  
}


结果:
    [a, b]
    [F, a, b, d]
    F d F
    [a, b, d]
    [G, a, b, d]

Vector类

1.2版本之后加入到Collection家族当中,实现List接口

它和ArrayList一样属于数组结构,不同的是它的很多方法前都加了锁,所以比起ArrayList线程更加安全但效率低

它在加入List之前有有些自己的添加移除等方法

代码语言:javascript
复制

import java.util.Vector;

class Season{
  
  public static void main(String[] args) {
    
     Vector c = new Vector();
     c.add("a");
     c.add("b");
     c.addElement("c");// 在实现List之前用的添加方法
     c.removeElement("a");
     System.out.println(c);
  

  }
  
}

总结

集合作用和特性

Collection接口的方法

Collection下的两个子接口List与Set的不同点

List中的特有方法

ArrayList类对方法的具体实现

LinkedList类的具体实现和它的特有方法

Vecotor的特点

快到碗里来

!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档