JAVA学习十九:集合框架

来源:互联网 发布:网络暴力的危害 编辑:程序博客网 时间:2024/05/16 06:26

Java学习——集合框架

 

集合类的特点:

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

 

 

 

Collection

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

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

         特点:查询速度快,但是增删稍慢,线程是不同步的。

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

         特点:增删速度很快,查询速度慢。

|—— Vector:底层是数组结构,线程同步,已被ArrayList取代。

    

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

       |—— HashSet:底层数据结构是哈希表,线程是不同步的。

特点:HashSet是通过元素的hashCodeequals来保证元素的唯一性。

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

                  特点:底层数据结构是二叉树,保证元素唯一性的依据是compareTo()方法的返回值;如果返回值为0,表示两个元素主条件相等,当主条件相等时,一定要判断一下次要条件是否相等。

 

 

Map集合:

Map

  |—— Hashable:底层是哈希表数据结构,不可以存入null键和null值。

           特点:该集合是线程同步的,JDK1.0版本时代用的集合,缺点是效率太低。

  |—— HashMap:底层是哈希表数据结构,允许使用null键和null值。

           特点:该集合是不同步的,它取代了hashableJDK1.2版本才出现。效率高。

  |—— TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序。

 

注:Set集合底层使用了Map集合。

 

Map集合的特点:该集合存储键、值对应的数据,一对一对往里存的,一个键对应一个值,而且要保证键的唯一性。

 

Map集合的特有两种取出方式:keySetentrySet

第一种:keySetMap中所有的键存入到Set集合,因为Set具备迭代器,可以使用迭代器取出所有的键,在通过Mapget方法获取每一个键对应的值。

例如:Set<String> s = map.keySet()//keyset()获取map集合中所有的键,并把键存入Set中。

 

第二种:entrySetMap集合中的键、值映射关系存入到Set集合,而这个键、值映射关系的数据类型就是:Map.Entry类型。

例如:Set<Map.Entry<StringString>> s = map.entrySet()

 

Map集合的取出原理:将Map集合转换成Set集合,在通过迭代器取出。

  |—— keyset():返回类型:Set<E>

  |—— entrySet():返回类型:Map.Entry<KV>

 

 

集合框加:迭代器

迭代器:是用于取出集合中元素的工具。

迭代器的使用:

ArrayList al = new ArrayList()  //创建ArrayList集合

al.add(java 01)   //ArrayList集合中添加元素

al.add(java 02)

al.add(java 03)

Iterator it = al.iterator()     //ArrayList集合进行迭代。

while (it.hasNext())                     //如果it中还有元素,就继续next()取出元素。

{

System.out.println(it.next())     //取出元素。并输出取出的元素。

}

 

 

 

集合框加:泛型、泛型类、泛型方法、泛型接口

 

泛型:是在JDK1.5版本以后才出现的新特性,它的作用是用于解决安全性问题,它是一个类型安全机制。

 

泛型的好处:

1、将运行时期出现的问题classcastException(类型转换异常),转移到了编译时期。

2、避免了类型强制转换的麻烦。

 

泛型的格式:通过 < >一对尖括号来定义要操作的引用数据类型。

 

泛型的使用场合:在使用java提供的对象时,通常在集合框架中很常见,只要见到< >就要定义泛型,其实< >就是用来接收类型的。

当要使用集合时,将集合中要存储的数据类型作为参数传递到< >中即可。

 

 

泛型类:当类中要操作的引用数据类型不确定的时候,早期的作法是定义Object来完成扩展(JDK1.4版本以前)。现在的作法是定义“泛型类”来完成扩展。

当泛型定义在类上后,该类中所有方法操作的元素类型都和类上定义的泛型相同(相当于被固定了类型了),泛型类定义的泛型,在整个类中都有效,如果被类中方法使用,所有方法要操作的类型就已经被固定了。

 

泛型类示例:

class Tool<EVA>           //泛型类

{

       private  EVA  e

       public void set(EVA  e)              //设置操作类对象。

{

       this.e = e

}

public EVA get()                  //返回操作类对象。

{

       return e

}

}

 

 

泛型方法:为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上,这样的方法便被称为泛型方法。

 

泛型方法示例:

Class Demo

{

       public <EVA> void show(EVA  e){}   //泛型方法。

}

 

静态的泛型方法:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在静态方法上;静态方法的泛型只能定义在静态方法上。

例如:

class Demo

{

       public static <EVA> void method(EVA  e){}     //静态泛型方法。

}

 

注:不管是静态的还是非静态的方法,在定义泛型时,泛型定义的位置都是在返回值类型符前面,函数修饰符后面。

 

 

泛型接口:把泛型定义在接口上,在实现这个接口时,有二种方法可以实现泛型接口。

第一种方法:把需要操作的类型传递入接口的泛型括号内。

例如:

interface Inter <EVA>   //泛型接口

{

       void show(EVA  e)

}

 

//实现Inter接口,并把要操作的类型传递到泛型括号内

class InterEmpl implements Inter<String>

{

       public void show(String srt){}

}

 

 

第二种方法:在实现这个泛型接口时,当类自己都不知到以后要操作什么类型时,就把这个类也定义成泛型类,并继承这个泛型接口,在后面的使用中,根据实际情况再来传入需要操作的类型。

例如:

interface Inter <EVA>

{

       void show(EVA  e)

}

 

//实现这个接口,并继承这个泛型。

class InterImpl <EVA> implements Inter<EVA>

{

       public void show(EVA  e){}

}

 

 

 

 

 

原创粉丝点击