持有对象——Java中的容器(一)

  1. 泛型和类型安全的容器

    1. 使用Java SE5之前,编译器允许向容器中插入不正确的类型,Java SE5引入泛型之后,应用预定义的泛型可以在编译期防止将错误类型的对象放到容器中。
  2. 基本概念
    • Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入顺序保存元素,Set不能保存重复元素,Queue按照排队规则来确定对象产生的顺序(通常与他们插入的顺序相同)。
    • Map。一组成对的“键值对”对象,允许使用键来查找值。其中键不能重复,否则键对应的值会被覆盖。
      • HashMap——提供了最快的查找技术,也没有按照任何明显的顺序来保存元素;
      • TreeMap——按照比较结果的升序来保存键;
      • LinkedHashMap——按照插入顺序保存键,同时还保留了HashMap的查询速度。
  3. List。List可以将元素维护在特定的序列中。List包含两个子类:ArrayList和LinkedList。
    • ArrayList——随机访问较快,但是在中间插入和移除元素较慢;
    • LinkedList——随机访问较慢,但是在List中间插入和移除元素较快,同时提供了优化的顺序访问机制。LinkedList还添加了可使其用作栈、队列和双端队列的方法。
  4. Set。Set不保存重复元素。Set中最长被使用的是测试归属性,因此查找成了Set中最重要的操作。Set具有与Collection完全一样的接口。
    • HashSet——使用了散列,所以HashSet具有较快的查找速度;
    • TreeSet——将元素存储在红-黑树数据结构中,保持一定的顺序;
    • LinkedHashSet——也使用了散列,同时使用了链表来维护元素的插入顺序。
  5. 迭代器——Iterator(只能单向移动)迭代器能够将遍历序列的操作与序列底层的结构分离;迭代器统一了对容器的访问方式。
    • 使用方法iterator()要求容器返回一个Iterator;
    • 使用next()获取序列中的下一个元素;
    • 使用hasNext()检查序列中是否还有元素;
    • 使用remove()将迭代器新近返回的元素删除。
  6. ListIterator——只能用于各种List类的访问
    • ListIterator可以双向移动;
    • 它可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素;
    • 通过listIterator()可以产生一个指向List开始处的ListIterator;
    • 通过listIterator(n)可以产生一个指向List列表索引为n的元素处的ListIterator。
  7. Stack——“栈”通常是指“后进先出”(LIFO)的容器
    • 由于LInkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。
    • 但是如果只是想使用栈的功能,最好能组合LinkedList实现而不是继承或直接用LinkedList代替,避免引入LinkedList的其他方法(Java1.0设计就犯了这个错误)
public class Stack<T> {
  private LinkedList<T> storage = new LinkedList<T>();
  public void push(T v) { storage.addFirst(v); }
  public T peek() { return storage.getFirst(); }
  public T pop() { return storage.removeFirst(); }
  public boolean empty() { return storage.isEmpty(); }
  public String toString() { return storage.toString(); }
}
  1. Queue——队列是一个典型的先进先出(FIFO)的容器(队列在并发编程中特别重要)。

    • LinkedList提供了方法支持队列的行为,并且实现了Queue接口,因此是Queue的一种实现;
    • offer():在队尾插入元素;
    • peek()和element()都将在不移除的情况下返回队头;
    • poll()和remove()方法将移除并返回队头;
    • 区别在于当队列为空时,peek()和poll()返回null,而element()和removed()会抛出NoSuchElementException异常。
  2. PriorityQueue——可排序队列
    • PriorityQueue默认的排序将使用对象在队列中的自然顺序,但你可以通过提供自己的Comparator来修改顺序。
  3. Collection和Iterator(略)
  4. Foreach与迭代器
    • foreach语法主要用于数组,但也可以应用于任何Collection对象。之所以如此,是因为Java SE5引入了Iterable接口,该接口包含一个iterator()方法能产生Iterator对象,并且Iterable接口被foreach用来在序列中移动,因此你创建任何实现Iterable的类,都可以使用foreach语句。

原文地址:https://www.cnblogs.com/zhuxiong/p/8261073.html

