持有对象-1

泛型和类型安全的容器

ArrayList可以当做刻意扩展自身尺寸的数组

不用泛型的话,ArrayList可以用add方法添加不同的对象,也可以用get方法取出对象,但是对象类型是Object,你需要向下转型。在运行时如果你试图将得到的对象转型为不同的类型时,比如将A对象转换为B,就会有运行时异常

使用Java泛型来创建类会非常复杂。但是,应用预定义的泛型通常会很简单。例如,要想定义用来保存对象的ArrayList,你可以声明ArrayList <类名>,而不仅仅只是ArrayList,其中尖括号括起来的是类型参数(可以有多个),它指定了这个容器实例可以保存的类型。通过使用泛型,就可以在编译期防止将错误类型的对象放置到容器中,将运行期的错误转义到编译期。其次,在将元素取出的时候,也不用进行类型转换了,因为List知道他保存的是啥类型。这样,通过泛型,你不仅知道编译器将会检查你放置道容器中的对象的类型,而且在使用同容器中的对象时,可以使用更清晰的语法。

当你指定某个类型作为泛型参数的时候,你不仅限于将确切类型的对象放置到容器中,向上转型也可以像做作用于其他类型一样作用于泛型

基本概念

Java容器类类库的用途是保存对象,并将其划分为来两个不同的概念,是两个接口

Collection,一个独立元素的序列,这些元素要服从一条或多条规则,List必须按照插入的顺序保存元素,而set不能有重复元素,queue按照排队规则来确定对象产生的顺序并且通常与它们被插入的顺序相同

Map,一组成对的 键值对 对象,允许你用键来查找值。ArrayList允许 你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起。映射表map允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义,一样。Map是强大的编程工具。

尽管并非总是这样,但是在理想情况下,你编写的大部分代码都是在与这些接口打交道,并且你唯一需要指定所使用的精确类型的地方就是在创建的时候。因此,你可以像这样创建一个List: List<Apple> apples = new ArrayL ist<Apple>();
 注意,ArrayList已经被向上转型为List,这与前一个示例中的处理方式正好相反。使用接口的目的在于如果你决定去修改你的实现,你所需的只是在创建出修改它,就像这样: List<Apple> apples = new Linkedlist<apple>();
 
因此,你应该创建一个具体类的对象,将其转型为对应的接口,然后在其余的代码中都使用这个接口。
 
这种方式并非总能奏效,因为某些类具有额外的功能,例如,LinkedList具有 在List接口中未包含的额外方法,而TreeMap也具有在Map接口中未包含的方法。如果你需要使用这些方法,就不能将它们向上转型为更通用的接口。
 
Collection接口概括了序列的概念一 种存放一组对象的方式。

List

当确定某一个元素时候属于一个List,发现某个元素的索引,以及移除一个元素时,都会用到equals() ,方法。对与其他的类,这个方法可能有所不同,因此为了防止意外,必须意识到,List的行为会根据这个方法的行为而有所变化

ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。

LinkedList使用了循环双向链表数据结构。与基于数组的ArrayList相比,这是两种截然不同的实现技术,这也决定了它们将适用于完全不同的工作场景。

猜你喜欢

转载自www.cnblogs.com/QianYue111/p/10217161.html