java集合(1)

集合框架

相关问题

  • 集合Collection中存储的如果是自定义类的对象,需要自定义类重写哪个方法?为什么?

  • equals()方法

    • contains()

    • remove()

    • retainsAll()

List:equals()方法

Set:(HashSet、LinkedHashSet为例):equals(),hashCode()

  • TreeSet为例:

    • Comparable:compareTo(Object obj)

    • Comparator:compare(Object o1,Object o2)

  • ArrayList,LinkedList,Vector三者接口类的相同点和不同点?(面试题)

同:三类都是作为实现类的接口,存储数据的特点相同,都是有序的、可重复的数据

不同:ArrayList:作为List主要的接口实现类,线程不安全的,执行效率高,底层使用Object[]存储 LinkedList:对于频繁的插入,删除操作,使用此类效率比ArrayList效率高,底层使用双向链表存储 对于数据量大的情况,插入,删除数据,对于ArrayList来说需要数据迁移,效率很低, 使用双向链表,作插入,删除操作,只跟前后两个位置有关。 Vector:作为List接口的古老实现类(不怎么用),线程安全的,效率低,底层使用Object[]存储

  • List接口的常用方法有那些?

    • add(Object 0bj)

    • remove(Object obj)/remove(int index)

    • set(int index,Object obj)

    • get(int index)

    • add(int index,Object obj)

    • size()

    • 遍历:Iterator;foreach;普通的for

  • 如何使用Iterator和增强for循环遍历List?

  • Set存储数据的特点是什么?常见的实现类有什么?

    • HashSet:底层对应HashMap

    • LinkHashSet:LinkHashSetMap

    • TreeSet:TreeMap

  • 什么是枚举类?枚举类的对象声明的修饰符都有那些?

    • 枚举类:类中的对象的个数是确定得到,有限个。

    • public static final
  • 什么是元注解?说说Retention和Target元注解的作用。

    • 元注解:对现有的注解进行解释说明的注解

    • Retention:指明所修饰的注解的生命周期:

      • SOURCE

      • CLASS

      • RUNTINE

    • Target:指定所修饰的Annotation能用于修饰那些程序元素

    • Documented:表示所修饰的注解在被javadoc解析时保留下来

    • Inherited:被它修饰的annotation将具有继承性

  • 什么是集合框架?存储数据的特点是什么?

    • collection接口:单列集合,用来存储一个一个的对象

    • List接口:存储有序的、可重复的数据:动态数组

      • ArrayList、LinkedList、Vector

    • Set接口:存储无序的、不可重复的数据

      • HashSet、LinkedHashSet、TreeSet

    • Map接口:双列集合。用来存储一对(key-value)数据

      • HashMap、LinkedHashMap、TreeMap、Hashtable

  • 比较throw和throws的异同。

    • throw:抛出一个异常对象,使用在方法内部,手动抛出一个异常对象

    • throws:处理异常的方式,使用在方法声明处的末尾,try-catch-finally

    • 两者像是一种递进的关系

  • 对同步代码块中同步监视器和共享数据的理解及各自要求。

    • 同步监视器:俗称锁,

      • 任何一个类的对象都可以充当锁

      • 多个线程共用同一把锁

    • 共享数据:多个线程共同操作的数据

    • 需要使用同步机制将操作共享数据的代码包起来,不能包多了也不能包少了。

集合框架

枚举类

  • 说明:

    • 枚举类:类的对象只有有限个确定的

    • 当需要定义一组常量时,强烈建议使用枚举类

    • 如果枚举类中只有一个对象,则可以作为单例模式的实现方式

  • 如何自定义枚举类?

  • 注解:

    • 框架=注解+ 反射机制 +设计模式

  • 通过反射来进行获取调用注解!前提:要求注解的元注解retation中声明的声明周期状态为:RUNTIME

import java.lang.annotation.*;
​
@Inherited
@Retention(RetentionPolicy.RUNTIME)//指明所修饰的注解的生命周期
public @interface MyAnnotation {
    String value() default "hello";
}
​
/*
1.注解声明为:@interface
2.内部定义成员,通常用value表示
3,可以指定成员的默认值,使用default定义
4.如果自定义注解没成员,表面是一个标识作用
5.说明:
如果注解成员,在使用注解时,需要指明成员的值
自定义注解必须配上注解的信息处理流程(使用反射)才有意义
自定义注解通过都会指明两个元注解:Retention,Target
 */

集合

