Java核心API之集合

1.集合的概念:

Java集合类存放于 java.util 包中,是一个用来存放对象的容器。集合的长度不定,数组在定义的时候长度便已经固定。

注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。

   ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。

   ③、集合可以存放不同类型,不限数量的数据类型。

Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

Collection:

list:有序可重复,包括 Arraylist、Linkedlist、Vector、Stack,有公用的方法包括add、remove、size、 contains

Set:无序不可重复,包括 Hashset、Treeset

Map<K,V>  :

Map 存储一组键值对象,提供key(键)到value(值)的映射,包括 Hashmap、Hashtable

Collections:

collections是java提供的一个集合工具类,提供排序、遍历等方法

 

2.arraylist的使用

arraylist有序可重复,可包含多个null元素,默认容量为10,可自动扩容缩容,每次默认自增50%。arraylist遍历和随机访问方便,具有3个构造方法,分别是1.默认构造方法  2.参数为集合的构造方法  3.指定长度的构造方法。

arraylist常用方法:

  • add(index,object)在指定位置放入元素
  • get(index)根据下标获取元素
  • clear()清空集合、
  • add(list)将集合放入集合是集合的拷贝而不是放引用
  • remove之后立即缩容  容易出现数组下标越界

注意:遍历过程中不允许删除元素除非使用迭代器

 

3.linkedlist的使用

linklist是链表式存储,无序不重复,插入、删除时效率较高,主要方法包括Addfirst 、addlast、getfirst、getlast,上转型之后只能调用转型后对象的方法

 

4. Vector的使用

vector有索引,能够自动扩容缩容,扩容默认增长一倍,

与arraylist的区别

实现原理相同,都是基于动态数组,很多情况下可互用

Arraylist:线程非安全的,重速度轻安全

Vector:线程安全

 

5.集合的遍历方式和泛型的使用

       泛型:指定该集合只能存放某种类型的元素

       list的遍历通过迭代器实现,通过list.Iterator()得到迭代器对象

       Iterator  it  =  list.Iterator();

       While(it.hasnext){

              Student stu = (Student)it.next();

}

      

注意:

  • 在迭代的过程当中,索引会被自动维护,即如果当前对象被删除则迭代器后退
  • 不能在next()之前iterator.Remove()
  • 不能在迭代器遍历过程中调用集合的remove()

 

 

6.迭代器模式:

  • 迭代器模式提供一种方法顺序访问一个聚合对象的各个元素而又不暴露该对象的内部结构。
  • 通过Collection接口的iterator()方法 返回一个迭代器
  • 实现了collection接口的所有集合都可以有一个指向自己的迭代器
  • 所有实现了collection的集合都可以使用迭代器进行遍历
  • 不同集合有不同iterator实现类

 

 

7.stack的使用

规则:先进后出  后进先出

Push压入  pop出  peek得到栈顶对象但不移除它

 

8.Hashset的使用 

hashset是collection接口的完全实现,hashset无序不重复。

关于如何定义元素是否重复:

  • 基本类型数据:值相同
  • 引用类型数据:比较堆地址
  • Hashcode  equals tostring重写

Hashset在比较对象时会使用hashcode和equels方法

先比较hashcode再equels

  • equels相等时,hashcode一定相等
  • equels不等时,hashcode可能相等
  • hashcode不等,equels一定不等
  • hashcode相等,equels可能不等

重写equels时一定要重写hashcode  否则会违背上面4大原则

 

9.treeset的使用

有序不重复 ,使用元素的自然顺序 ,结构是基于红黑树

 

10.元素的比较 

元素的比较通过实现comparable接口并重写compareTo方法来实现 即 implement comparable<Emp>

Treeset在做add存放元素时就要开始比较了

comparable<Emp>表示只能比较Emp类型的对象

实现comparator接口  重写compare方法

Set<Emp> set = new TreeSet<Emp>(new MyCpmpare)//将一把称交给集合

Comparable接口:元素自身具备比较的特性

Comparator接口:集合自身具备比较的特性

 

11.Hashmap的使用

常用方法:

放put  键不允许重复,如果重复,后面的会把前面的覆盖

得到get(key) 

得到长度size() 

得到键的集合map.keySet()  得到值的集合collection<> c = map.values()

entrySet()返回一个set集合  里面放entry对象   相当于将key和value放到一个对象里面

entry代表map中的映射关系  entry提供getKey和getValue方法

hashmap、treemap、hashtable的比较:

hashmap  哈希表  非线程安全  key允许null

treemap   红黑树  线程安全

hashtable  哈希表  非线程安全  key不允许null

 

12.集合的比较

数据结构

Arraylist   动态数组(遍历)

Linklist     链表(增、删)

Vector      动态数组   同步的  线程安全

Collections.binarySearch(要查找的集合,要查找的元素)

Arrays.asList(数组);将数组转换为一个List集合

System.currentTimeMillis得到系统时间

Arraylist:新容量=(旧容量*3)/2+1

Vector  翻倍增长

 

Hashmap  不同步,线程不安全

Hashtable  同步,线程安全,继承于dictionary

 

Hashmap 

Hashset    基于hashmap实现  基于hashmap的键

 

13.集合工具类

Collections常用方法:

binarysearch二分查找默认 调用之前必须进行升序排序

Sort排序

Min/max

Reverse反转

Replaceall替换    Copy

aslist 将数组转换为列表

    对于基本数据类型数组,整个数组转换成一个元素

    对象数组中的元素转换成集合中的元素

 

14.泛型类

可以代表多种类型  泛型的本质是参数化类型

Class 类名<T>  T在类中可以使用作为类型来用

真正使用类的对象的时候,可以给T赋值

类中T所出现的地方都变成了赋值的类型

 

15.泛型方法

使用了泛型的方法:在泛型类中的方法

Public   <T>  T  test(T t){return t }  使用时值和类型一并赋值

 

16.泛型接口 

接口继承多参数泛型

1.默认objec

2.实现接口时就确定类型是什么

3.使用时才确定 class 类名 <T> implements inter<T>{  }

多参数泛型类

例如:class Myclass<T,K>{   }

 

17.泛型限定

       T type,  K key,  V value,  E element,  ?  不确定的Java类型

       限定:泛型能够代表的类型被限定

       默认可以接受泛型类型的子类

       现在泛型的上限是fruit,所以现在泛型所等代表的只能是fruit类及其子类

       集合中泛型限定的使用   集合中不能使用泛型上限

       集合中泛型下限的使用

?extends T:上限:类型是T及其子类

?super T:下限:类型是T及其父类

猜你喜欢

转载自blog.csdn.net/star_in_shy/article/details/82256048