单列集合数组和集合的区别
数组的长度是固定的,集合的长度是可变的 数组既可以存储基本数据类型、也可以存储引用数据类型。集合只能存储引用数据类型 单列集合:每次只能存储一个元素 Collection接口是单列集合的最底层(父)接口,定义是所有单列集合中共性的方法、所有的单列集合(所有的子类)都可以使用共性的方法,里面没有带索引的方法 顶层接口/抽象类中的共性的方法,所有的子类都可以使用 底层接口/抽象类,无法创建对象使用,需要使用子类创建对象使用 Collection中的共性方法: public boolean add(E e): 把给定的对象添加到当前集合中 。 public void clear() :清空集合中所有的元素。 public boolean remove(E e): 把给定的对象在当前集合中删除。 public boolean contains(E e): 判断当前集合中是否包含给定的对象。 public boolean isEmpty(): 判断当前集合是否为空。 public int size(): 返回集合中元素的个数。 public Object[] toArray(): 把集合中的元素,存储到数组中。 List接口extends(继承)Collection接口,是Collection的子接口(有序可重复) 1. 是有序的集合(存储和取出的元素顺序相同) 2. 允许存储重复的元素 3. 有索引,可以使用普通的for循环,迭代器,增强for循环 List中特有的方法 public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。 public E get(int index):返回集合中指定位置的元素。 public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。 public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。 ArrayList集合是List接口的实现类(implement) 注意:线程不安全,效率低 底层是数组结构实现的,查询快增删慢 格式:ArrayList<String> list = new ArrayList<String>(); 在JDK 7后,右侧泛型的尖括号之内可以留空,但是<>仍然要写。简化格式: ArrayList<String> list = new ArrayList<>(); 常用方法: public boolean add(E e) : 将指定的元素添加到此集合的尾部 public E remove(int index) :移除此集合中指定位置上的元素。返回被删除的元素。 public E get(int index) :返回此集合中指定位置上的元素。返回获取的元素。 public int size() :返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。 存储基本数据类型 ArrayList对象不能存储基本类型,只能存储引用类型的数据。类似 <int> 不能写,但是存储基本数据类型对应的 包装类型是可以的。所以,想要存储基本类型数据, <> 中的数据类型,必须转换后才能编写,只有 Integer 和 Character 需要特殊记忆,其他基本类型只是首字母大写即可。 LinkedList集合是List接口的实现类(implement) 注意:线程不安全,效率高 底层是链表结构实现的,查询慢增删快 注意:使用LinkedList集合特有的方法,不能使用多态 (添加元素方法) public void addFirst(E e):将指定元素插入此列表的开头。等效于push(E e) public void addLast(E e):将指定元素添加到此列表的结尾。等效于add() public void push(E e):将元素推入此列表所表示的堆栈。 (获取元素方法) public E getFirst():返回此列表的第一个元素。 public E getLast():返回此列表的最后一个元素。 (移除元素方法) public E removeFirst():移除并返回此列表的第一个元素。 public E removeLast():移除并返回此列表的最后一个元素。 public E pop():从此列表所表示的堆栈处弹出一个元素。等效于removeFirst() public boolean isEmpty():如果列表不包含元素,则返回true。 Vector集合List接口的实现类(implement) 底层数据结构是数组,查询快,增删慢。 线程安全,效率低 ArrayList、LinkedList和Vector有什么区别? 相同点:ArrayList和Vector底层都是数组实现的。 不同点:ArrayList和LinkedList都是线程不安全的。速度快、数据不安全!JDK1.2版本出现 Vector是线程安全的。速度慢、数据安全!JDK1.0版本出现 Set接口extends(继承)Collection接口,是Collection的子接口(无序唯一) 1. 不允许存储重复的元素 2. 没有索引,不能使用普通的for循环遍历 只能使用迭代器或者增强for 3. 没有自己特有的方法,基本与 Collection接口中的方法一致 Set集合保证元素唯一性原理 根据元素的哈希值来确定该元素所保存的位置 如果哈希值不同,直接存储 如果哈希值相同,继续比较equals()方法 返回true 不存储 返回false 直接存储 Hashset集合是Set的接口的实现类(implement) 1无序集合(存储的元素和取出的元素顺序有可能不一致) 2底层是哈希表+红黑树结构(查询速度非常快)(无序唯一) 3 不允许存储重复元素 4 没有索引,没有带索引的方法,不能用普通的遍历方法 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals() HashSet集合存储数据的结构(哈希表) Jdk8之前 哈希表=数组+链表 Jdk8之后:哈希表= 数组+链表 哈希表= 数组+红黑树 哈希表的特点:速度快 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出得到地址,不是数据实际存储的物理地址)在Object类有一个方法,可以获取对象的哈希值 Int hashCode() 返回该对象的哈希码值 hashCode方法的源码 Public native int hashCode() Native;代表该方法调用的是本地操作系统的方法 String类哈希值 String重写了Object类的hashCode方法 HashSet存储自定义类型元素 给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一 TreeSet集合是Set的接口的实现类(implement) 1.是有序集合 2.不允许元素重复 LinkedHashSet集合是Set的接口的实现类(implement)有序的集合 底层是哈希表+链表双结构,可以保证元素的存储顺序 1.由链表保证元素有序 2.由哈希表保证元素唯一
集合的遍历方法: 1Iterator迭代器::迭代输出,是使用最多的输出方式。 Iterator it=list.iterator();//创建迭代器对象 while(it.hasNext()){//循环遍历 } 2. for循环 for(int i=0;i<list.size();i++){ } 3.增强for: for(int x : a){ } 简单介绍一下增强for: 增强for: 格式: for(数组或集合的类型 变量名: 数组或集合名){ 直接用变量名 } 好处:简化了数组和集合的遍历
|