JAVA基础----集合

来源:互联网 发布:超级优化女主角有谁 编辑:程序博客网 时间:2024/06/18 14:33


集合体系:




Collection:

|--List:有序的,带索引的,通过索引就可以精确的操作集合中的元素,

元素是可以重复的。

List提供了增删改查功能   
增加add(element) add(index,element)  ;
删除remove(element) remove(index);
修改set(index,element);

查询get(index);


|--Vector:可以增长的数组结构。同步的。效率非常低。

已被ArrayList替代。


|--ArrayList:是数组结构,长度是可变的

(原理是创建新数组+复制数组),查询速度很快,

增删较慢,不是同步的。

|--LinkedList:是链表结构,不同步的,增删速度很快,查询速度较慢。
可用于实现堆栈,队列。
堆栈:先进后出  First in Last Out  FILO 。

队列:先进先出  First in First Out FIFO 。


List可以存储重复元素的,不能保证元素的唯一性。



|--Set:不包含重复元素的集合,不保证顺序。

而且方法和Collection一致。Set集合取出元素的方式只有一种:

迭代器。

|--HashSet:哈希表结构,不同步,保证元素唯一性的方式依赖于:hashCode(),equals()方法。查询速度快。


|--TreeSet:可以对Set集合中的元素进行排序。

使用的是二叉树结构。如何保证元素唯一性的呢?

使用的对象比较方法的结果是否为0,是0,视为相同元素不存。
元素的排序比较有两种方式:
1,元素自身具备自然排序,其实就是实现了Comparable接口重写了compareTo方法。

如果元素自身不具备自然排序,或者具备的自然排

序不是所需要的,这时只能用第二种方式。


2,比较器排序,其实就是在创建TreeSet集合时,

在构造函数中指定具体的比较方式。

需要定义一个类实现Comparator接口,重写compare方法。



Map集合特点;
1,内部存储的都是键key值value对。
2,必须要保证的键的唯一性。


Map常见功能。
1,存储。v put(k,v);
2,获取。v get(k);
3,移除。v remove(k);
4,Set<k> keySet();
5,Set<Map.Entry<k,v>> entrySet();
6,Collection<v> values();


|--Map

|--Hashtable:数据结构:哈希表。是同步的,

不允许null作为键和值。被hashMap替代。


|--Properties:属性集,键和值都是字符串,

而且可以结合流进行键值的操作。

|--HashMap:数据结构:哈希表。不是同步的,允许null作为键和值。


|--LinkedHashMap:基于链表+哈希表。

可以保证map集合有序(存入和取出的顺序一致)。


|--TreeMap:数据结构:二叉树。不是同步的。

可以对map集合中的键进行排序。






Map集合的遍历方式
方式1:根据键找值
获取所有键的集合
遍历键的集合,获取到每一个键

根据键找值


使用增强for迭代,原理是一样的。




方式2:根据键值对对象找键和值
获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值



增强for迭代




什么时候使用map集合呢?
分析问题时出现对应关系,必须想到map集合。

如果对应关系中出现了有序的数字,想到数组。


注意:如果对应关系个数不确定,还是以map为主。




常见的数据结构:
栈:
特点:

先进后出



队列:
特点:

先进先出


数组:
特点:

增删慢,查询快

没找到合适的图,简单说一下吧。

先说为什么查询快:

因为数组都有固定的索引,通过索引可以快速的查找到所对应的值

比如,二分查找法。


增删慢是因为:

假如你的数组长度为100,里面都存满了值。

如果你想删掉第一个,那索引0中的值就需要于索引1中的值互换

........长度很长的数组每一个都要互换,是不是很慢。



链表:
特点:

增删快,查找慢


这中结构查找慢是因为,必须要通过第一个才能找到第二个,

必须通过第二个才能找到第三个.......



树: 
特点:

增删慢,查询快



增删慢是因为,他的顺序结构非常明确。

每增删一个值都需要进行一系列的判断。


查找快,二分查找;


哈希表:
特点:
增删慢,查询快

它也是将值通过一系列的算法,存储进内存的。

而查时可以通过存时的算法,算出它应该在的位置。




看集合对象的小技巧:
集合分体系。List  Set

子类对象的后缀名是所属体系,前缀名是数据结构名称。


List:新出的子类都是以List结尾的,通常都是非同步的。
|--ArrayList :看到array,就知道数组,查询速度快。
|--LinkedList:看到link,就知道链表,增删速度快。

Set:

|--HashSet:看到hash,就知道哈希表,查询速度更快,并想到元素唯一,通过hashCode(),equals方法保证唯一性。


|--TreeSet:看到tree,就知道二叉树,可以排序,排序想到Comparable-compareTo Comparator--compare方法。

---------------------------




List
特有方法:
void add(int index, E element) : 在当前集合中指定位置 添加给定的元素
  Object get(int index) 返回集合中指定位置的元素。

  int indexOf(Object o)返回此集合中第一次出现的指定元素的索引;如果此集合不包含该元素,则返回 -1。


  E remove(int index)移除集合中指定位置的元素
  E set(int index, E element)用指定元素替换集合中指定位置的元素
  ListIterator<E> listIterator() 返回此集合元素的列表迭代器


并发修改异常产生的原因及解决方案:


ConcurrentModificationException 并发修改异常:
在使用迭代器遍历的过程中,原有集合中的元素个数不能发生改变,否则抛出 并发修改异常

解决方式:
普通for:

添加的新元素到原有集合的末尾添加


ListIterator:
添加的新元素在Java元素的后面添加



Vector:

特有方法:
public void addElement(Object obj)  添加元素到集合    ————  add(Obejct obj)
  public Object elementAt(int index) 返回集合中给定位置上的元素  ---- get(int index)
  public Enumeration elements()返回此向量的组件的枚举     --- iterator()
  boolean hasMoreElements()  ----  hasNext()
  Object  nextElement() ---  next();


LinkedList:
特有方法:
public void addFirst(Object e)将指定元素插入此列表的开头
public void addLast(Object e)将指定元素添加到此列表的结尾。  
public Object getFirst()返回此列表的第一个元素
public Object getLast()返回此列表的最后一个元素。
public Object removeFirst()移除并返回此列表的第一个元素。
public Object removeLast()移除并返回此列表的最后一个元素。


Collections: 
集合工具类
是集合框架中的用于操作集合的工具类。
提供了很多的静态方法:比如:对list排序,二分查找,比如可以获取最值等。
其中一组可以非同步集合转成同步 集合的方法。







0 0