Java中的集合

目的:

今天来学习和了解Java中的集合概念。

技术:
  • Collection抽象接口
  • Map(集合)接口
  • List接口
  • Set"集合"
技术实际运用:
  • List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
  • Set下有HashSet,LinkedHashSet,TreeSet
  • List下有ArrayList,Vector,LinkedList
  • Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
    在Java中,数组可以储存多个对象 。可以这样来定义它:
int[] score={1,2,3};
int[] score=new int[10];

我们通常在定义数组的时候,就会给数组里面赋值,把它的内容确定下来。但这样的数组却有一个弊端,那就是数组长度不可边,内容可变。
我们在实际开发中需要一个随时能够改变的数组。此时,就可以用到Java中的集合——collection

  • 集合表示一组被称为其元素的对象。 一些集合允许重复元素,而其他集合不允许。
public class MyClass {
    public static void main(String[] args) {
       //Collection接口的方法
        Collection<String> t1 = new ArrayList();
        t1.add("Jack");
        t1.add("Marry");
        System.out.println(t1);

        //删除一个对象
        t1.remove("Jack");
        System.out.println(t1);

        //获取元素个数
        System.out.println(t1.size());

        //判断是否包含一个元素,可用contains来操作
        if (t1.contains("Marry")){
            System.out.println("有Marry");
        }else{
            System.out.println("没有Marry");
        }

        //判断是否为空
        if(t1.isEmpty()){
            System.out.println("is empty");
        }else{
            System.out.println("not empty");
        }

        //判断两个集合是否相同
        Collection<String> t2=new ArrayList<>();
        t2.add("Jack");
        t2.add("Marry");

        if (t1.equals(t2)){
            System.out.println("两个集合相同");
        }else{
            System.out.println("两个集合不相同");
        }

        //清空
        t1.clear();
        System.out.println(t2);

在集合中的元素是可以变化的。

  • 添加元素 add addAll
  • 删除元素 remove():删除一个对象
  • 插入元素
  • 访问元素
  • 获取元素个数 size
  • 是否包含一个元素 contains
  • 是否为空 isEmpty
  • 集合比较 equals
  • 清空 clear
集合的遍历

1.使用Iterator来遍历
//hasNext 判断是否有元素
//next 获取下一个对象
//remove 删除当前遍历过后的对象


20.PNG

迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。

Iterator iterator=t2.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        while (iterator.next()!=null){
            System.out.println(iterator.next());
        }

2.for-each 增强for循环


21.PNG
        for (String obj:t2){
            System.out.println(obj);
        }

3.for-i

        for (int i=0; i < t2.size(); i++){
            System.out.println(((ArrayList<String>) t2));
        }
List接口
 List接口 extends Collection

有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

与集合不同,列表通常允许重复的元素。 更正式地,列表通常允许元素e1和e2成对使得e1.equals(e2) ,并且如果它们允许空元素,它们通常允许多个空元素。 有人可能希望实现一个禁止重复的列表,当用户尝试插入时会抛出运行时异常,但是我们预计这种使用是罕见的。

该List接口放置额外的约定,超过在Collection指定接口上的iterator,add,remove,equals和hashCode方法合同。 其他继承方法的声明也包括在这里以方便。

  • ArrayList和 LinkedArrayList
    它们一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。
    前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
  • ArrayList: 可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。
    每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长。
  • LinkedArrayList:
ArrayList<Integer> score = new ArrayList<>();
        score.add(2);
        score.add(3);//在末尾添加
        score.add(0,1);//在指定位置插入

        //访问指定元素
        score.get(1);

        //修改一个指定元素
        score.set(0,0);
        System.out.println(score);

        //删除指定元素
        score.remove((Integer) 2);//删除指定位置的对象
        System.out.println(score);

        score.clear();//删除所有 清空
        System.out.println(score);

        ArrayList<Integer> a2 =new ArrayList<>();
        a2.add(1);
        a2.add(2);
        a2.add(3);

        //将一个集合里面的内容添加到当前集合中
        score.addAll(a2);
        System.out.println(score);


        ArrayList<Integer> a3 = new ArrayList<>();
        a3.add(1);
        a3.add(2);
        score.retainAll(a3);//去两个集合的交集
        System.out.println(score);

        //访问某个对象在集合里面的索引
        ArrayList<Integer> a4 = new ArrayList<>();
        a4.add(1);
        a4.add(2);
        a4.add(2);
        a4.add(4);
        System.out.println(a4.indexOf(1));//第一次出现的位置
        System.out.println(a4.lastIndexOf(2));//最后一次出现的位置

//集合里面只能存放对象
//byte char int long float double boolean
//包装4类
//Byte Char Int Long Float Double Boolean
//自动将基本数据类型包装为对应的类
有时候在一些Dmeo中就需要把将ArrayList转化为普通数组。那么怎样来进行转换呢。

Integer[] objects = new Integer[a4.size()];
        a4.toArray(objects);
        for (Integer i:objects){
            System.out.println(i);
        }
        Iterator iterator =a4.iterator();//遍历数组
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

删除某个范围内的对象

 block          
  Lambda表达式          
  return (var1) -> {   
    return !this.test(var1);            };           
 return 20;

获取集合某个 范围内的子集和

       List<Integer> integers=a4.subList(1,3);
        System.out.println(integers);
        ArrayList<Integer> nums= new ArrayList<>();
        nums.add(1);
        nums.add(2);
        nums.add(3);
        nums.add(4);

     ![图片.png](https://upload-images.jianshu.io/upload_images/18961655-30e40e4bcccaa6d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
表达式
       // nums.removeIf(obj -> obj % 2 == 0);
        for (int i=0; i< nums.size(); i++) {
            Integer obj = nums.get(i);
            if (obj % 2 == 0) {
                nums.remove(i);
            }
        }
        System.out.println(nums);

闭包 Closure(就是Lambda表达式把函数作为一个方法的参数)

class ArrayClass{
    public void test(int[] target,Show s){
        for (int element:target){
            s.customShow(element);
        }
//必须是接口,这个接口里面只有一个方法(这里就像我们做一件事情做不了,就需要通过其他的人来做)
interface Show{
    void customShow(int element);
}

怎么去使用上面的方法呢,也就是 test方法。

1.使用方式:定义一个类实现接口
        ArrayClass ac= new ArrayClass();
        int[] num={1,2,3,4,5,6};
        yjxClass yc= new yjxClass();
        ac.test(num,yc);//这里让yc去把这个数组里面的内容弄出来,也就是把对象告诉它,在它执行的时候,就去照这个对象


        //2.使用匿名类
       ArrayClass ac= new ArrayClass();
        int[] num={1,2,3,4,5,6};

        ac.test(num, new Show() {
            @Override
            public void customShow(int element) {
                System.out.println(element);
            }
        });


        //3.
      ArrayClass ac= new ArrayClass();
        int[] num={1,2,3,4,5,6};
        ac.test(num,(int element)->{
            System.out.println(element);
        });

        //5.如果代码块里面只有一行语句 ,大括号可以省略
    ArrayClass ac= new ArrayClass();
        int[] num={1,2,3,4,5,6};

        ac.test(num,element -> System.out.println(element));

继承这个yc接口 ac.test(num,yc);

class yjxClass implements Show{
    @Override
    public void customShow(int element) {
        System.out.println(element);
    }
}

总结:今天讲得有点多了,一下搞不过来。有点枯燥乏味,但还是要学的,只能加油了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 893评论 0 1
  • 简介 1.所有的集合类都位于java.util包下,Java的结合主要由两个接口类派生出来,分别是Collecti...
    yunqing_71阅读 2,561评论 0 2
  • Java 集合框架 早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vecto...
    爱斯基摩白阅读 498评论 0 0
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 775评论 0 2
  • 对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式。 接口:Collection Collecti...
    BrianAguilar阅读 1,781评论 2 29