热门话题白皮书HR资料
#每日一道面试题#阿里百度网易--java,andriod
2024.06.14

Map、Set、List、Queue、Stack的特点与用法。


参考:


List:元素是有序的,元素可以重复。因为该集合体系有索引。

ArrayList:底层的数据结构使用的是数据结构。

查询速度很快。

增删稍慢。

线程不同步。

默认长度为10增长率为50%。

LinkedList:底层使用的链表数据结构。

增删速度很快。

查询稍慢。

Vector:底层是数组数据结构。1.0出现

线程同步

被ArrayList替代了。

长度增长率100%。

Set接口


Set接口是继承自Collection的,它不能包含有重复元素。Set中最多有一个null元素。


因为Set的这个制约,在使用Set集合的时候,应该注意:

    1,为Set集合里的元素的实现类实现一个有效的equals(Object)方法。

    2,对Set的构造函数,传入的Collection参数不能包含重复的元素。

Set下有几个set类,HashSet、SortedSet、TreeSet,用的较多的是HashSet,其他两种基本不常用,以后慢慢补充该方面知识,下面说HashSet。

  (1)HashSet,底层数据结构式哈希表,由哈希表支持,不保证集合的迭代顺序,特别是不保证该顺序恒久不变,此类允许使用null元素。HashSet保证元素唯一性的方法是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。

  (2)TreeSet:底层数据结构式二叉树。注:添加元素必须实现Comparable接口或在实例TreeSet时指定比较器。可以对Set集合中的元素进行排序。保证元素唯一性的依据:compareTo方法return 0;

 

Map接口

Map集成Collection接口,Map和Collection是两种不同的集合,Collection是值(value)的集合,Map是键值对(key,value)的集合。包含几种主要类和接口:HashMap、LinkedMap、WeakHashMap、SortedMap、TreeMap、HashTable等几种。

  (1)Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。

  (2)WeakHashMap类,WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

 

 

总结:

如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

    如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。

    在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们 的效率更高。

    要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

 

    容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。一旦将对象置入容器内,便损失了该对象的型别信息。

    尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

 

注意:

1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。

2、Set和Collection拥有一模一样的接口。

3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)

4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。

      HashMap会利用对象的hashCode来快速找到key。

 

6、Map中元素,可以将key序列、value序列单独抽取出来。

使用keySet()抽取key序列,将map中的所有keys生成一个Set。

使用values()抽取value序列,将map中的所有values生成一个Collection。

为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。


java中stack的使用方法,堆栈是一种"后进先出"(LIFO) 的数据结构, 只能在一端进行插入(称为"压栈") 或删除 (称为"出栈")数据的操作,下面看示例吧


JAVA 中,使用 java.util.Stack 类的构造方法创建对象。

 public class Stack extends vector


 构造方法 : public Stack() 创建一个空 Stack。


方法:  1. public push  (item )  把项 压入栈顶。其作用与 addElement (item ) 相同。

参数 item 压入栈顶的项 。 返回: item 参数 ;

2. public pop () 移除栈顶对象,并作为函数的值 返回该对象。

返回:栈顶对象(Vector 对象的中的最后一项)。

抛出异常 : EmptyStackException 如果堆栈式空的 。。。

3. public peek() 查看栈顶对象而不移除它。。

返回:栈顶对象(Vector 对象的中的最后一项)。

抛出异常 : EmptyStackException 如果堆栈式空的 。。。

4. public boolean empty (测试堆栈是否为空。)  当且仅当堆栈中不含任何项时 返回 true,否则 返回 false.

5. public int search  (object o)  返回对象在堆栈中位置, 以 1 为基数, 如果对象 o是栈中的一项,该方法返回距离 栈顶最近的出现位置到栈顶的距离; 栈中最上端项的距离为1。使用equals 方法比较 o 与 堆栈中的项。  



牛客网—程序员必备求职神器


刷真题,练算法,看面经,得内推
www.nowcoder.com
长按二维码,把IT笔试面试题库装进


点击下方阅读原文查看更多精彩