9、java集合

1、什么是java集合

java集合是用来存储多个数据引用的数据类型。

2、java集合分类

java集合类在java.util包下
集合的顶层接口有Collection,Map,Iterator。
其中Collection中有两个子接口List和Set。


java集合结构.png
java集合类图.png

3、list

list为有序可重复的集合。常见子类有:

  • ArrayList: 基于动态数组实现,支持下标访问。数据的修改和查询快。

  • Vector:与ArrayList类似,但是是线程安全的。

  • LinkedList:基于双向链表实现,只能顺序访问,数据的添加和删除效率较高。

  • CopyOnWriteArrayList:线程安全,读写分离的集合,读的性能较高,适用于读多写少的场景。缺点:内存占用高,读操作不能读取到实时数据。

3.1 ArrayList的扩容:

扩展:ArrayList动态数组初始默认大小为10,当不够存储时,会按旧容量1.5倍进行扩容。使用的是Arrays.copyOf()方法。

3.2 ArrayList序列化:

ArrayList的序列化时,因为动态数组中数据可能没有存满,所有不能直接对数组中的数据进行序列化,ArrayList将动态数组用transient,让其不被序列化,然后ArrayList 实现了 writeObject() 和 readObject() 来控制只序列化数组中有元素填充那部分内容。序列化时需要使用 ObjectOutputStream 的 writeObject() 将对象转换为字节流并输出。而 writeObject() 方法在传入的对象存在 writeObject() 的时候会去反射调用该对象的 writeObject() 来实现序列化

3.3 Vector的替代方案:

因为vector的效率不是很高,可以使用 Collections.synchronizedList(); 得到一个线程安全的 ArrayList。

List list = new ArrayList<>();
List synList = Collections.synchronizedList(list);

4、set

set为无序不可重复的集合。

1、那我们怎么来判定元素是否重复呢?
2、通过equals来比较的话,我们如果要插入一万条数据,
   那我们没插入一条数据都要跟已有的数据做equals比较吗?
3、hashcode存在的价值??
哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。用以快速定位寻址存储的对象。

4、hashcode与equals 怎么联合起来工作的?
   整个处理流程是:

      1、判断两个对象的hashcode是否相等,
         若不等,则认为两个对象不等,完毕,
         若相等,则比较equals。

      2、若两个对象的equals不等,则可以认为两个对象不等,否则认为他们相等。
5、hascode与equals的关系

      如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。

      如果x.equals(y)返回“false”,
      那么x和y的hashCode()有可能相等,也有可能不等。

set有三个常用的子类分别为 Hashset,LinkedHashSet,TreeSet

  • HashSet是使用哈希表(hash table)实现的,其中的元素是无序的。HashSet的add、remove、contains方法 的时间复杂度为常量O(1)。

  • TreeSet基于红黑树实现。TreeSet中的元素是可排序的,但add、remove和contains方法的时间复杂度为O(log(n))。TreeSet还提供了first()、last()、headSet()、tailSet()等方法来操作排序后的集合。

  • LinkedHashSet介于HashSet和TreeSet之间。它基于一个由链表实现的哈希表,保留了元素插入顺序。LinkedHashSet中基本方法的时间复杂度为O(1)。

5.Map

Map是以键值对的方式来存储数据。常见的子类有HashMap,HashTable,ConcurrentHashMap,LinkedHashMap。

  • hashMap 采用key-value形式存储数据,key唯一不可重复,且可以为null。
  • hashTable: 与HashMap类似,线程安全。
  • ConcurentHashMap:与HashMap类似,采用了分段锁(Segment),多个线程可以同时访问不同分段锁上数据,并发处理能力更高。
  • LinkedHashMap :内部通过双向链表实现,会保留Map的插入顺序
  • TreeMap :TreeMap基于红黑树的实现,因此它要求一定要有key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。在put操作时,基于红黑树的方式遍历,基于comparator来比较key应放在树的左边还是右边,如找到相等的key,则直接替换掉value。
  • WeakHashMap :主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收

6、java泛型

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

你可能感兴趣的:(9、java集合)