zoukankan      html  css  js  c++  java
  • javase学习第14天(集合)

    集合

    数组和集合类同样都是容器,有什么不同?

    1、数组长度是固定的,一旦定义,就无法改变 ;

    2、集合长度是可变的 ;

    3、数组中可以存储基本数据类型,也可以是对象(实际上是对象的引用);

    4、集合只能存储对象的引用 集合中的元素都是引用数据类型,基本数据类型也要转成包装类对象后才能放入集合。

    java集合体系

    collection接口

    Collection有两个派生出来的子接口:Set,List :

    Set: 特点是:元素无序,不可重复 ;

    List: 特点是:元素有序,可以重复。

    接口

    保存的是具有映射关系“key-value对”的集合 ;

    Map里面保存的每项数据都是key-value对,也就是由key和value两个值组成,就像学生的成绩,姓名是key,成绩是value,每个key对应着一个value。

    三种集合对比

    1、Set和List都属于Collection的子接口,Set里面的元素没有顺序,但是不能重复;

    2、List接口里的元素是有顺序的,所以可以重复;

    3、Map里存放的元素都是成对出现的,一个key对应着一个value,通过key可以找到对应的value值。

    collection 常用方法 :

    1、boolean add(Object o):向集合中添加一个元素,如果添加成功,则返回true,否则返回false

    2、boolean addAll(Collection c):把另一个集合中的所有元素添加到当前集合中,如果添加成功,返回true,否则false

    3、void clear():清除集合里的所有元素,将集合长度变成0

    4、boolean contains(Object o):返回集合里是否包含指定元素

    5、boolean containsAll(Collection c):返回集合里是否包含集合c里包含的所有元素

    6、boolean isEmpty():返回当前集合是否为空

    7、Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素

    8、boolean remove(Object o):删除集合中的指定元素c,当集合中包含一个或者多个元素c时,该方法只删除第一个符合条件的元素,成功删除返回true

    9、boolean removeAll(Collection c):从集合中删除集合c中包含的素有元素,相当于用当前集合减去集合c,如果删除了一个或者一个以上的元素,该方法返回true

    10、int size():返回集合中元素的个数

    11、Object[] toArray():将集合转换成一个数组,转换后的数组是Object类型

    迭代器Iterator

    Iterator也是集合框架中的成员,但是它不能用来盛装元素,只能用来遍历(即迭代)Collection中的元素,Iterator对象也被称为迭代器

    所有集合对象有一个获得本集合对象的迭代器的方法.iterator(),可以返回一个迭代器,用来遍历这个集合的所有元素

    常用的迭代器方法有:

    1、boolean hasNext():查看集合是否还有元素,如果集合被遍历完了,则返回false,否则返回true

    2、Object next():返回集合中的下一个元素,注意返回值类型是Object

    3、boolean remove():将上一次返回的元素删除,删除成功返回true,否则false

    在使用迭代器遍历的时候,不可将判断条件改成it.next()!=null;

        Collection al = new ArrayList();
        al.add("javaSE");
        al.add("javaEE");
        Iterator iterator = al.iterator();
        Object obj;
        while ((obj = iterator.next()) != null) {
            System.out.println(obj);
        }
     

    分析: it.next()返回值是引用数据类型,所以可以用来和null进行判断。 但.next()方法的含义是去取下一个元素,当迭代器已经遍历完集合的时候,已经没有下一个元素了,这时再去取元素,就会报错。所以,这样遍历集合是不行的。必须在取元素之前,先进行“有无”的判断,而不能直接去取。 另外:

     1 public void test2(){
     2     Collection coll = new ArrayList();
     3     coll.add(123);
     4     coll.add(new String("A"));
     5     coll.add("B");
     6 
     7     Iterator i = coll.iterator();
     8     //判断一下执行的流程
     9     while((i.next())!= null){
    10         System.out.println(i.next());
    11     }
    12 }
     

    结果为A;

    注意在while循环条件判断及打印条件中的.next()都进行了集合元素的跳转。

    遍历集合的另一个方式:增强for循环

    每次循环都把数组/集合中的元素拿出来赋值给一个变量;用来遍历集合和数组。

    增强for在遍历时,采用的是值传递,不论在循环中对变量进行怎样的更改,都不会影响到真正的集合元素,但是可以改变引用的对象的变量值,

    1 Collection al = new ArrayList();//
    2 al.add("java");
    3 al.add("javaSE");
    4 al.add("javaEE");
    5 for (Object obj : al) {//集合中的元素取出来都是Object类型
    6     String name = (String)obj;//强转为String类型
    7     name = "String: " + name;//在字符串前面加上String字样
    8 }
    9 System.out.println(al);
     

    结果不会对集合元素进行修改;

     1 import java.util.*;
     2 class Student{
     3     String name;
     4     int age;
     5     public Student(){}
     6     public Student(String name,int age){
     7         this.name = name;
     8         this.age = age;
     9     }
    10 }
    11 class StudentDemo{
    12     public static void main(String[] args){
    13         Student s1 = new Student("s1",11);
    14         Student s2 = new Student("s2",12);
    15         Student s3 = new Student("s3",13);
    16         //创建集合
    17         Collection coll = new ArrayList();
    18         //添加元素
    19         coll.add(s1);
    20         coll.add(s2);
    21         coll.add(s3);
    22         //在增强for中改变引用的对象的成员变量的值
    23         for(Object obj : coll){
    24             Student stu = (Student)obj;
    25             stu.name = "tom";
    26         }
    27         //使用增强for遍历集合,看元素的成员变量是否发生了变化
    28         for(Object obj : coll){
    29             Student stu = (Student)obj;
    30             System.out.println(stu.name+"-----"+stu.age);
    31         }
    32     }
    33 }
    
    

    集合元素是应用对象,对其进行修改都会体现在堆内存中的对象上,结果会改变。 增强for循环中的变量用来接收数组/集合中的元素,属于值传递,在增强for循环中对迭代变量进行的修改无法体现到真实的数组/集合上

    遍历时删除集合元素

    迭代器在迭代过程中,不可以使用集合的remove方法对集合作出修改。 迭代器也有一个remove方法,可以用其方法能对集合元素进行删除。如下:

     1 public class ForEachDemo {
     2 public static void main(String[] args) {
     3     Collection coll = new ArrayList();
     4     coll.add("java");
     5     coll.add("javaSE");
     6     coll.add("javaEE");
     7     //对集合进行遍历
     8     Iterator it = coll.iterator();
     9     while(it.hasNext()){
    10         String str = (String)it.next();
    11         if(str.equals("java")){ //判断取出的元素是否和指定字符串相等
    12             it.remove();        //是迭代器的remove()方法;如果相等,则从集合中删除
    13         }
    14     }
    15     System.out.println(coll);//打印出集合元素
    16 }
    17 
    18 
    19 }

    Collection接口中定义的remove和迭代器中的remove方法都能对集合中的元素进行删除,但是两者不能同时使用,即:在使用迭代器遍历集合时,不能使用Collection中的remove方法,只能使用迭代器中的remove方法来删除元素。

    如何利用Iterator删除集合中的第一个元素?

    Iterator的remove方法删除的是next方法返回的元素,也就是说,再调用remove方法之前,必须先调用一次next方法才行,这样才能保证remove方法有删除的东西,否则找不到要删除的元素:

    it.next();      //skip the first element
    it.remove();    //remove the element returned by next() function
    

    利用iterator来删除元素的话,需要使用next方法跨过这个元素 这也就意味着,不能连续两次调用remove方法,例如:

    it.remove();
    it.remove();//error
    
  • 相关阅读:
    LeetCode-Path Sum I & II & III
    LeetCode-Unique Binary Search Trees I & II
    LeetCode-230. Kth Smallest Element in a BST
    LeetCode-98. Validate Binary Search Tree
    LeetCode-450. Delete Node in a BST
    LeetCode-108. Convert Sorted Array to Binary Search Tree
    LeetCode-129. Sum Root to Leaf Numbers
    视频中人体轮廓检测
    新型SVM
    Surveillance Monitering入门学习论文笔记
  • 原文地址:https://www.cnblogs.com/yihaifutai/p/6659534.html
Copyright © 2011-2022 走看看