黑马程序员——java基础——集合工具类

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



集合工具类及其他常用类:

1Collections

1Collections简介

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

    它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法,并且没有封装特有数据。

2)常见方法

a)查找

    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集合中的指定对象

b)替换

    voidfill(List<? super T> list, Tobj);//list集合中的全部元素替换成指定对象obj

    booleanreplaceAll(List<T> lsit,ToldVal,T newVal);//newVal替换集合中的oldVal

    void swap(Listlist,int i,int j);/在指定列表的指定位置处交换元素

c)排序:

    void shuffle(List<?> list);//使用默认随机源对list集合中的元素进行随机排序

    void sort(Lsit<T> list);//根据自然顺序对list集合中的元素进行排序

    voidsort(List<T>lsit,Comparator<? super T> c);//根据指定比较器c的排序方式对list集合进行排序

d)反转

    reverse(List<?> list);//反转list集合中元素的顺序

    Comparator reverseOrder();//返回一个比较器,强行逆转了实现Comparable接口的对象的自然顺序

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

e)同步集合

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

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

3)Collection  Collections的区别:

    Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。

    Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有SetList,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。


2Arrays

1Arrays简介

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

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

2)常见方法

    a) Lsit<T> asList(T... a);//将数组转换为集合

注意:

    将数组转换成集合,不可使用集合的增删方法,因为数组的长度是固定的。如果进行增删操作,则会产生UnsupportedOperationException的编译异常。

    如果数组中的元素都是对象,则变成集合时,数组中的元素就直接转为集合中的元素。

    如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

    b) binarySearch()//二分查找方法

fill()//替换方法

sort()//排序方法等

特点:可对数组元素进行相应操作,可以接受除boolean之外的其他各种基本数据类型及有序的引用类型数组的参数,且还可以对指定元素的范围,并可根据指定比较器进行相应的操作。

       如:sort(T[]a,Comparator<? super T> c)

             fill(int[]a,intfrom,int to)

    c) String toString();//可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式。

    d) asList方法:将数组转换成list集合。

    String[] arr = {"abc","kk","qq"};

    List<String> list = Arrays.asList(arr);//arr数组转成list集合。

    将数组转换成集合,有什么好处呢?

    aslist方法,将数组变成集合,可以通过list集合中的方法来操作数组中的元素:

    isEmpty()containsindexOfset 

注意(局限性):数组是固定长度,不可以使用集合对象增加或者删除等,会改变数组长度的功能方法。比如addremoveclear。(会报不支持操作异常UnsupportedOperationException);

如果数组中存储的引用数据类型,直接作为集合的元素可以直接用集合方法操作。

如果数组中存储的是基本数据类型,asList会将数组实体作为集合元素存在。

     e)集合变数组:用的是Collection接口中的方法:toArray();

    如果给toArray传递的指定类型的数据长度小于了集合的size,那么toArray方法,会自定再创建一个该类型的数据,长度为集合的size

    如果传递的指定的类型的数组的长度大于了集合的size,那么toArray方法,就不会创建新数组,直接使用该数组即可,并将集合中的元素存储到数组中,其他为存储元素的位置默认值null

    所以,在传递指定类型数组时,最好的方式就是指定的长度和size相等的数组。

    将集合变成数组后有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。

 

3、增强for循环

foreach语句,foreach简化了迭代器。

格式:

for( 元素类型 变量名 : Collection集合 & 数组 ) {

}

增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器

1)高级for循环和传统for循环的区别

    高级for循环在使用时,必须要明确被遍历的目标。这个目标,可以是Collection集合或者数组,如果遍历Collection集合,在遍历过程中还需要对元素进行操作,比如删除,需要使用迭代器。

    如果遍历数组,还需要对数组元素进行操作,建议用传统for循环因为可以定义角标通过角标操作元素。如果只为遍历获取,可以简化成高级for循环,它的出现为了简化书写。

    高级for循环可以遍历map集合吗?不可以。但是可以将map转成set后再使用foreach语句。

 

2)高级for作用:对存储对象的容器进行迭代: 数组  collection   map

3)增强for循环迭代数组:

String [] arr = {"a", "b", "c"};//数组的静态定义方式,只试用于数组首次定义的时候

for(String s : arr) {

System.out.println(s);

}

4)迭代单列集合 Collection:

List list = new ArrayList();

list.add("aaa");

// 增强for循环没有使用泛型的集合能不能使用增强for循环迭代?能

for(Object obj : list) {

String s = (String) obj;

System.out.println(s);

}

5)迭代双列集合 Map:

Map map = new HashMap();

map.put("a", "aaa");

// 传统方式

Set entrys = map.entrySet(); // 1.获得所有的键值对Entry对象

iter = entrys.iterator(); // 2.迭代出所有的entry

while(iter.hasNext()) {

Map.Entry entry = (Entry) iter.next();

String key = (String) entry.getKey(); // 分别获得keyvalue

String value = (String) entry.getValue();

System.out.println(key + "=" + value);

}

// 增强for循环迭代:原则上map集合是无法使用增强for循环来迭代的,因为增强for循环只能针对实现了Iterable接口的集合进行迭代;Iterablejdk5中新定义的接口,就一个方法iterator方法,只有实现了Iterable接口的类,才能保证一定有iterator方法,java有这样的限定是因为增强for循环内部还是用迭代器实现的,而实际上,我们可以通过某种方式来使用增强for循环。

