黑马程序员——集合类(二)

来源:互联网 发布:来须苍真 知乎 编辑:程序博客网 时间:2024/06/05 05:14

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

         HashSet:数据结构是哈希表,线程是非同步的

                            保证元素唯一性的原理,判断元素的hashCode值是否相同

                            如果相同,还会继续判断元素的equals方法,是否true

         TreeSet:数据结构是二叉树(红黑树)可以对Set集合中的元素进行排序

                            保证元素唯一性的依据CompareTo方法 return 0

                            TreeSet排序的第一种方式,让元素自身具备比较性

                            元素需要实现Comparable接口 重写compareTo方法

                            这种方式也称为元素的自然顺序,或者叫做默认顺序

                           

                            TreeSet的第二种排序方式

                            当元素自身不具备比较性时,或者具备的比较性不是所需要的

                            这时就需要让集合自身具备比较性

                            定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数

                           

                            当两种排序都存在时,以比较器为主

                            定义一个类,实现Comparator接口,覆盖compare方法

                            ★比较字符串   str1.compareTo(str2)   ★

            ★比较比较年龄  return s1.age-s2.age  ★

            ★需要TreeSet按照存入取出元素 元素内compareTo方法返回1即可★

            ★int num=new Integer(s1.age).compareTo(newInteger(s2.age));★

●泛型:JDK1.5版本以后出现新特性,用于解决安全问题,是一个安全机制

        好处:

            (1)将运行时期出现问题ClassCastE xception,转移到了编译时期,方便与程                序员解决问题,让运行时期问题减少,安全

            (2)避免了强制转换麻烦

    泛型格式:通过<>来定义要操作的引用数据类型

    在使用java提供的对象时,什么时候写泛型?

    通常在集合框架中很常见,只要见到<>就要定义泛型

    其实<>就是用来接收类型的

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

★泛型类

    什么时候定义泛型类?

    当类中要操作的引用数据类型不确定时,早期定义Object来完成扩展,现在定义泛型来完成扩展

★泛型方法

    泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型的对象明确要操作的具体类型后,所有要操作的类型就已经固定了

         为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上

         特殊之处:

         静态方法不可以访问类上定义的泛型

         如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上

★泛型定义在接口

 

★泛型限定

    通配符? ,也可以理解为占位符

    ? extends E:可以接受E类型或者E的子类型,上限

    ? super E:可以接受E类型或者E的符类型,下限

    上限:定义父类填充子类 类型

    下限:一般用于定义迭代器:只需定义父类类型的迭代器,否则面向具体的话,扩展性和维护性不好

/*泛型*/import java.util.ArrayList;import java.util.Iterator;class Person{}class Tool{private Object obj;public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}}class Utils<QQ>{private QQ q;public QQ getQ() {return q;}public void setQ(QQ q) {this.q = q;}}class Demo<T>{public void show(T t){System.out.println(t);}public <Q> void print(Q q){System.out.println(q);}public static <R> void method(R t){}}interface Inter<T>{void show(T t);}class InerImpl<T> implements Inter<T>{public void show(T t) {// TODO Auto-generated method stub}}public class FanXing {public static void main(String[] args) {}/*泛型通配符*/public static void prinColl(ArrayList<?> al){Iterator<?> it = al.iterator();while(it.hasNext()){System.out.println(it.next());}}/*泛型修饰静态方法*/public static <T> void prinColl1(ArrayList<T> al){Iterator<T> it = al.iterator();while(it.hasNext()){T t = it.next();System.out.println(t);}}/*泛型限定*/public static void prinColl2(ArrayList<? extends Person> al){Iterator<? extends Person> it = al.iterator();while(it.hasNext()){System.out.println(it.next());}}}


●Map集合

    该集合存储键值对,一对一对往里存,而且要保证键的唯一性

(1) 添加

put(k key,v value)

putAll(Map<? extends K, ? extends V> m)

    (2)删除

        clear()

        remove(Objectkey)

    (3)判断

        containsValue(Objectvalue)

        containKey(Objectkey)

        isEmpty()

    (4)获取

        get(Objectkey)

        size()

        values()

 

        entrySet()

        keyset()

★Map

    |--HashTable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同                 步的,效率低jdk1.0

    |--HashMap:底层是哈希表数据结构,允许使用null键null值,该集合是不同步的,            效率高 jdk1.2

    |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排                序,    和Set很像,其实,Set底层就是使用了Map集合

    ★HashMap  可以使用get()判断是否存在键 有特殊情况  null

            添加元素时,如果出现相同的键,那么后添加的值会覆盖原有的键对应的值,            并put方法返回被覆盖的值

★Map集合的两种取出方式

    keySet:将map中所有的键存入Set集合,通过迭代方式取出所有的键,再根据get方法,获取每一个键对应的值

     entrySet

 

其实Map.Entry也是一个接口,它是Map接口中的一个内部接口   映射项,键值对

 

●Collections

        sort(Listlist)

        max()

        binarySearch()返回(-(插入点) - 1)

                   copy()

                   fill(  )

                  replaceAll()

                   reverse()

                   reverseOrder()

                   shuffle()

         ●Arrays:用于操作数组的工具类,里面都是静态方法

        asList(T a)数组变集合

        把数组变成list集合有什么好处

        可以使用集合的思想和方法来操作数组中的元素

        注意:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定

        如果使用了增删,那么会产生UnsupportedOperationException

 

        如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素,如果数组中的元素都是基本数据类型,那么会将该数组作为数组中的集合存在

    ●集合转数组

        toArray()

  String[] y = x.toArray(new String[0]); 

注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。

      当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数组长度大雨了集合的size,就不会新创建了数组,而是使用传递进来的数组,所以创建一个刚刚好的数组最优

★为什么要将集合变数组?

    为了限定对元素的操作,不需要进行增删

●高级for循环

    格式:

for(数据类型 变量名:被遍历的集合或者数组){}只能取出,不能修改

对集合进行遍历

只能获取集合元素,但是不能对集合进行操作

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

如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作

★传统for循环和高级for循环有什么区别?

    高级for有一个局限性,必须有被遍历的目标

●可变参数

    其实就是数组参数的简写形式,不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组

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

●静态导入

        importstatic 导入静态成员



/*统计字母出现的次数*/import java.util.HashMap;public class LetterNum {public static void main(String[] args) {String s = "sdfgzxcvasdfxcvdf";HashMap<Character,Integer> hm = new HashMap<Character,Integer>();for (int i = 0; i < s.length(); i++) {int value;if(hm.get(s.charAt(i))==null){hm.put(s.charAt(i), new Integer(1));}else{value = hm.get(s.charAt(i));hm.put(s.charAt(i), new Integer(1+value));}}System.out.println(hm);}}



0 0
原创粉丝点击