黑马程序员——Java基础工具类---Collections、Arrays、超级for循环、静态导入、方法可变参数

 ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------- 

                            Collections

一、概述

Collections是对集合框架的一个工具类。它里边的方法都是静态的,不需要创建对象。并未封装特有数据。

在Collections工具类中大部分方法是用于对List集合进行操作的,如比较,二分查找,随机排序等。

二、常见操作

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接口的对象的自然顺序

ComparatorreverseOrder(Comparator<T> cmp);//返回一个比较器,强行逆转了指定比较器的顺序

5、同步的集合

List<T>synchronizedList(List<T> list);//返回支持的同步(线程安全的)List集合

Map<K,V>synchronizedList(Map<K,V> m);//返回支持的同步(线程安全的)Map集合

三、Collections和Collection的区别

Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。

它有两个常用的子接口:

List:对元素都有定义索引。有序的。可以重复元素。

Set:不可以重复元素。无序

Collections是集合框架中的一个工具类。该类中的方法都是静态的。提供的方法中有可以对list集合进行排序,二分查找等方法

通常常用的集合都是线程不安全的。因为要提高效率。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

                               Arrays

一、概述

Arrays是用于操作数组的工具类。里边的方法也全是静态的。不需要创建对象。

把数组变成List集合的好处:可以使用集合的思想和方法来操作数组中的元素。如:contains,get,indexOf,subList等方法。

二、常见方法

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();//可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式。

 1 /*
 2 Arrays: 用于操作数组的工具类
 3 里面都是静态方法
 4
 5
 6 int[]转字符串  Arrays.toString(arr);
 7 asList:将数组变成list集合
 8 List<String> list=Arrays.asList(arr);
 9 */
10 import java.util.*;
11 class ArraysDemo
12 {
13     public static void sop(Object obj)
14     {
15         System.out.println(obj);
16
17     }
18     public static void main(String[] args)
19     {
20         //int[] arr={2,4,5};
21         //sop(Arrays.toString(arr));
22         String[] arr = {"abc","cc","kkkk"};
23         /*把数组变成list集合有什么好处?
24         可以使用集合的思想和方法来操作数组中的元素。
25
26         注意:将数组变成集合,不可以使用集合的增删方法。
27         因为数组的长度是固定的。
28             contains
29             get
30             indexOf()
31             subList()
32             如果增删。那么会发生UnsupportedOperationException,
33         */
34         List<String> list=Arrays.asList(arr);
35         sop("contains"+list.contains("cc"));//判断有无该成员元素
36         //list.add("qq");//    UnsupportedOperationException
37         sop(list);
38         //int nums[]={2,4,5};//后面将会获取到地址值
39         Integer nums[]={2,4,5};
40         List<Integer> li=Arrays.asList(nums);
41         sop(li);
42
43         /*如果数组中的元素都是对象。那么变成集合时,
44                 数组中的元素就直接转变成集合中的元素
45             如果数组中的元素都是基本数据类型,
46                 那么会将该数组作为集合中的元素存在
47         */
48
49
50     }
51     public static boolean myCollections(String[]arr,String key)
52     {
53         for(int x=0;x<arr.length;x++)
54         {
55             if(arr[x].equals(key))
56                 return true;
57         }
58             return false;
59     }
60 }

三、集合变数组

        Collection接口中的toArray方法。

<T> T[]toArray(T[] a);将集合变为指定类型的数组。

1、指定类型的数组到底要定义多长呢?

当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。

当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。

所以创建一个刚刚好的数组最优。

2、为什么要将集合变数组?

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

示例:

 1 import java.util.*;
 2 class  CollectionToArray
 3 {
 4     public static void main(String[] args)
 5     {
 6         ArrayList<String> al = new ArrayList<String>();
 7
 8         al.add("abc1");
 9         al.add("abc2");
10         al.add("abc3");
11         //将集合变为String数组
12         String[] arr = al.toArray(new String[al.size()]);
13         //利用Arrays操作数组的方法
14         System.out.println(Arrays.toString(arr));
15     }
16 }

      

                          扩展知识---1.5版本新特性