for(Object obj : map.entrySet()) {

Map.Entry entry = (Entry) obj;  // obj 依次表示Entry

System.out.println(entry.getKey() + "=" + entry.getValue());

}

6)集合迭代注意问题:在迭代集合的过程中,不能对集合进行增删操作(会报并发访问异常);可以用迭代器的方法进行操作(子类listIterator:有增删的方法)。

7)增强for循环注意问题:在使用增强for循环时,不能对元素进行赋值;

 

 

4、可变参数(...):

    用到函数的参数上,当要操作的同一个类型元素个数不确定的时候,可是用这个方式,这个参数可以接受任意个数的同一类型的数据。

    和以前接收数组不一样的是:

    以前定义数组类型,需要先创建一个数组对象,再将这个数组对象作为参数传递给函数。现在,直接将数组中的元素作为参数传递即可。底层其实是将这些元素进行数组的封装,而这个封装动作,是在底层完成的,被隐藏了。所以简化了用户的书写,少了调用者定义数组的动作。

    如果在参数列表中使用了可变参数,可变参数必须定义在参数列表结尾(也就是必须是最后一个参数,否则编译会失败。)

    如果要获取多个int数的和呢?可以使用将多个int数封装到数组中,直接对数组求和即可。

 

5System

1)简介

System是描述系统一些信息的类,类中的属性和方法都是静态的。不能被实例化,没有提供构造函数。

字段摘要

       out:标准输出流。默认是控制台。

       in:标准输入流。默认是键盘。

2)常用方法

a)获取系统的属性信息:

    PropertiesgetProperties();

    说明:

    此方法返回的双列集合,即键值对;因为PropertiesHahstable的子类,也就是Map集合的一个子类对象,那么通过Map方法取出该集合中的元素。

    该集合存储的都是字符串,没有泛型定义

b)获取指定属性信息:

    StringgetProperty(Stringkey);

c)在系统内定义特有信息:

    StringsetProperty(Stringkey,String value);

d)如何在jvm启动时,加载一些属性信息:

    通过命令:java -D<name>=<value>可以设置特有的系统属性信息

 

6Runtime类

1)简介

    每个java应用程序都有一个Runtime类实例,使用应用程序能与其中运行的环境相连接,应用程序不能创建自己的Runtime类的实例,是由系统底层自己创建的。

    该类中并没有提供构造函数。说明不可以new对象。那么会直接想到该类中的方法都是静态的。查阅API文档发现,该类中还有非静态方法。说明该类肯定会提供了方法获取本来对象。而且该方法是静态的,并返回值类型是本来类型。

    由以上特点可以看出该类使用了单例设计模式完成。

2)常用方法

a)获取本类对象

    staticRuntimegetRuntime();

b)在单独的进程中执行指定字符串命令

    Processexec(Stringcommand);

c)Process中有一个杀掉子进程的方法,可将exec方法开启的进程结束

    void destroy();

 

7Math

       Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。该类全为静态方法。

1)常见方法

a) doubleceil(double d);//返回大于指定数据的最小整数

b) doublefloor(double d);//返回小于指定数据的最大整数

c) double pow(doublea,double b);//返回ab次方

d) long round(doubleb);//返回b四舍五入的值 

e) doublerandom();//返回正号的double值,是一个大于等于0.0且小于1.0的随机数

2)Random类

    这是java.util中的一个单独的类,该类对象用于获取随机数。与Math中的random方法是一样的,不过这个类有自身的方法,可以将相应的随机数强转为指定基本数据类型。

    如:intnextInt(int n);//返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。

 

8Date

1)简介

    Date类表示特定的瞬间,精确到毫秒。

    java中的默认显示格式为:Mon Jun 1022:35:21 CST2013

2自定义格式

    默认的格式不一定满足每个人的需求,那么就需要自定义格式化模式。因为Date类中的大部分方法已过时,所以只能找其子类来实现。子类DateFormat中有format方法可以实现,但是DateFormat是抽象类,不能实例化。但是其下有个SimpleDateFormat子类,可以定义时间模式。

具体步骤:

    a)创建Date对象

    b)将时间模式封装到SimpleDateFormat对象中

    c)调用format方法让格式化模式指定Date对象

 

9Calendar

1)简介

    Calendar是一个抽象类,它为特定瞬间与一组诸如YEARMONTHDAY_OF_MONTH等日历字段之间的转换提供了一些方法。

    Calendar可以对年月日等时间进行获取。并提供了相应的子段值。可参阅API文档。

2)方法:

a)基本获取时间

         获取年份:Calendar.YEAR

获取月份:Calendar.MONTH

获取日期:Calendar.DAY_OF_MONTH

获取星期:Calendar.DAY_OF_WEEK

获取小时:Calendar.HOUR_OF_DAY

获取分钟:Calendar.MINUTE

获取秒数:Calendar.SECOND

b)设置时间:

根据日历的规则,为给定的日历字段添加或减去指定的时间量:

               void add(int field,int amount);

获取指定的日历字段对应的时间值:

               int get(int field);

将给定日历字段对应的时间值设置为给定值:

               void set(int field,int value);

设置日历字段 YEARMONTHDAY_OF_MONTH的值:

               void set(int year,int month,int date);

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值