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

ArrayList,LinkedList,Vector都属于List

 

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

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

 

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

 

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

 

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

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

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

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:外比较器,方法有两个参数o1和o2,返回值是int. 1、o1大于o2,返回正整数

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

两者比较:实现Comparable比Comparator接口耦合性强,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,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值