黑马程序员—【Java基础篇】之集合框架工具类

------- android培训java培训、期待与您交流! ---------

    伙伴们,这篇主要介绍集合框架工具类,讲解和分享的主要有2个类,分别是:Collections和Arrays。特点是这两个类里的方法几乎全部都是静态的,好吧,开始吧。

一、Collections类

1、概述

<span style="font-size:14px;">/**
(1)、定义:
Collections是一种集合框架的工具类,其里面定义的都是静态方法。
(2)、Collections和Collection有什么区别?
    a、Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
		它有两个常用的子接口,
		(a)List:对元素都有定义索引。有序的。可以重复元素。
		(b)Set:不可以重复元素。无序。
    b、Collections是集合框架中的一个工具类。该类中的方法都是静态的
		(a)提供的方法中有可以对list集合进行排序,二分查找等方法。
		(b)通常常用的集合都是线程不安全的。因为要提高效率。
		(c)如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
*/</span>

2、常见方法

/**
(1)查找
        Tmax(Collection<? extends T> coll);//根据集合的自然顺序,获取coll集合中的最大元素
        Tmax(Collection<? extends T> coll,Comparator<? super T> comp);//根据指定比较器comp的顺序,获取coll集合中的最大元素
        intbinarySearch(Lsit<? extends Comparable<? super T>> list,Tkey);//二分法搜索list集合中的指定对象
(2)替换
        voidfill(List<? super T> list, T obj);//将list集合中的全部元素替换成指定对象obj
        booleanreplaceAll(List<T> lsit,T oldVal,T newVal);//用newVal替换集合中的oldVal值
        void swap(Listlist,int i,int j);/在指定列表的指定位置处交换元素
(3)排序
        void shuffle(List<?> list);//使用默认随机源对list集合中的元素进行随机排序
        void sort(Lsit<T> list);//根据自然顺序对list集合中的元素进行排序
        voidsort(List<T> lsit,Comparator<? super T> c);//根据指定比较器c的排序方式对list集合进行排序
(4)反转
        reverse(List<?> list);//反转list集合中元素的顺序
        Comparator reverseOrder();//返回一个比较器,强行逆转了实现Comparable接口的对象的自然顺序
(5)同步的集合
        List<T>synchronizedList(List<T> list);//返回支持的同步(线程安全的)List集合
        Map<K,V>synchronizedList(Map<K,V> m);//返回支持的同步(线程安全的)Map集合
 */

3、方法演示练习

/**
    需求:使用Collections中的方法fill对List集合中的部分元素进行替换 
    思路:
    1、将List集合中要替换的部分元素取出,并存入另一集合中 
    2、将原集合中的要替换元素移除 
    3、用fill将要替换的元素进行替换 
    4、将取出的部分增加进集合 
*/  
import java.util.*;  
class  FillTest  
{  
    public static void main(String[] args)   
    {  
        List<String> list = new ArrayList<String>();  
  
        list.add("abc");  
        list.add("ab");  
        list.add("abcd");  
        list.add("a");  
        list.add("abcde");  
  
        try  
        {  
            fillSome(list,1,5,"shenma");  
        }  
        catch (InputException e)  
        {  
            System.out.println(e.toString());  
        }  
        System.out.println(list);  
    }  
    //替换部分元素方法  
    public static void fillSome(List<String> list,int start,int end,String s)throws InputException  
    {  
        if(start>=end)  
            throw new InputException("没有要替换的元素");//如果输入的end小于或者等于start,则抛出异常  
  
        //定义一个新集合  
        List<String> li=new ArrayList<String>();  
  
        //因为每移除一次,后面的元素就会补上,所以这里用y来控制次数  
        for (int x=start,y=start;y<end ; y++)  
        {  
            li.add(list.get(x));//将需要替换的元素增加到新集合  
            list.remove(x);//移除需要替换的元素  
        }  
          
        Collections.fill(li,s);//替换成需要的元素s  
          
        list.addAll(start,li);//将替换的部分增加进原集合  
    }  
  
}  
  
//自定义异常  
class InputException extends Exception  
{  
    InputException(String Massage)  
    {  
        super(Massage);  
    }  
}  

二、Arrays类

1、概述

/**
    Arrays是用于操作数组的工具类,里边的方法也全是静态的,不需要创建对象。
    把数组变成List集合的好处:可以使用集合的思想和方法来操作数组中的元素。如:contains,get,indexOf,subList等方法。
 */

2、常见方法

/**
(1)Lsit<T> asList(T... a)//将数组转换为集合
注意:
        a、将数组转换成集合,不可使用集合的增删方法,因为数组的长度是固定的。如果进行增删操作,则会产生UnsupportedOperationException的编译异常。
        b、如果数组中的元素都是对象,则变成集合时,数组中的元素就直接转为集合中的元素。
        c、如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
(2)binarySearch():二分查找方法,fill():替换方法,sort():排序方法等
       特点:可对数组元素进行相应操作,可以接受除boolean之外的其他各种基本数据类型及有序的引用类型数组的参数,且还可以对指定元素的范围,并可根据指定比较器进行相应的操作。
       如:sort(T[]a,Comparator<? super T> c)
                fill(int[]a,int from,int to)等
(3)String toString();//可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式。
*/

3、方法练习

class  ArraysDemo //数组变集合 
{  
    public static void main(String[] args)   
    {  
        int[] arr = {2,4,5};  
        System.out.println(Arrays.toString(arr));//转换为字符串形式  
          
        String[] arr = {"abc","cc","kkkk"};//字符串数组  
          
        List<String> list = Arrays.asList(arr); //字符串数组转换成集合 
        sop("contains:"+list.contains("cc"));//判断是否存在"cc"这个元素  
  
        Integer[] nums = {2,4,5};  
        List<Integer> li = Arrays.asList(nums);// 整数数组转换成集合 
        sop("asList--Integer[]转集合:" + li);    
    }  
  
//打印方法  
    public static void sop(Object obj)  
    {  
        System.out.println(obj);  
    }  
}

