java基础之集合

来源:互联网 发布:c语言课程考核要求 编辑:程序博客网 时间:2024/05/17 02:11
1. Collectiton:单列存储集合
|--- List 元素是有序的,元素可以重复。因为该集合体系有索引  
|--- ArrayList: 底层的数据结构使用的是数组结构      特点:数组元素查询很快,但是增删很慢,因为增删一个元素,数组后面的其他元素都需要变动,线程不同步
|--- LinkList: 底层的数据结构使用的是链表数据结构特点:链表查询比较慢,反正与 数据结构 相反
|--- Vector: 底层是数组数据结构特点:其他与 ArrayList 相同,但是 线程同步,被前者替代了
|--- Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复
|--- TreeSet:  可以对 Set 集合中的元素排序,底层数据结构是二叉树。  保证元素的唯一性的一句 compareTo 方法 return 0

TreeSet 排序的第一种方式:让元素自身具备比较性,元素需要实现 Comparable 接口实现 compareTo 方法。这种方式也成为元素的顺序。也即是默认顺

TreeSet 排序的第二种方式:当元素不具备比较性时,或者具备的比较性不符合要求。这就要求集合自身具备比较性
在集合初始化时,就让其拥有比较方式
当两种排序都存在时,以比较器为主

|--- HashSet: 底层数据结构是哈希表,线程不同步          
HashSet 是如何保证元素的唯一性:
是通过元素的两个方法,HashCode 和 equals 来完成的
如果元素 HashCode 相同,才会判断 equals 是否为 true
如果元素 HashCode 不相同,就不会调用 equals 方法

注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的 hashCsode() 和 equals() 方法

List 集合判断元素是否相同,依据的是元素的 equals() 方法    ArrayList; 注意它们的区别

 Map 集合:该集合存储键值对,而且要保证键值的唯一性 双列存储集合
|--- HashMap: 底层是哈希表数据结构,允许使用 null 键 null 值。该集合是不同步的 JDK 1.2 效率高
|--- TreeMap: 底层是二叉树数据结构,线程不同步。可以用于给 Map 集合中的键进行排序。和 Set 很像,Set 底层就是使用 Map集合 
|--- Hashtable: 底层是哈希表数据结构,不可以存入 null 键 null 值。该集合是线程同步的; JDK 1.0 效率低
 
1.添加
put( key , value)
2.删除
clear() remove( Object key)
3.判断
containsKey( Object Key)containsValue( Object Value) isEmpty()
4.获取
get( Object key)size() Values()

KeySet():将 Map 中所有的键存入 Set 集合,在利用迭代器方法取出键值,最后根据 get() 方法取出每一个键值对应的值

entrySet():

2. 集合框架   Collection   List    Set   ArrayList   LinkList   Vector   TreeSet   HashSet

ArrayList:
1.add()的参数类型是 Object。以便于接收任意对象    2.集合中存储的都是对象的引用

当我们使用数组时候,长度是固定的。这样让我们有时候使用感觉很麻烦,所以后面就定义了集合;集合可以随着存储元素的增加而增加,也可以随着元素的减少而减少。

数组和集合的区别:

数组:数组既可以存储基本数据类型,也可以存储引用数据类型;存储基本数据类型的时候存储的是值,存储引用基本数据类型的时候存储的地址;数组的长度是固定的,不可变的。

集合:集合只能存储引用数据类型,不过也可以存储基本数据类型(因为JDK新特性,会进行自动装箱;把存储的基本数据类型包装成对象)。集合的长度是可变的,可以随着元素自
动增加。

集合遍历:数组遍历;迭代器遍历

3. 迭代器接口   iterator:

Iterator it = array.iterator();   获取迭代器,用于取出集合元素

就把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。

那么取出方式就被定义成了内部类。而每个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容判断和取出。那么可以将共性抽取。

那么这个内部类都符合一个规则,这个规则就是 Iterator 

如何获取集合取出对象? 通过一个对外提供的方法 iterator()

