集合间和集合内的区别

conllection是集合集合框架的顶级接口。下面有子接口以及实现类。

集合有四种基本形式:Queue(其实现类只有一个List下的LinkedList),List3,Set2,Map4。


conllections是工具类,是集合框架的工具类,对集合进行操作。里面有很多静态方法。

Collections.synchronizedMap()与ConcurrentHashMap主要区别是:Collections.synchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁。所以,只要要有一个线程访问map,其他线程就无法进入map,而如果一个线程在访问ConcurrentHashMap某个桶时,其他线程,仍然可以对map执行某些操作。

为什么所有的集合类不直接实现Iterator,而是实现Iterable接口后调用iterator()方法后返回Iterator类的对象再进行遍历?

因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。

       当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。

 《一》Iterator与ListIterator:

Iterator实现很简单,链式存储结构根据指针找下一个元素,顺序存储根据地址找下一个元素就可以。

Iterator可以遍历所有集合,ListIterator只能遍历List集合。

Iterator只能正向遍历,ListIterator正反向都可以遍历。

Iterator只能删除元素,ListIterator不仅可以删除,还可以添加和修改元素。

《二》Collection:

1) List的实现类:

LinkedList采用双向链表结构实现,ArrayList和Vector都采用数组实现(顺序存储,插入或删除元素时必须移动插入位置的前面或后面的所有元素)。存取和增减元素的效率自然明了。ArrayList和Vector虽然用数组实现,但可实现数组长度增加,原理是将原来数组复制到新的数组。前者是线程不安全的,没有上锁,效率高,后者是线程安全的,由于上了锁,效率低。

LinkedList实现了双端队列Deque(继承自队列Queue):

 首位可以增加删除元素,感觉没什么卵用。

Vector还有一个继承类Stack(栈):表示先进后出的栈,它在Vector的基础上增加了五个操作将向量扩展为栈:push和pop入栈出栈操作,读取栈顶元素的peek方法,测试栈是否为空的empty方法和确定某元素从栈顶起是第几个元素。

2)Set的实现类:

HashSet完全用hashmap实现,区别是一个是存键值对,一个存正常元素。所以hashset不能添加重复元素:调用hashmap的添加元素方法,hashmap添加相同key的元素时返回原始value(先覆盖value)不返回null导致hashset添加重复元素返回false。

TreeSet完全用treemap实现,区别是一个是存键值对,一个存正常元素。所以treeset不能添加重复元素:调用treemap的添加元素方法,tree添加相同key的元素时返回新value(先覆盖value)不返回null导致treeset添加重复元素返回false。

 3)Map的实现类:

 http://blog.csdn.net/xy2953396112/article/details/54891527

hashmap:同hashset。只不过哈希表的数据结构是针对key而已。

LinkedHashMap:HashMap的子类,用链表结构保证了插入元素的顺序。遍历时会根据插入顺序来展示。

treemap:同treeset。只不过哈希表的数据结构是针对key而已。

weakHashMap:可以看到Entry继承扩展了WeakReference类,在其构造函数中,构造了key的弱引用。 每次get()、put()、size()都间接或者直接调用了expungeStaleEntries()方法,以清理持有弱引用的key的表象。 如果key在别的地方被引用过则不会被回收。如果weakHashMap中全部元素的key都被引用,weakHashMap退化成hashmap。

hashtable:hashtable和hashmap的区别是,hashtable线程安全,效率低,hashmap效率高但不是线程安全的。hashtable已过时,想实现线程安全的hashmap可使用ConcurrentHashMap。

                                                                                                      枚举

枚举就是对某个属性的所有状态的遍历,并根据枚举出的不同属性值作出不同的响应。

使用:

用关键字enum来修饰一个枚举的名称即可,在其中列出所有会被枚举出的值,紧接着在同一括号内用switch  case写出枚举出不同属性值/状态时作出的不同的逻辑处理。

只有继承了Object的类才有hashcode,所以操作基本类型如int都是使用它们的包装类型。

二:

在java集合中判断两个对象是否相同的规则是:

1.判断两个对象的hashcode是否相同,不相同则两个对象不相同

2.如果两个对象的hashcode相同,再进一步用equals方法判断两个对象是否相同。

对于普通类:

若普通同类没有重写hashcode()和equals()方法,那么其对象在比较时是集成的Object的hashcode()方法,object类的hashcode()是一个本地方法,其方法的返回值是对象的引用地址,object类中定义的equals()方法也是对引用地址的比较,在set集合中,对象引用地址不一样则元素不重复。

对于String,Integer,Double等:

由于这些类已经重写了hashcode()方法和equals()方法,方法的返回值跟对象的内容有关而不是引用地址,在集合中比较他们的内容即可,内容相同则表示覆盖了已存在的对象。

新生的小心情
原文地址:https://www.cnblogs.com/jianmianruxin/p/7215212.html