JAVA 复习(Think In Java, 4th)-- Holding Your Object

有时我们会看到像这样的代码

List<Robot> robotList = new ArrayList<Robot>();

主要原因,是因为这样便於改变实现接口的方式,比如说 ArrayList 我们不要用了,要换成 LinkedList

List<Robot> robotList = new LinkedList<Robot>();

这时只要修改实现方式的地方即可。因为其它地方都是使用接口 API调的,而接口 List 的 API 都是 ArrayList 及 LinkedList所拥有的,所以不会影响外面的调用。

一次添加多个对象

import java.util.*;
public class Adding {
    public static void main(String[] args) {
        Collection<Integer> ci = new ArrayList<Integer>();
        for(int i = 0; i < 5; i++) {
            ci.add(i);
        }
        ci.addAll(Arrays.asList(1,2,3,4,5));

        Collections.addAll(ci, 1,2,3,4,5);
        printCollection(ci);
    }

    private static void printCollection(Collection<Integer> c) {
        for(Integer a: c) {
            System.out.println(a);
        }
        System.out.println("=============================");
    }
}

同时,使用 Arrays.asList() 方法所取得的 ArrayList 对象不可以再用 add( )方法,因为其 Array 的大小是固定的,如下:

import java.util.*;
public class Adding {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        list.add(6);
        printCollection(list);
    }

    private static void printCollection(Collection<Integer> c) {
        for(Integer a: c) {
            System.out.println(a);
        }
        System.out.println("=============================");
    }
}

如上图,这样便会出现 Runtime Exception

Set

HashSet 是所有的 Set 种类中,搜寻其拥有对象最快的,但对象存放的顺序按其规则; LinkedHashSet存放的顺序按原本对象加入的顺序;而 TreeSet 里的对象是经过排序的

Map

HashMap 和 HashSet 一样,搜寻对象的速度是最快;TreeMap 是有顺序的存放对象;而 LinkedHashMap 搜寻速度和 HashMap一样,但是所存放的对象是按加入的顺序去存放的。

List

有二种 List 一种是 ArrayList,强项在於随机存取所拥有对象的速度,而在新增及移除 ArrayList 中间的对象,其效率就不怎麽高;而另一种 LinkedList, 优化的有序存取,对LinkedList
中间的对象做新增和移除时,成本不高,但弱项在於随机存取。

Iterator

当你不知该用 Set或 List来实现时数据结构,或中途有可能改变实现方式时, Iterator便是你的好选择,Iterator又称为轻量的对象(Lightweight Object),使用的成本低,同时, Iterator可无视对象群所在的数据结构实现方式而遍历过一群对象,

import java.util.*;
public class Adding {
    public static void main(String[] args) {
        Collection<Integer> ci = new ArrayList<Integer>();
        ci.addAll(Arrays.asList(1,2,3,4,5));
        List<Integer> list = Arrays.asList(1,2,3,4,5);

        Iterator<Integer> it = list.iterator();
        Integer curValue;
        while(it.hasNext()) {
            curValue = it.next();
            System.out.println(curValue);
        }
    }
}

foreach 和 Iterator

我们常用 foreach 的方式遍历数组,但是我们同时也可以用 foreach 去遍历 ArrayList 等 Collection的子类 class,那是因为 Collection 继承了
Iterable 接口,因此,只要我们的类是继承或是实现了 Iterable 接口,那我们的类也能被 foreach 遍历了,如下:

import java.util.Iterator;

public class holdIterable implements Iterable<String> {
    private String[] mStrArray = "I am a fighter, and nothing will change that!".split(" ");

    @Override
    public Iterator<String> iterator() {
        return new Iterator<String>() {
            private int mIndex = 0;

            @Override
            public boolean hasNext() {
                return mIndex < mStrArray.length;
            }

            @Override
            public String next() {
                return mStrArray[mIndex++];
            }

            @Override
            public void remove() {
                System.out.println("not support remove function");
            }
        };
    }

    public static void main(String[] args) {
        for(String str: new holdIterable()) {
            System.out.println(str);
        }
    }
}

要注意的是,foreach 虽然可以遍历数组及 Iterable接口实现/继承类(Map不是,所以不能用 foreach 遍历),但是数组并不是 Iterable,我们可用下面的代码去测试:

import java.util.*;