for( Iterator it = vec.iterator() ; it.hasNext() ; )
{
show( it.next());
}

迭代器是对集合进行遍历,而每个集合内部的存储结构都是不同的;所以每一个集合存和取都是不同的,这样就可能会要在每一个类中都定义 hasNext() 和 next() 方法。这样就会
让整个集合体系变得非常的臃肿。迭代器就是将这些方法向上抽出为接口,然后各个类实现接口的方法。

好处:规范了集合的遍历方式,整个集合体系都是使用 hasNext() 和 next() 方法来进行遍历;代码实现了底层封装实现,这样使用者不用知道怎么实现的,只要知道使用即可。

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

   Set:元素是无序的,元素不可以重复

List:凡是可以操作角标的方法都是该体系特有的方法

List 特有的迭代器 ListIterator: 列表迭代器(是 Iterator 的子接口)

5. List集合:

包括 ArrayList , LinkedList , Vector ;

List 集合的特有功能:
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)

Vector 特有功能:
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()

数组和链表的区别:数组查找快但是增删慢;链表查找慢,但是增删快;

ArrayList:底层数据结构是数组,查找快增删慢;线程不安全,但是效率高。

Vector: 底层数据结构是数组,查找快增删慢;线程安全,但是效率不高;

LinkedList: 底层数据结构是链表,查找慢增删快;线程不安全,效率高;

ArrayList 和 Vector 的区别:底层数据结构都是数组;但是前者线程不安全,效率高;后者线程安全的,效率低。

ArrayList 和 LinkedList 的区别:前者底层数据结构是数组,后者底层数据结构是链表;前者数据查找快,增删慢;后者数据查找慢,增删快。但是都是线程不安全。

使用规则:如果查询数据多使用 ArrayList;如果数据修改多使用LinkedList;如果都多使用ArrayList。

6.枚举就是 Vector 特有的取出方式。其实枚举和迭代器很像,简单说就是一样的。

只是因为枚举的名字以及方法的名称太长了,所以逐渐被迭代器所取代

for( Enumeration en = vec.elements(); en.hasMoreElements() ; )
{
show( en.nextElement());
}

7. List 集合判断元素是否相同,依据的是元素的 equals() 方法    ArrayList

8. Set 集合的功能和 Collection集合功能是一致 

9. 当排序的时候,主要条件相同时,一定要判断一下次要条件

10. Collections 集合(是一个集合框架工具类):所有方法都是静态的,对集合进行操作的工具类。  

Collections.sort();    Collections.max();   Collections.binarySearch();   Collections.fill();    Collections.reverse()

Collections.reverseOrder();   Collections.reverseOrder( 也可以传一个比较器当参数);

11.把数组转换成集合有什么好处: 可以使用集合的思想和方法来操作数组中的元素    注意:将数组转换成集合,不可以使用集合的增删方法操作。因为数组的长度是固定的

为什么要把集合转换成数组:  为了限定对元素的操作,此时元素不需要进行增删

12.高级 for 循环:      for( String s : array)
{
System.out.println( s);
}
对集合进行遍历的时候,只能获取元素。但是不能对集合进行操作

迭代器除了遍历外,还可以进行 remove() 集合中元素的操作

ListIterator 可以遍历,还可以进行增删集合元素的操作

13.JDK 1.5版本出现的新特性: 可变参数,其实就是传递数组参数的简写形式,不用每次都去新建一个数组,而可以直接传递数据元素

注意:可变参数 一定要定义在参数列表的最后面

StaticImport 静态导入。   当类名相同时,需要指定具体的包名;
当方法名相同时,需要指定所属的对象或者类 

14.System:类中的方法和属性都是静态的

获取系统属性信息:   Properties getProperties();

15.Math.ceil(); 返回大于指定数据的最小整数    Math.floor();返回小于指定数据的最大整数 Math.round();四舍五入    Math.pow( 2,3);输出8   二的三次方


Math.random();随机数  返回大于等于0且小于1的随机数













0 0