Java学习:Collection集合

一、学习目的

Java语言中数组可以存储多个元素,它的缺点就是数组一旦创建,它的长度就不能再发生改变。但在实际的开发过程中,我们需要一个可以随时改变大小的数组,因此Java语言就提供了Collection集合。

二、学习内容

一、Collection接口

Collection抽象接口,定义集合的相关操作:
1,List接口 列表 特点:存储的数据有序 内容可重复
例如 :
ArrayList:接口实现类, 数组, 随机访问
LinkedArrayList:接口实现类, 链表, 插入删除
2,Set接口 “集合” 特点:存储的数据无序 数据之间不重复
例如: HashSet 使用hash表(数组)存储元素

三、List接口的方法:
List方法
四、List方法具体使用

1,add 方法,集合末尾添加元素

    // 添加一个元素
    Collection list = new ArrayList();
    list.add("hello world");
    list.add("Merry");
    System.out.println(list);

2,删除集合中的元素

    //删除一个元素
    list.remove("hello world");
    System.out.println(list);
    System.out.println(list.size());

3,判断是否包含某个元素

     //判断是否包含一个元素
    if(list.contains("Merry")){
        System.out.println("包含");
    }else{
        System.out.println("不包含");
    }

4,判断集合是否为空

    //判断是否为空
    if(list.isEmpty()){
        System.out.println("集合为空");
    }

5,判断两个集合是否相同

    //判断两个集合是否相同
    Collection list2 = new ArrayList();
    list2.add("Jack");
    list2.add("and");
    list2.add("Merry");
    if(list.equals(list2)){
        System.out.println("两个集合内容相同");//比较集合的内容
    }else{
        System.out.println("两个集合内容不相同");
    }

6,遍历集合

  • 使用Iterator来遍历集合
    1, hasNext 判断是否由有元素;
    2, next 获取下一个元素;

    Iterator iterator = list2.iterator();
    while(iterator.hasNext()){
        System.out.print(iterator.next()+" ");
    }
    

3,错误的使用示范示范:

   while(iterator.next() != null){
     System.out.println(iterator.next());
   }       // 错误方式
  • 使用快速循环实现

     //2,for each 快速循环
      for(String obj:list2){
          System.out.print(obj+" ");
      }
    
  • for循环实现

     //for循环
      for(int i = 0; i ) list2).get(i)+" ");
      }
    
五、ArrayList类的使用
  • ArrayList :连续的内存空间 优点:访问方便, get()方法 ; 缺点:删除,添加
  • LinkedArrayList :内部使用链表实现 内存基本不连续 优点:增加 删除方便 ;缺点:访问不方便
    注:集合里面只能存放引用,如果要存放基本数据类型,要自动将基本数据类型转化成包装类 ,byte->Byte , char->Char ,int->Integer , long->Long, float->Float , double->Double

(1)ArrayList方法的具体使用
1,向集合中增加元素

   ArrayList score = new ArrayList();
    score.add(2);
    score.add(3); //添加是在末尾添加
    score.add(0,1);  //在指定位置插入元素
    System.out.println(score);

2,访问元素

   //访问指定元素
   int temp = score.get(2);
   System.out.println(temp);

3,修改指定位置的元素

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

4,删除一个元素

     //删除
    score.remove(0);//删除指定位置的元素
    score.remove((Integer)2); //删除指定的对象,整数2

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

5,将一个集合的所有元素添加到另外一个集合

    ArrayList a2 = new ArrayList();
    a2.add(1);
    a2.add(2);
    a2.add(3);
    a2.add(4);
    a2.add(5);
    score.addAll(a2);//将一个集合直接添加到另外一个
    System.out.println(score);

6,取两个集合的交集

    ArrayList a3 = new ArrayList();
    a3.add(1);
    a3.add(2);
    score.retainAll(a3);
    System.out.println(score);//输出两个集合的交集

7,查找某个元素在集合里的索引位置

     //访问某个对象在集合里面的索引位置
    ArrayList a4 = new ArrayList();
    a4.add(1);
    a4.add(2);
    a4.add(1);
    a4.add(2);
    a4.add(3);
    a4.add(1);
    System.out.println(a4.indexOf(1));//集合里面两个1,输出的是第一个1出现的位置
    System.out.println(a4.lastIndexOf(1));//最后一个1出现的位置

8,将ArrayList转化成普通数组
第一种:

    //将ArrayList转化为普通数组
   Integer[] objects = new Integer[a4.size()];
   a4.toArray(objects);
   for(Integer integer:objects){
       System.out.print(integer+" ");
   }

第二种:

  Object[] objects1 = a4.toArray();
    for(Object  integer:objects1){
        System.out.print(integer+" ");
    }
    Iterator iterator = a4.iterator();
    while(iterator.hasNext()){
        System.out.print(iterator.next()+" ");
    }

9,删除符合某种条件的元素

    //删除某个范围内的数据
    ArrayList nums = new ArrayList();
    nums.add(1);
    nums.add(2);
    nums.add(3);
    nums.add(4);
    //Lambda表达式
    nums.removeIf(element-> element%2 == 0);
    System.out.println(nums);

注意:不能使用循环的方式删除

六、Lambda表达式的使用

(1) Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
(2)使用:

//闭包 enclusure 把函数作为一个方法的参数
class ArrayClass{
public void test(int[] target,Show s){
    for(int element :target){
        s.customShow(element);
      }
  }
}
//必须是接口 这个接口里面只有一个方法
interface Show{
void customShow(int element);
}

如果参数是一个接口类对象,且接口里面只有一个方法 把这个方法作为参数传递可以省略方法名 ,如果只有一个参数,和参数类型可以省略,如果代码块里面只有一行语句,大括号也可以省略 ;

  ArrayClass ac = new ArrayClass();
  int[] num = {1,2,3,4,5,6};
  ac.test(num,(int element) -> {System.out.print(element+" ");});
七、Map接口

Map接口 保存有映射关系的对象 键值对 键不能相同 值可以相同
例如:
HashMap 底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高;

三、学习感悟

今天学习的难点就是Lambda表达式的使用,这点内容不容易理解,需要多思考,多联系。