一、高级for

 1 /*
 2 高级for循环
 3 格式
 4 for(数据类型  变量名:被遍历的集合(collection)或者数组)
 5 {
 6 }
 7
 8 对集合遍历。
 9 只能获取集合元素。但是不能对集合进行操作
10
11 迭代器除了遍历,还可以进行remove集合中元素的动作
12
13 如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作
14
15 传统for和高级for有什么区别呢?
16 高级for有一个局限性。必须有被遍历的目标。
17 建议在遍历数组的时候,还是希望是使用传统for。因为传统for可以定义角标
18
19 */
20 import java.util.*;
21 class ForEachDemo
22 {
23     public static void main(String[] args)
24     {
25         ArrayList<String> al=new ArrayList<String>();//创建集合
26         al.add("abc1");
27         al.add("abc2");
28         al.add("abc3");
29
30         for(String s:al)//超级for循环遍历
31         {
32             System.out.println(s);
33         }
34         System.out.println(al);
35         /*
36         Iterator<String>it=al.iterator();//调用集合迭代器
37         while(it.hasNext())
38         {
39             System.out.println(it.next());
40         }*/
41         int[]arr={3,5,1};
42         for(int x=0;x<arr.length;x++)//打印arr数组
43         {
44             System.out.println(arr[x]);
45         }
46         for(int i:arr)
47         {
48             System.out.println("i:"+i);
49         }
50
51         HashMap<Integer,String> hm=new HashMap<Integer,String>();//创建map集合
52
53         hm.put(1,"a");
54         hm.put(2,"b");
55         hm.put(3,"c");
56
57         Set<Integer>keySet=hm.keySet();//调用集合中的  迭代器
58         for(Integer i:keySet)//超级for 循环遍历  keySet 集合中的元素
59         {
60             System.out.println(i+"::"+hm.get(i));
61
62         }
63         Set<Map.Entry<Integer,String>>entrySet=hm.entrySet();//将Map集合中的关系存入集合中
64         for(Map.Entry<Integer,String>me: entrySet)//超级for 循环遍历
65         {
66             System.out.println(me.getKey()+"------"+me.getValue());
67         }
68
69     }
70 }

二、方法的可变参数

 1 /*
 2 JDK1.5版本出现的新特性。
 3
 4 方法的可变参数。
 5 在使用时注意:可变参数一定要定义在参数列表最后面。
 6
 7 */
 8
 9 class  ParamMethodDemo
10 {
11     public static void main(String[] args)
12     {
13         //show(3,4);
14         /*
15         //虽然少定义了多个方法。
16         但是每次都要定义一个数组。作为实际参数。
17
18         int[] arr = {3,4};
19         show(arr);
20
21         int[] arr1 = {2,3,4,5};
22         show(arr1);
23         */
24
25         /*
26          可变参数。
27          其实就是上一中数组参数的简写形式。
28          不用每一次都手动的建立数组对象。
29          只要将要操作的元素作为参数传递即可
30          隐式将这些参数封装成了数组
31
32         */
33         show("haha",2,3,4,5,6);
34         //show(2,3,4,5,6,4,2,35,9,"heh");
35         //show();
36
37     }
38     public static void show(String str,int... arr)
39     {
40         System.out.println(arr.length);
41     }
42
43 }

三、静态导入

1、写法:

import staticjava.util.Arrays.*;//导入的是Arrays这个类中的所以静态成员。

import staticjava.lang.System.*//导入了Ssytem类中所以静态成员。

