飞道的博客

Day04-Collection接口和自动装箱

377人阅读  评论(0)

自动拆箱和装箱

Java中的数据分为基本数据类型与引用数据类型,复习一遍:
  基本数据类型:byte,short,int,long,float,double,char,boolean
  引用数据类型: 数组、类、接口、(Lambda表达式)
  作为面向对象的编程语言,为了让基本数据类型能够更符合Java的生态,基本数据类型对应的包装类应运而生

JDK5后,Java提供了基本数据类型和它对应的包装类的互相转换,被称为自动拆箱装箱

自动装箱

Integer i =100;

上述代码中,Java自动为我们完成了 int -> Integer 的类型转换,这就是自动装箱的一个实例
debug,断点追踪后,发现是自动调用了Integer类的valueOf(int)方法,源码如下:

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

  这里有一个细节需要注意,我们发现了一个定义为IntegerCache的对象,继续查看这个类的官方注解:

  • Cache to support the object identity semantics of autoboxing for values between -128 and 127 (inclusive) as required by JLS.

  阅读源码后,显而易见的是,Java对高频出现的 [ -128,127 ]这些int类型的数据,直接使用静态代码块初始化,定义在常量池中,支持更快速地读取和转换,意为cache。

自动拆箱

 Integer i = Integer.valueOf(3);
 int value = i;

自动拆箱的代码很简单,调用Number类的intInteger方法即可

/**
     * Returns the value of this {@code Integer} as an
     * {@code int}.
     */
    public int intValue() {
        return value;
    }

Collection

  Collection层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

以上摘自Java 官方文档1.6
我们通常认为Collection下的三个子接口应该着重被学习:List、Set、Queue

Collection中所有的方法如下:每一种都需要熟练掌握,但是往往在它的实现类中,会有实现类特有的效果相近甚至是相同的方法,注意辨别

        boolean add (E e)
        确保此 collection 包含指定的元素(可选操作)。
        boolean addAll (Collection < ? extends E > c)
        将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
        void clear ()
        移除此 collection 中的所有元素(可选操作)。
        boolean contains (Object o)
        如果此 collection 包含指定的元素,则返回 trueboolean containsAll (Collection < ? > c)
        如果此 collection 包含指定 collection 中的所有元素,则返回 trueboolean equals (Object o)
        比较此 collection 与指定对象是否相等。
        int hashCode ()
        返回此 collection 的哈希码值。
        boolean isEmpty ()
        如果此 collection 不包含元素,则返回 true。
        Iterator<E> iterator ()
        返回在此 collection 的元素上进行迭代的迭代器。
        boolean remove (Object o)
        从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
        boolean removeAll (Collection < ? > c)
        移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
        boolean retainAll (Collection < ? > c)
        仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
        int size ()
        返回此 collection 中的元素数。
        Object[] toArray ()
        返回包含此 collection 中所有元素的数组。 
		<T > T[]toArray(T[]a)
        返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

迭代器

实现这个接口允许对象成为 “foreach” 语句的目标(from JDK5)

Iterator是一个接口,需要使用它的实现类。Collection接口中有一个Iterator方法,返回的就是它的迭代器对象。

迭代器有三个常用方法

 	boolean hasNext() 
         	 如果仍有元素可以迭代,则返回 true。 
 	E next() 
          	返回迭代的下一个元素。 
 	void remove() 
         	 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 

下面简单演示迭代器的使用,遍历输出集合的内容:

	Iterator<String> iterator = collections.iterator();

	while (iterator.hasNext()){
    	System.out.println(iterator.next());
	}

其实除了使用迭代器,for-each循环也可以达到相同的效果:


        for (Object o : collection) {
            System.out.println(o);
        }

转载:https://blog.csdn.net/weixin_44413608/article/details/106165943
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场