时间: 2024-10-11 12:34:47

持有对象——Java中的容器(一)的相关文章

初识Java中的容器

记得第一次听到java中的容器是一个师哥说的,当时听着十分神秘.那么今天就来揭开那层神秘的面纱. 首先什么是容器呢? 在书写程序的时候,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中.由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都要能能提供方便的查询.遍历.修改等基本接口功能. 早期的OOP语言都通过数组的方式来实现对引用集的集中管理和维护. 但是数组方式下,数组大小需要提前被确定,并不允许修改大小,导致其作为

java中的容器解释

解释一:容器(Container)Spring 提供容器功能,容器可以管理对象的生命周期.对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称.如何产生(Prototype 方式或Singleton 方式).哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系.换个更直白点的说明方式:容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在

Java中的容器(集合)之HashMap源码解析

1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是一个以键值对存储的容器. hashMap底层实现为数组+链表+红黑树(链表超过8时转为红黑树,JDK7为数组+链表). HashMap会根据key的hashCode得到对应的hash值,再去数组中找寻对应的数组位置(下标). hash方法如下: static final int hash(Object key

持有对象:总结JAVA中的容器,迭代器

JAVA使用术语“Collection”来指代那些表示集合的对象,JAVA提供的接口很多,首先我们先来记住他们的层次结构: java集合框架的基本接口/类层次结构 java.util.Collection [I] +--java.util.List [I] +--java.util.ArrayList [C] +--java.util.LinkedList [C] +--java.util.Vector [C] +--java.util.Stack [C] +--java.util.Set [I

Java中集合类容器初步了解

容器(Collection) 数组是一种容器,集合也是一种容器 java编程中, 装其他各种各样的对象(引用类型)的一种东西, 叫容器 (图书馆里所有的书, 要想管理图书馆里所有的书, 就需要先把这些书放到一个东西里面, 目前掌握的知识来说, 只能是数组, 数组的长度是固定的, 这就出现 一个问题, 数组的长度该定义成多长 ? 长度是不固定的, 因为不知道有多少本书, 这个时候需要这样一种机制: 定义一种东西, 长度不固定, 可以随时添加和删除, 这种东西就是Collection, 只要不超出内

Java中的容器(集合)

1.Java常用容器:List,Set,Map List: 继承了Collection接口(public interface List<E> extends Collection<E> ),有序且允许出现重复值. Set: 继承了Collection接口(public interface Set<E> extends Collection<E> ),无序且不允许出现重复值. Map: 是一个使用键值对存储的容器(public interface Map<

java中一些容器底层的数据结构解析

先来看一个java里一些主要容器的继承图: 然后分别解析一下上面几种容器底层的数据结构以及一些实现: 1.ArrayList(非线程安全的) 底层的数据结构其实就是数组,但是它比数组优秀的地方在于他是动态的,即不必像数组那样固定大小,那么他是如何实现这种数据结构是数组,但是给我们看起来确实不固定大小的呢? ArrayList 是通过将底层 Object 数组复制的方式(System.arraycopy方法)来处理数组的增长: 当ArrayList 的容量不足时,其扩充容量的方式:先将容量扩充至当

说说java中传容器某些情况下失效

楼主今天写个方法移除map集合中的空值,遇到个问题,就是对容器操作后,发现失效了:先上代码 public static void removeValueNullAndEmpty(Map<String,String> A) { Map<String,String> B = new HashMap<>(); for(String key : B.keySet()){ if(A.get(key) != null || !"".equals(A.get(ke

Java中的容器的简单运用

如标题,就是我要说的,至于好不好用,只有看了才知道 在JavaWeb中,使用最多的容器莫过于List,Map,所以本文只围绕这两个容器的运用进行说明,那么这两个容器又衍生了常用的ArrayList,HashMap,List<Map<String,Object>> 对于List 情境一:出现在使用纯jsp编写的项目中 此时它会直接在页面使用,比如我们在数据库中取数据时,我们通常会取出数据库的数据,然后构造成List以便于页面取值显示. 1 ResultSet rs = null; 2