说明

  • 集合、数组都是对多个数据进行内存层面存储操作的结构,简称java容器

  • 数组在存储多个数据的特点:

    • 初始化后长度确定不能改变

    • 数组定义好,其元素的类型也确定了,只能操作指定类型的数据了,比如:String[] arr; int [] arr; Object arr;

    • 有序、可重复。

    • 数组没有现成的属性或方法可以用,提供的方法有限

  • 集合存储的优点:

    • 解决数组存储数据的缺点。

collection接口

  • 单例集合框架结构

  • collection接口:单列集合,用来存储一个一个的对象

    • List接口:存储有序的、可重复的数据:动态数组

    • 常用的实现类:

    ArrayList、LinkedList、Vector

    • Set接口:存储无序的、不可重复的数据

    • 常用的实现类:

    HashSet、LinkedHashSet、TreeSet

  • Map接口:双列集合。用来存储一对(key-value)数据

    • HashMap、LinkedHashMap、TreeMap、Hashtable

Collection中的List接口

  • ArrayList类的源码分析

//jdk7:
ArrayList list = new ArrayList();//底层创建了长度是10的Object[]数组elementDate
list.add(123);//elementDate[] = new Integer(123);
...
list.add(11);//如果此次的添加导致底层elementDate数组容量不够,则扩容
//1.默认扩容为原来的1.5倍,同时将原来的数组元素复制到新的数组中。
//2.结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity)
//jdk8:
ArrayList list = new ArrayList();//底层Object[]数组elementDate初始化为{},并没有创建长度为10的数组
list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementDate中
...
list.add(11);//如果此次的添加导致底层elementDate数组容量不够,则扩容
//1.默认扩容为原来的1.5倍,同时将原来的数组元素复制到新的数组中。
//2.结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity)
  • 结论:jdk7中AarryList的对象的创建上来就造好数组,jdk8中添加数组的时候才造数组,延迟了数组的创建,节省了内存。

  • LinkedList的源码分析

//jdk8:双向链表
Node<>存放数据的地方,内部类别人不用,自己用:
    private static class Node<E>{
        item;
        Node<E> next;
        Node<E> prev;
        
        Node(Node<E> prev,E element,Node<E> next){
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
    
LinkedList list = new LinkedList();//内部声明了node类型的first和last属性,默认值为null
  • Vector的源码分析

//1.底层都创建了长度为10的数组
//2.扩容长度为原来的2倍

List接口的常用方法

package collection;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
​
/*
常用方法:
增:add(Object obj)
删:remove(int index)  /  remove(Object obj)
改:set(int index ,Object ele)
查:get(int index)
插:add(int index,Object ele)
长度:size()
遍历:1.Iterator迭代器
     2.增强for循环
     3。普通for循环
 */
public class ListTest {
    public void test(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("liuxiang",23));
        list.add(456);
​
        System.out.println(list);
​
        //1.void add(int index,Object ele):在index位置插入ele元素
        list.add(1,"BB");
        System.out.println(list);
​
        //2.boolean addAll(int index,Collection eles):从index位置将eles中所有元素添加
        List list1 = Arrays.asList(1, 2, 3);
        list.addAll(list1);
        System.out.println(list);
        System.out.println(list.size());//9
​
        //3.Object get(int index):获取指定index位置的元素
        System.out.println(list.get(5));
​
        //4.int indexOf(Object obj):返回obj在集合中首次出现的位置,如果不存在返回-1
        int index = list.indexOf(456);
        System.out.println(index);
​
        //5.int lastIndexOf(Object obj):返回obj在集合中最后一次出现的位置
        int index1 = list.lastIndexOf(456);
        System.out.println(index1);
​
        //6.Object remove(int index):移除指定index位置的元素,并返回此元素,相当于重载方法
        Object obj = list.remove(1);
        System.out.println(obj);//返回删除位置的元素
        System.out.println(list);
​
        //7.Object set(int index,Object ele):设置指定index位置的元素为ele
        list.set(1,"LL");
        System.out.println(list);
​
        //8.List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的左闭右开子集合
        List sublist = list.subList(1, 4);
        System.out.println(sublist);
    }
​
​
    //测试
    public static void main(String[] args) {
        ListTest listTest = new ListTest();
        listTest.test();
    }
}
 
  • 练习题

package collection;
​
import java.util.ArrayList;
import java.util.List;
​
public class ListExer {
    public void test(){
        ArrayList list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.remove(2);//删除的是索引的位置2
        list.remove(new Integer(2));//自己新建了一个对象,删除的是值2
        System.out.println(list);
    }
​
    public static void main(String[] args) {
        ListExer listExer = new ListExer();
        listExer.test();
    }
​
}

Set接口的实现类

  • HashSet:作为Set接口的主要实现类,线程不安全的,可以存储null值 LinkedHashSet:作为HashSet的子类,遍历其内部数据时可以按照添加的顺序遍历,对于频繁的遍历,效率要高于HashSet TreeSet:底层使用红黑树存储,添加的元素是同一类new的对象,按照属性进行排序

  • Set接口中没有额外定义新的方法,使用的都是Collection中声明的方法

  • 向Set中添加的数据,其所在类一定要重写hashCode()和equals()方法, 要保持一致性:相等的对象必须要有相等的散列码。

  • 一: 以HashSet为例说明: 1.无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加, 而是根据数据的哈希值决定的。

    2.不可重复性:保证添加的元素是按照equals()判断时,不能返回true,即相同元素只能添加一个。

    二:添加元素的过程:以HashSet为例:底层是数组 向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值, 此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即索引位置),判断: 情况一: 数组此位置上是否已经有元素: 如果此位置上没有其他元素,则元素a添加成功 如果此位置上有其他元素b(或者以链表形式存在多个元素),则比较a与b的hash值: 情况二: 如果hash值不相同,a添加成功 如果hash值相同,进而需要调用元素a所在类的equals()方法: 情况三: equals()返回ture,元素a添加失败 equals()返回false,元素a添加成功

    情况二和三:元素a与其他元素以链表的方式存储,(先到先排,后来后排)

