java集合类,List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet),Map集合比较

ArrayListLinkedListVector都属于List

 

List:元素是有顺序的,元素可以重复因为每个元素有自己的角标(索引)

  |-- ArrayList:底层是数组结构,特点是:查询很快,增稍微慢点,线程不同步:A线程将元素放在索引0位置,CPU调度线程A停止,B运行,也将元素放在索引0位置,当AB同时运行的时候Size就编程了2.

 

  |-- LinkedList:底层使用的是链表数据结构,特点是:增删很快,查询慢。线程不安全,线程安全问题是由多个线程同时写或同时读写同一个资源造成的。

 

  |--Vector:底层是数组数据结构,线程同步,Vector的方法前面加了synchronized关键字,被ArrayList代替了,现在用的只有他的枚举。

 

Set:元素是无序的,且不可以重复(存入和取出的顺序不一定一致),线程不同步。set底层是使用Map实现的,故可以通过ConcurrentHashMap的方式变通实现线程安全的Set

|--HashSet:底层是哈希表数据结构。根据hashCodeequals方法来确定元素的唯一性。

hashCodeequals:作用一样,都是用来比较两个对象是否相等一致。

equals比较的比较全面,而利用hashCode()进行对比,则只要生成一个hash值进行比较久可以了,效率高。

equal()相等的两个对象他们的hashCode()肯定相等,也就是equal()是绝对可靠的。

  hashCode()相等的两个对象他们的equal()不一定相等,hashCode()不是绝对可靠的。

当两个对象需要对比的时候,首先用hashCode()去对比,如果不一样,则表示这两个对象肯定不相等(也就不用再比较equal(0)了),如果hashCode()相同,再比较equal(),如果equal()相同,那两个对象就是相同的。

 

  |--TreeSet:可以对Set集合中的元素进行排序(自然循序),底层的数据结构是二叉树,

也可以自己写个类实现Comparable 或者 Comparator 接口,定义自己的比较器,将其作为参数传递给TreeSet的构造函数。

Comparable:可以认为是一个内比较器(public int compareTo(Domain domain){ if(this.str.compareTo(domain.str) > 0) }),实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,用ComparableTo(自然比较方法)方法进行比较,返回值是int,比较者和被比较者:大于返回正数,小于返回负数,相等返回0.this.str和参数类.str比较)

Comparator:外比较器,方法有两个参数o1o2,返回值是int. 1o1大于o2,返回正整数

2o1等于o2,返回0.3o1小于o3,返回负整数

两者比较:实现ComparableComparator接口耦合性强,Comparator是在类外部进行比较的。可以自己定义比较器,写比较算法,不需要对实现类进行任何修改。实际上实现Comparator 接口的方式后面会写到就是一种典型的策略模式。

策略模式和工厂模式相同点:通过多态减少代码的耦合度,都是通过多态来实现不同子类的选取。

简单工厂模式:只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作。实现了选取一个类去实例化对象。

策略模式:使用时必须首先创建一个想使用的类对象,然后将该对象作为参数传递进去,通过该对象调用不同的算法。选取相应对象的工作交给模式的使用者,本身不做选取工作。

其实两个的差别很微妙,Factory是直接创建具体的对象并用该对象去执行相应的动作,而Context将这个操作给了Context类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。

 

Map:这个集合是存储键值对的,一对一对往里存,而且要确保键的唯一性(01,张三)这样的形式打印出来就是  01=张三

   |--HashTable:底层是哈希表数据结构,不可以存入null键和null值,该集合线程是同步的,效率比较低。出现于JDK1.0。线程安全,使用synchronized锁住整张Hash表实现线程安全,即每次锁住整张表让线程独占。

 

   |--HashMap:底层是哈希表数据结构,可以存入null键和null值,线程不同步,效率较高,代替了HashTable,出现于JDK 1.2

 

   |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于对map集合中的键进行排序

 

  ConcurrentHashMap:线程安全,允许多个修改操作并发进行,其关键在于使用了锁分离技术,它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的Hashtable,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

你可能感兴趣的:(java基础)