public class ArrayIsNotIterable {
    public static<T> void test(Iterable<T> ib) {
        for(T t: ib) {
            System.out.println(t + "");
        }
    }

    public static void main(String[] args) {
        test(Arrays.asList(1,2,3));
        String[] strings = {"A","B","C"};
        // test(strings); --> 编绎错误
        for(String a: strings) {
            System.out.println(a);
        }
    }
}

test(strings); 若编绎的话,因为数组不是 Iterable 则会产生编绎错误如下:

时间: 2024-10-10 16:34:34

JAVA 复习(Think In Java, 4th)-- Holding Your Object的相关文章

java复习基础知识——java保留字

ava 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum,extends, final, finally, float, for, if, implements, import, instanceof, int, interface, long, native, new, pack

大四Java复习笔记之Java基础

一.static和final 学习Java那么久,好像自己就没有怎么用过final,所以对fianl的理解不够.final不但出现在变量的修饰里面,还可以出现在方法和类的修饰.final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.final方法锁定方法,子类不能覆盖修改方法,同时方法会高效.final变量final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变,final是指引用的变量不能不能变,但是引用所指向的对象中的内容可以变,同时如果是null的

java复习整理之集合

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.ios培训..Net培训</a>.期待与您交流!------ java复习整理之集合: Collection:集合中的最顶层接口,提供了一些操作集合的共性方法添加:boolean add(E e)boolean addAll(Collection<? extends E> c)删除:void

Java复习第一天---Javascript的基本知识点

1.HelloWord: 2.基础语法: 3.嵌入HTML 借助window.onload事件在整个窗体载入完毕之后运行程序代码 4.事件驱动: 5.DOM操作 5.1 查找元素节点 5.1.1 依据id值 方法:document.getElementById(id值) 获取到的是一个元素节点 var bj = document.getElementById("bj"); alert(getText(bj)); 5.1.2 依据标签名 方法:document.getElementsBy

复习 深入理解Java面向对象程序设计1

复习 深入理解Java面向对象程序设计 类是一种抽象的概念,对象是类的一种具体表示形式,是具体的概念.先有类,然后由类生成对象(Object).对象又叫做实例(Instance). 类由两大部分构成:属性及方法.属性一般用名词来表示,方法一般用动词来表示. 如果一个Java源文件定义了多个类,那么这些类中最多只有一个类是public的,换句话说,定义的多个类可以都不是public的. 在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方式统一是传值(pass by

Java复习第四天---IO流

File类测试 //根据指定的文件名和路径创建File对象 File file = new File("myFile.txt"); //file.exists();检测文件是否存在 boolean exists = file.exists(); System.out.println(exists); //按照file对象指定的路径和文件名创建一个新的文件 file.createNewFile(); exists = file.exists(); System.out.println(e

Java复习第二天---JavaSE基础

[1]以下关于 JVM 的叙述,哪些项正确? A.JVM 运行于操作系统之上,它依赖于操作系统 B.JVM 运行于操作系统之上,它与操作系统无关 C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件 D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件 扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件 扩展名为.class的是字节码文件(二进制):系统运行时执行的文件 [2]下列选项中正确的表达式是: A.byte b = 128; 

java 复习001

java 复习001 比较随意的记录下我的java复习笔记 ArrayList 内存扩展方法 分配一片更大的内存空间,复制原有的数据到新的内存中,让引用指向新的内存地址 ArrayList在内存不够时默认是扩展为1.5倍 + 1个 ArrayList,LinkedList,Vector 区别 Vector内存扩展和ArrayList一样,不过Vector是默认扩展为2倍 Vector支持线程的同步,因此牺牲了访问性能 ArrayList,Vector都是使用数组实现,插入删除效率低 Linked

java复习汇总之面试篇

这些个人感觉都是基础,希望看的园友不要喷. 1.什么是servlet线程安全,如何解决? 2.spring事物管理,在项目中你是怎么管理事物的? 3.java中的有几种线程? 4.java有几种锁? 5.怎么理解java中的多态,项目中何时用到抽象类? 6.如何处理js,sql注入? 7.struts2拦截器的原理? 8.如何理解spring AOP? 11.java中常用的集合,在项目中用到时,有什么需要注意的? 12.如果优化项目中sql,为什么要那样优化? 13.java性能优化? 14.