package set;
​
​
import collection.User;
​
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
​
/*
Set接口:存储无序的、不可重复的数据
常用的实现类:
HashSet:作为Set接口的主要实现类,线程不安全的,可以存储null值
  LinkedHashSet:作为HashSet的子类,遍历其内部数据时可以按照添加的顺序遍历
TreeSet:底层使用红黑树存储,添加的元素是同一类new的对象,按照属性进行排序
​
1.Set接口中没有额外定义新的方法,使用的都是Collection中声明的方法
2.向Set中添加的数据,其所在类一定要重写hashCode()和equals()方法,
要保持一致性:相等的对象必须要有相等的散列码。
​
 */
public class SetTest {
    /*
   一: 以HashSet为例说明:
    1.无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,
    而是根据数据的哈希值决定的。
​
    2.不可重复性:保证添加的元素是按照equals()判断时,不能返回true,即相同元素只能添加一个。
​
    二:添加元素的过程:以HashSet为例:底层是数组
    向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,
    此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即索引位置),判断:
    情况一:
    数组此位置上是否已经有元素:
    如果此位置上没有其他元素,则元素a添加成功
    如果此位置上有其他元素b(或者以链表形式存在多个元素),则比较a与b的hash值:
   情况二:
    如果hash值不相同,a添加成功
    如果hash值相同,进而需要调用元素a所在类的equals()方法:
   情况三:
    equals()返回ture,元素a添加失败
    equals()返回false,元素a添加成功
​
   情况二和三:元素a与其他元素以链表的方式存储,(先到先排,后来后排)
​
   重写hashCode()方法中,有31==(i<<5)-1来作为系数,优化算法。
     */
    public void test(){
        HashSet set = new HashSet();
        set.add(456);
        set.add(123);
        set.add(123);
        set.add("AA");
        set.add("cc");
        set.add(new User("liuxiang",23));
        set.add(new User("liuxiang",23));
        set.add(346);
​
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
​
    }
​
​
    //测试
    public static void main(String[] args) {
        SetTest setTest = new SetTest();
        setTest.test();
    }
}
  • TreeSet实现类

package collection;
​
public class User implements Comparable{
    private String name;
    private int age;
​
    public User() {
    }
​
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
​
    //重写equals()
    @Override
    public boolean equals(Object o) {
        System.out.println("User equal()...");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
​
        User user = (User) o;
​
        if (age != user.age) return false;
        return name != null ? name.equals(user.name) : user.name == null;
    }
​
    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
​
    //按照姓名从小到大排,再按价格从小到大排
    @Override
    public int compareTo(Object o) {
        if (o instanceof User){
            User user = (User) o;
            //return this.name.compareTo(user.name);
            //如果两个名字相同,结果输不出,需要重写
            int compare = this.name.compareTo(user.name);
            if (compare != 0){
                return compare;//名字不相等,输出
            }else {
                return Integer.compare(this.age,user.age);
            }
        }else {
            throw new RuntimeException("输入的类型不匹配");
        }
    }
}
​
package collection;
​
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
​
/*
向TreeSet中添加数据,要求相同类的对象
TreeSet:底层使用红黑树(小的在左边,大的在右边)存储,添加的元素是同一类new的对象,按照属性进行排序
自然排序:比较两个对象是否相同的标准为:compareTo()方法,返回0,不再是equals()方法
定制排序:跟(Comparator接口有关):
 */