4、集合变数组

/**
    Collection接口中的toArray方法。
    <T> T[]toArray(T[] a);将集合变为指定类型的数组。
(1)指定类型的数组到底要定义多长呢?
        当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
         当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组,所以创建一个刚刚好的数组最优。
(2)为什么要将集合变数组?
         为了限定对元素的操作,不需要进行增删了。
*/

 
  
 
  
 
  

class  CollectionToArray //集合转变成数组 
{  
    public static void main(String[] args)   
    {  
        ArrayList<String> al = new ArrayList<String>();  
  
        al.add("abc1");  
        al.add("abc2");  
        al.add("abc3");  
        //将集合变为String数组  
        String[] arr = al.toArray(new String[al.size()]);  
        //利用Arrays操作数组的方法  
        System.out.println(Arrays.toString(arr));  
    }  
}  

三、小知识点

1、高级for循环

/**
(1)格式
      for(数据类型 变量名 : 被遍历的集合(Collection)或数组){执行语句}
(2)说明
    a、对集合进行遍历,只能获取集合的元素,但是不能对集合进行操作。
    b、迭代器除了遍历外,还可进行remove集合中元素的操作,如果使用ListIterator,还可在遍历过程中,对集合进行增删改查的操作。
(3)传统for循环和高级for循环区别:
     高级for循环有局限性,必须有被遍历的目标;而传统for循环有索引,所以建议在遍历数组时,使用传统for循环。
*/

    示例:

<pre name="code" class="java">class ForEachDemo  
{  
    //打印方法  
    public static void sop(Object obj)  
    {  
        System.out.println(obj);  
    }  
  
    //测试  
    public static void main(String[] args)   
    {  
        //创建集合  
        ArrayList<String> as = new ArrayList<String>();  
        as.add("01-a");  
        as.add("02-b");  
        as.add("03-c");  
        System.out.println("原集合" + as);  
        //增强for循环取出元素  
        for (String s : as)  
        {  
            System.out.println(s);  
        }  
 System.out.println("-------------------------");  
        //创建HashMap集合  
        HashMap<Integer,String> hm = new HashMap<Integer,String>();  
        hm.put(1,"a");  
        hm.put(2,"b");  
        hm.put(3,"c");  
        hm.put(4,"d");  
        System.out.println("hm原集合:" + hm);  
        //增强for循环的两种方式测试  
        //keySet方法  
        sop("keySet方法:|--");  
        for(Integer i : hm.keySet())  
        {  
            sop(i + ":-" + hm.get(i));            
        }  
        //entrySet方法  
        sop("entrySet方法--");  
        for(Map.Entry<Integer,String> me : hm.entrySet())// Map.Entry也是一种数据类型
        {  
            sop(me.getKey() + "-->" + me.getValue());  
        }  
    }  
}
 
  

2、可变参数

<pre name="code" class="java"><span style="font-size:14px;">/**
    一个方法在参数列表中传入多个参数,个数不确定,那么每次都要复写该方法。这时可以用数组作为形式参数。但是在传入时,每次都需要定义一个数组对象,作为实际参数。
     在JDK1.5版本后,就提供了一个新特性:可变参数。
     可变参数其实就是数组参数的简写形式。不用每一次都手动的建立数组对象。只要将要操作的元素作为参数传递即可。隐式将这些参数封装成了数组。
     在使用时注意:可变参数一定要定义在参数列表的最后面。
*/</span>
 
       示例: 
  
<pre name="code" class="java">class  ParamMethodDemo  
{  
    public static void main(String[] args)   
    {  
        show("haha",2,3,4,5,6);  
    }  
    public static void show(String str,int... arr)//...就表示可变参数  
    {  
        System.out.println(arr.length);  
    }  
}
 
  

3、静态导入

<pre name="code" class="java">/**
(1)写法
        import staticjava.util.Arrays.*;//导入的是Arrays这个类中的所以静态成员。
        import staticjava.lang.System.*//导入了Ssytem类中所以静态成员。
       没加static导入的是类,加上static导入的全是某一个类中所以的静态成员。这样写在调用该类的静态方法时可以不用再写类名。如:Arrays.sort(数组);就可以直接写sort(数组);
*/
     
  示例: 
 
<span style="font-size:14px;">import static java.util.Arrays.*;  
import static java.lang.System.*;  
  
class  StaticImport //extends Object  
{  
    public static void main(String[] args)   
    {  
  
        out.println("haha");//打印输出时就可以直接省略书写System.  
        int[] arr = {3,1,5};  
  
        sort(arr);//使用Arrays工具类的方法sort时就可以省略书写Array.  
  
        int index = binarySearch(arr,1);//半分查找也是一样可以省略  
        out.println("Index="+index);  
  
        //当没有指定继承时,所以类默认继承了Object,  
       //因为toString方法都具备,所以为了区分,必须写上具体调用者  
       out.println(Arrays.toString(arr));  
    }  
}
/**
注意:
        当导入的两个类中有同名成员时,需要在成员前加上相应的类名。
       当类名重名时,需要指定具体的包名。当方法重名时,指定具体所属的对象或者类。
*/</span>


    这篇就到这里了,伙伴们,过瘾了吗?如果没有,ok,next篇,come on!   



------- android培训java培训、期待与您交流! ---------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值