在线学习软件开发网站建设,十大网站建设公司,网络文学网站开发,西安做网站设计的公司文章目录 Java集合1.2 流程图关系1.3 底层实现1.4 集合与数组的区别1.4.1 元素类型1.4.2 元素个数 1.5 集合的好处1.6 List集合我们以ArrayList集合为例1.7 迭代器的常用方法1.8 ArrayList、LinkedList和Vector的区别1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性1.… 文章目录 Java集合1.2 流程图关系1.3 底层实现1.4 集合与数组的区别1.4.1 元素类型1.4.2 元素个数 1.5 集合的好处1.6 List集合我们以ArrayList集合为例1.7 迭代器的常用方法1.8 ArrayList、LinkedList和Vector的区别1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性1.8.2 多线程场景下如何使用 ArrayList1.8.3 为什么 ArrayList 的 elementData 加上 transient 修饰 1.9 Set集合的特点1.9.1 说一下 HashSet 的实现原理1.9.2 HashSet如何检查重复HashSet是如何保证数据不可重复的 1.10 TreeSet对元素进行排序的方式1.11 ListSetMap集合的特点 区别1.12 HashMap和Hashtable的区别1.3 HashSet 与 HashMap的区别 Java集合
1.2 流程图关系 1.3 底层实现
ArrayList底层是数组 默认长度为0调用add以后看情况不指定长度默认长度为10
ArrayList的扩容机制_arraylist扩容-CSDN博客
LinkedList底层是链表
Vector底层是数组
HashSet底层是哈希表
TreeSet红黑树
HashMap数组链表
Hashtable数组链表
LinkedHashMap数组链表红黑树
1.4 集合与数组的区别
1.4.1 元素类型
集合引用类型存储基本类型是自动装箱
数组基本类型、引用类型
1.4.2 元素个数
集合不固定、可任意扩展
数组固定不能改变容量
1.5 集合的好处
不受容器大小限制可以随时添加、删除元素提供了大量操作元素的方法判断、获取等
List集合
List集合的特点
可重复性可以添加相同的元素、有序存取顺序相同
List的主要方法有
add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty
1.6 List集合我们以ArrayList集合为例
ArrayList集合
java.util.ArrayList是大小可变的数组的实现存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。ArrayList中可以不断添加元素其大小也自动增长。
java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢查找快由于日常开发中使用最多的功能为查询数据、遍历数据所以ArrayList集合是最常用的集合。
泛型即泛指任意类型幼教参数化类型对具体类型的使用起到辅助作用类似于方法的参数
1.7 迭代器的常用方法
next()返回迭代的下一个元素
hasNext()如果仍有元素可以迭代则返回true
注意列表迭代器是List体系独有的遍历方式可以在对集合遍历的同时进行添加、删除等操作
但是必须通过调用列表迭代器的方法来实现
1.8 ArrayList、LinkedList和Vector的区别 线程同步Vector线程安全ArrayList线程不安全因为Vector的实现有synchronized锁 效率问题Vector效率低ArrayList效率高 增长数量Vector以2倍增长ArrayList以1.5倍增长
1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性
(1) ArrayList和Vector使用数组存储元素LinkedList使用链表存储元素
(2) ArrayList和Vector插入删除数据时需要搬运数据效率较差LinkedList使用链表不需要搬运数据效率高。
(3) ArrayList和Vectory查询时按数组下标查询不需要遍历效率高LinkedList需要遍历查询效率底。
1.8.2 多线程场景下如何使用 ArrayList
ArrayList 不是线程安全的如果遇到多线程场景可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样
ListString synchronizedList Collections.synchronizedList(list);
synchronizedList.add(aaa);
synchronizedList.add(bbb);
for (int i 0; i synchronizedList.size(); i) {System.out.println(synchronizedList.get(i));
}1.8.3 为什么 ArrayList 的 elementData 加上 transient 修饰
ArrayList 中的数组定义如下
private transient Object[] elementData;public class ArrayListE extends AbstractListEimplements ListE, RandomAccess, Cloneable, java.io.Serializable可以看到 ArrayList 实现了 Serializable 接口这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化重写了 writeObject 实现
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{*// Write out element count, and any hidden stuff*int expectedModCount modCount;s.defaultWriteObject();*// Write out array length*s.writeInt(elementData.length);*// Write out all elements in the proper order.*for (int i0; isize; i)s.writeObject(elementData[i]);if (modCount ! expectedModCount) {throw new ConcurrentModificationException();
}每次序列化时先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素然后遍历 elementData只序列化已存入的元素这样既加快了序列化的速度又减小了序列化之后的文件大小。
1.9 Set集合的特点
不可重复元素具有唯一性、无序元素的存取顺序是不固定的
Set的主要方法有
add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty
HashSet内部的数据结构是哈希表是线程不安全的。
HashSet中保证集合中元素是唯一的方法通过对象的hashCode和equals方法来完成对象唯一性的判断。
如果对象的hashCode值不同则不用判断equals方法就直接存到HashSet中。
如果对象的hashCode值相同需要用equals方法进行比较如果结果为true则视为相同元素不存如果结果为false视为不同元素进行存储。
注意如果元素要存储到HashCode中必须覆盖hashCode方法和equals方法。
TreeSet可以对Set集合中的元素进行排序是线程不安全的。
**TreeSet:**中判断元素唯一性的方法是根据比较方法的返回结果是否为0如果是0则是相同元素不存如果不是0则是不同元素存储。
1.9.1 说一下 HashSet 的实现原理
HashSet 是基于 HashMap 实现的HashSet的值存放于HashMap的key上HashMap的value统一为PRESENT因此 HashSet 的实现比较简单相关 HashSet 的操作基本上都是直接调用底层 HashMap 的相关方法来完成HashSet 不允许重复的值。
1.9.2 HashSet如何检查重复HashSet是如何保证数据不可重复的
向HashSet 中add ()元素时判断元素是否存在的依据不仅要比较hash值同时还要结合equles 方法比较。 HashSet 中的add ()方法会使用HashMap 的put()方法。
HashMap 的 key 是唯一的由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key并且在HashMap中如果K/V相同时会用新的V覆盖掉旧的V然后返回旧的V。所以不会重复 HashMap 比较key是否相等是先比较hashcode 再比较equals 。
以下是HashSet 部分源码
private static final Object PRESENT new Object();
private transient HashMapE,Object map;
public HashSet() {map new HashMap();
}
public boolean add(E e) {// 调用HashMap的put方法,PRESENT是一个至始至终都相同的虚值return map.put(e, PRESENT)null;
}1.10 TreeSet对元素进行排序的方式
元素自身具备比较功能即自然排序需要实现Comparable接口并覆盖其compareTo方法。
元素自身不具备比较功能则需要实现Comparator接口并覆盖其compare方法。
注意LinkedHashSet是一种有序的Set集合即其元素的存入和输出的顺序是相同的。
1.11 ListSetMap集合的特点 区别
List、Set、Map 是否继承自 Collection 接口List、Map、Set 三个接口存取元素时各有什么特点
Java 容器分为 Collection 和 Map 两大类Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、ListMap接口不是collection的子接口。
Collection集合主要有List和Set两大接口
List一个有序元素存入集合的顺序和取出的顺序一致容器元素可以重复可以插入多个null元素元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。 Set一个无序存入和取出顺序有可能不一致容器不可以存储重复元素只允许存入一个null元素必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。 Map是一个键值对集合存储键、值和之间的映射。 Key无序唯一value 不要求有序允许重复。Map没有继承于Collection接口从Map集合中检索元素时只要给出键KEY对象就会返回对应的值对象。
Map 的常用实现类HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap
关系图如下
1.12 HashMap和Hashtable的区别 线程同步Hashtable线程安全HashMap线程不安全 效率问题Hashtable效率低HashMap效率高 HashMap可以使用null作为keyHashtable不可以使用null为key HashMap使用的是新实现继承AbstractMap而Hashtable是继承Dictionary类实现比较老 Hash算法不同HashMap的hash算法比Hashtable的hash算法效率高 HashMap把Hashtable的contains方法去掉了改成containsValue和containsKey。因为contains方法容易让人引起误解。 取值不同HashMap用的是Iterator接口而Hashtable中还有使用Enumeration接口
1.3 HashSet 与 HashMap的区别