public class TreeSetTest {
​
    public void test(){
​
        TreeSet set = new TreeSet();
          //举例一
//        set.add(34);
//        set.add(-34);
//        set.add(24);
//        set.add(11);
//        set.add(8);
​
        //举例二:报错:ClassCastException
        //需要进行User implement(继承)Comparable接口重写方法
        set.add(new User("liuxiang",23));
        set.add(new User("duyao",22));
        set.add(new User("jim",26));
        set.add(new User("koko",54));
        set.add(new User("congcong",6));
        set.add(new User("congcong",36));
​
        Iterator iterator = set.iterator();//按从小到大的顺序排列
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
​
    public void test1() {
        Comparator com = new Comparator() {//alt+enter+add method
            //按照年龄从小到大排列
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof User && o2 instanceof User) {
                    User u1 = (User) o1;
                    User u2 = (User) o2;
                    return Integer.compare(u1.getAge(), u2.getAge());
                } else {
                    throw new RuntimeException("输入的数据不一致");
                }
            }
        };
        TreeSet set = new TreeSet(com);//按参数里面的方法进行排序
        set.add(new User("liuxiang", 23));
        set.add(new User("duyao", 22));
        set.add(new User("jim", 26));
        set.add(new User("koko", 54));
        set.add(new User("congcong", 54));//被先占了结果中就无了
        set.add(new User("congcong", 36));
​
        Iterator iterator = set.iterator();//按从小到大的顺序排列
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
​
​
​
    //测试
    public static void main(String[] args) {
        TreeSetTest treeSetTest = new TreeSetTest();
        treeSetTest.test1();
    }
}
  • 对应图示

collection接口常用方法

package collection;
​
import java.util.Objects;
​
public class Person {
    private String name;
    private int age;
//无参有参构造器
    public Person() {
    }
​
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //构造方法
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
    //提供tostring
​
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//重写方法:alt+insert+equals()and hasCode()
​
    @Override
    public boolean equals(Object o) {
        System.out.println("Person equals().....");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
​
        Person person = (Person) o;
​
        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }
​
   // @Override
   // public int hashCode() {
    //    int result = name != null ? name.hashCode() : 0;
    //    result = 31 * result + age;
     //   return result;
   // }
}
​
package collection;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
​
/*
collection接口声明的方法的测试
​
向Collection接口的实现类的对象中添加obj时,要求obj所在类要重写equals()方法
 */
public class CollectionTest {
​
    public void test(){
        Collection coll = new ArrayList();//接口的具体实现类:有序的,可重复的
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
       // Person p = new Person("liuxiang",23);
       // coll.add(p);
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        //1.contains(Object obj)方法:判断当前集合当中是否包含obj
        //我们在判断时会调用obj对象所在类的equals()方法
        boolean contains = coll.contains(123);//结果为true
        System.out.println(contains);
        System.out.println(coll.contains(new String("Tom")));
        //ture,调用的是equals,比的是内容
        //System.out.println(coll.contains(p));//ture
        System.out.println(coll.contains(new Person("liuxiang",23)));
        //false,方法没有重写,调用的Object类,变成true,重写方法:调用equals()方法
​
        //2.containsAll(Collection coll1):判断形参coll1中所有元素是否都存在于当前集合中
        Collection coll1 = Arrays.asList(123,456);
        System.out.println(coll.containsAll(coll1));//判断coll中是否包含coll1中的所有元素
​
    }
​
    public void test1(){
        //3.remove(object obj):从当前集合中移除obj元素
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        coll.remove(123);//删除数据
        System.out.println(coll);
​
        coll.remove(new Person("liuxiang",23));
        System.out.println(coll);//可以移除,因为重写了equals()方法
​
        //4.removeAll(Collection coll1):移除所有元素
        Collection coll1 = Arrays.asList(123,456);
        coll.removeAll(coll1);
        System.out.println(coll);
    }
​
    public void test2(){
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        //5.retainAll(Collection coll1):求交集
        Collection coll1 = Arrays.asList(123,456,789);
        coll.retainAll(coll1);
        System.out.println(coll);
    }
​
    public void test3(){
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        Collection coll1 = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        //6.equals(coll.equals(coll1)):返回boolean值
        System.out.println(coll.equals(coll1));
    }
​
    public void test4(){
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        //7.hashCode():返回当前对象的哈希值
        System.out.println(coll.hashCode());
​
        //8.coll.toArray()集合可以转换为数组
        Object[] arr = coll.toArray();
        //遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
​
        //拓展:数组可以转换为集合,返回的是list类型
        List<String> list = Arrays.asList(new String[]{"aa", "bb", "dd"});
        System.out.println(list);
​
        List<int[]> arr1 = Arrays.asList(new int[]{123, 456});
        System.out.println(arr1);//输出[[I@4554617c],默认一个数组
​
        List<Integer> arr2 = Arrays.asList(new Integer[]{123, 456});
        System.out.println(arr2);//输出[123, 456],用Integer类型变成两个数组
    }
​
    public void test5(){
        //9.iterator():迭代器,返回Iterator接口的实例,用于遍历集合元素,放在IteratorTest.java中测试
    }
    //测试
    public static void main(String[] args) {
        CollectionTest collectionTest = new CollectionTest();
        collectionTest.test4();
    }
}

