您的位置:首页 > 职场人生

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

2014-09-10 11:41 204 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


集合工具类及其他常用类:
1、Collections
1)Collections简介
    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下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。

2、Arrays:
1)Arrays简介
     Arrays是用于操作数组的工具类。里边的方法也全是静态的。不需要创建对象。
    把数组变成List集合的好处:可以使用集合的思想和方法来操作数组中的元素。如:contains,get,indexOf,subList等方法。
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()、contains、indexOf、set; 
注意(局限性):数组是固定长度,不可以使用集合对象增加或者删除等,会改变数组长度的功能方法。比如add、remove、clear。(会报不支持操作异常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(); // 分别获得key和value
String value = (String) entry.getValue();
System.out.println(key + "=" + value);
}
// 增强for循环迭代:原则上map集合是无法使用增强for循环来迭代的,因为增强for循环只能针对实现了Iterable接口的集合进行迭代;Iterable是jdk5中新定义的接口,就一个方法iterator方法,只有实现了Iterable接口的类,才能保证一定有iterator方法,jav
e143
a有这样的限定是因为增强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数封装到数组中,直接对数组求和即可。
 
5、System类
1)简介
System是描述系统一些信息的类,类中的属性和方法都是静态的。不能被实例化,没有提供构造函数。
字段摘要
       out:标准输出流。默认是控制台。
       in:标准输入流。默认是键盘。
2)常用方法
a)获取系统的属性信息:
    PropertiesgetProperties();
    说明:
    此方法返回的双列集合,即键值对;因为Properties是Hahstable的子类,也就是Map集合的一个子类对象,那么通过Map方法取出该集合中的元素。
    该集合存储的都是字符串,没有泛型定义
b)获取指定属性信息:
    StringgetProperty(Stringkey);
c)在系统内定义特有信息:
    StringsetProperty(Stringkey,String value);
d)如何在jvm启动时,加载一些属性信息:
    通过命令:java -D<name>=<value>可以设置特有的系统属性信息
 
6、Runtime类
1)简介
    每个java应用程序都有一个Runtime类实例,使用应用程序能与其中运行的环境相连接,应用程序不能创建自己的Runtime类的实例,是由系统底层自己创建的。
    该类中并没有提供构造函数。说明不可以new对象。那么会直接想到该类中的方法都是静态的。查阅API文档发现,该类中还有非静态方法。说明该类肯定会提供了方法获取本来对象。而且该方法是静态的,并返回值类型是本来类型。
    由以上特点可以看出该类使用了单例设计模式完成。
2)常用方法
a)获取本类对象
    staticRuntimegetRuntime();
b)在单独的进程中执行指定字符串命令
    Processexec(Stringcommand);
c)在Process中有一个杀掉子进程的方法,可将exec方法开启的进程结束
    void destroy();
 
7、Math类
       Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。该类全为静态方法。
1)常见方法
a) doubleceil(double d);//返回大于指定数据的最小整数

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

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

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

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

2)Random类

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

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

 
8、Date类
1)简介
    Date类表示特定的瞬间,精确到毫秒。
    java中的默认显示格式为:Mon Jun 1022:35:21 CST2013
2)自定义格式

    默认的格式不一定满足每个人的需求,那么就需要自定义格式化模式。因为Date类中的大部分方法已过时,所以只能找其子类来实现。子类DateFormat中有format方法可以实现,但是DateFormat是抽象类,不能实例化。但是其下有个SimpleDateFormat子类,可以定义时间模式。
具体步骤:
    a)创建Date对象
    b)将时间模式封装到SimpleDateFormat对象中
    c)调用format方法让格式化模式指定Date对象
 
9、Calendar类
1)简介
    Calendar是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_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);
设置日历字段 YEAR、MONTH和DAY_OF_MONTH的值:
               void set(int year,int month,int date);
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 黑马程序员
相关文章推荐