没加static导入的是类,加上static导入的全是某一个类中所以的静态成员。这样写在调用该类的静态方法时可以不用再写类名。如:Arrays.sort(数组);就可以直接写sort(数组);

 1 /*
 2 StaticImport   静态导入。
 3
 4 当类名重名时,需要指定具体的包名。
 5 当方法重名时,指定具备所属的对象或者类。
 6
 7 */
 8 import java.util.*;
 9 import static java.util.Arrays.*;//导入的是Arrays这个类中的所有静态成员。
10 import static java.util.Collections.*;
11 /*
12 packa/Demo.class
13 packb/Demo.class
14
15 import packa.*;
16 import packb.*;
17 */
18 import static  java.lang.System.*;//导入了System类中所有静态成员
19 class StaticImport//extends Object
20 {
21     public static void main(String[] args)
22     {
23         out.println("haha");//因为导入了System类中所有静态成员,所以可以省略System.in不写
24         int arr[]={1,3,5};
25
26         Arrays.sort(arr);
27         int index= Arrays.binarySearch(arr,1);
28         out.println(Arrays.toString(arr));
29         System.out.println("Index="+index);
30
31         ArrayList al=new ArrayList();
32
33         al.add(1);
34         al.add(3);
35         al.add(2);
36
37         out.println(al);
38
39         sort(al);
40         out.println(al);
41     }
42 }

自我总结:

    java中的工具类,虽然不需要全部书写出原理,但查了API就一定要会用,而常用的则必定要记住。工具类方便了我们的使用。

时间: 2024-10-10 10:44:09

黑马程序员——Java基础工具类---Collections、Arrays、超级for循环、静态导入、方法可变参数的相关文章

黑马程序员——Java集合工具类和泛型

Collections工具类和泛型 Collections和Collection Collections和Collection是不同的,Collections是工具类,用来操作集合的,而Collection是集合接口.Collections中有一系列的静态方法用来操作集合,但是不能更改集合内容.比如不能set()不能remove()元素,可以替换全部元素或者添加同一个元素. static List<String> list =Arrays .asList("one Two three

黑马程序员——Java基础---String类

--Java培训.Android培训.iOS培训.UI培训.PHP培训.期待与您交流! -- Scanner的概述和方法介绍 1.Scanner类的构造方法 Scanner(InputStream source) 2. 一般方法 hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等.如果需要判断是否包含下一个字符串,则可以省略Xxx package com.geekds.scanner; import java.util.Scanner; public cl

黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&amp;懒汉式

第一讲  面向对象概念 1.  定义 相对于与面向过程而言的,将功能封装进对象,我们只关心具备了该功能的对象,而不用关注对象的具体细节. 面向对象的特点:使复杂问题简单化.我们只关心什么对象能处理什么事情,而不用关心具体的实现细节. 2.  面向对象特征 封装.继承.多态. 第二讲  类和对象的关系 1.  概述 类就是:对现实生活中事物的描述,可以是实体的事物也可以是一件事等: 对象是:是某类事物的实例,实实在在存在的个体: 映射到java中,描述就是class定义的类. 具体对象就是对应ja

黑马程序员-java基础-String类

1.概述 String 类适用于描述字符串事务.提供了多种对字符串进行操作的方法. > 字符串的最大的特点:一旦被初始化就不能被改变. 2.常见的操作方法: 2.1 获取: 1 public class StringText1 { 2 public static void main(String srgs[]) 3 { 4 // str 是一个类类型变量,"abc"是一个对象. 5 String str = "hello java!" ; 6 // str 和

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员--Java基础--01基本概念

1.Java的三大技术架构 JAVAEE(Java Platform Enterprise Edition):  开发企业环境下的应用程序,主要针对web程序开发: JAVASE(Java Platform Standard Edition): 完成桌面应用程序的开发,是其他两者的基础 JAVAME(Java Platform Micro Edition): 开发电子消费产品和嵌入式设备,如手机中的程序 我对三大技术构架理解 1.三大技术是指哪三大技术呢? 答:三大技术分别指JAVAEE,JAV

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——java基础——多线程

 黑马程序员--java基础--多线程 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量.