迭代器iterator

  • iterator():迭代器,返回Iterator接口的实例,用于遍历集合元素,放在IteratorTest.java中测试

package collection;
​
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
​
/*
集合元素的遍历操作,使用迭代器Iterator接口
集合对象每次调用iterator()方法都会得到一个全新的迭代器对象,
默认游标都在第一个元素之前
 */
public class IteratorTest {
​
    public void test(){
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        Iterator iterator = coll.iterator();//得到迭代器对象
        //方式一(不推荐)
       // for (int i = 0; i < coll.size(); i++) {
        //    System.out.println(iterator.next());
       // }
​
        //方式二(推荐):hasNext方法
        while(iterator.hasNext()){
            //next()指针先下移,再返回集合位置上的元素值
            System.out.println(iterator.next());
        }
    }
​
    //测试
    public static void main(String[] args) {
        IteratorTest iteratorTest = new IteratorTest();
        iteratorTest.test();
    }
}

迭代器的执行原理

  • 生成迭代器对象时,就有一个空指针iterator.next(),执行hasNext()判断还有没有下一个元素,指针并下移,iterator对象不是容器,就是一个迭代器,容器还是原先的coll

  • 集合对象每次调用iterator()方法都会得到一个全新的迭代器对象,默认游标都在第一个元素之前

  • 错误写法:


    //错误写法
    public void test1(){
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));
​
        //方式一:会出现输出元素跳转,第一次下一个指针到123时,判断不是null,输出下一个456
        //到最后还有异常:NoSuchElementException
        Iterator iterator = coll.iterator();
        while(iterator.next() != null){
            System.out.println(iterator.next());
        }
​
        //方式二:会一直循环输出123,死循环
        //当判断新的迭代器hasNext()方法是true,输出迭代器的123,循环重复新的迭代器继续输出123
        while(coll.iterator().hasNext()){
            System.out.println(coll.iterator().next());
        }
  • 迭代器中的remove()方法

  • 如果还没有调用next()或者在上一次调用next方法后已经调用了remove()方法,
    再调用remove()会报错:IllegalStateException
//迭代器iterator中的remove()方法
    public void test2(){
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));
​
        Iterator iterator = coll.iterator();
        while(iterator.hasNext()){
            Object obj = iterator.next();//接收每一个元素值
            if ("Tom".equals((obj))){
                iterator.remove();
            }
        }
        //此时指针已经到了最后一个元素,需要重新一个迭代器
        //此时输出结果里面已经没有Tom了
        Iterator iterator1 = coll.iterator();//回到起点
        while(iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
    }

增强型for循环遍历

package collection;
​
import java.util.ArrayList;
import java.util.Collection;
​
/*
增强的for循环: 集合/数组对象.for+enter生成
for ( 集合中元素的类型 局部变量:集合对象)
 */
public class ForTest {
​
    public void test(){
        //遍历集合
        Collection coll = new ArrayList();//接口的具体实现类
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));//string类型
        coll.add(false);//布尔类型
        coll.add(new Person("liuxiang",23));//自定义Person类
​
        //for ( 集合中元素的类型 局部变量:集合对象)
        //内部仍然调用了迭代器
        for (Object o : coll) {
            System.out.println(o);
        }
​
        System.out.println("============================");
        //遍历数组
        int[] arr = new int[]{1,2,3,4,6,7};
        for (int i : arr) {
            System.out.println(i);
        }
​
        System.out.println("==============================");
        //练习题
        String[] arr1 = new String[]{"AA","AA","AA"};
​
        //普通for循环
        //for (int i = 0; i < arr1.length; i++) {
        //    arr1[i] = "GG";//输出GG,拿着本身的数组元素做修改
       // }
​
        //增强for循环
        for (String s : arr1) {//将arr1[i]元素取出来赋值给s
            s = "GG";//将s改变,而没有改变arr1[i]
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
​
    }
​
​
    //测试
    public static void main(String[] args) {
        ForTest forTest = new ForTest();
        forTest.test();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值