您的位置:首页 > 编程语言 > Java开发

Java基础总结09————集合框架(二)

2014-04-13 04:40 369 查看
集合框架————其他工具与类
-------android培训java培训、期待与您交流!----------
内容: Collections(集合工具类)与Arrays、接口Iterable与高级for循环、

可变参数、System(系统)类、Runtime与Process、Date与Calender、Math与Random

————————————Collections集合工具类—————————————

九、集合工具类Collections、数组工具类Arrays : (java.util包中工具类)

已知数组Array的排序可调用Arrays.sort(数组名)方法,其实这是Arrays工具类中的静态方法。而集合Collection中也有一个操作集合的工具类Collections。

1、Collection工具类的作用:

为Collection集合中不具备排序功能的集合List等提供操作集合的功能。

(不包括Set,因为TreeSet等具备排序功能,Map映射是通过TreeMap或Set集合间接实现。)

Collection工具类中的静态方法:
(类名调用)

A、排序:

Collections.sort(List list,Comparatorcomp); :
自然排序或指定比较器排序;

.reverse(List<?>list); :
反转整个列表的元素顺序;

.swap(List<?>list, int i, int j) :
指定列表的指定位置处交换元素。

.shuffle(List<?>list) :使用默认随机源,对指定列表进行随机排序。

B、获取:

max(Collection c,Comparator cmp);
: 返回集合中的最高或最低位;

min(Collection<?extends T> c ); (可选择是根据自然顺序或添加比较器)

frequency(Collection<?>c, Object o) :
返回指定集合等于指定对象的元素数;

使用二分搜索法搜索指定列表(自身具备比较器或添加比较器),以获得指定对象的方法:

<T>int .binarySearch(List<? extendsComparable<? superT>> list,T key)

.binarySearch(List<?extends T> list,T key,Comparator<? superT> c)

【如果不存在,则返回该元素在list中插入点的 负数"角标"-1数值。】

C、替换:

T fill(list,T t); :
将List集合中所有元素替换为指定元素;

replaceAll(list,obj1,obj2); :将指定集合中指定元素(所有的obj1)替换为obj2;

D、复制、添加:

copy(List<? super T> dest,List<? extends T> src);

:
复制指定列表中的所有元素到另一个列表;

addAll(Collection<? super T> c,T... elements) :
将所有指定元素添加到指定集合;

【PS :
T...elements意为可变参数,即可添加多个T类型的参数对象】

2、公共集合操作方法: 线程同步、返回比较器;

A、线程同步操作:

static<T> Collection<T> Collections.synchronizedCollection(Collection<T> c)

:
返回指定collection 支持的同步(线程安全的)collection

基本格式: Collections.synchronized+集合类型(集合类型<T>
集合名)

【还可为List、Set、Map、SortedMap、SortedSet提供同步操作,详见Collections类】

B、强转集合、强转比较器:

Comparator<T>
reverseOrder();

返回强行逆转已实现Comparable接口的Collection对象的自然顺序的比较器;

Comparator<T>
reverseOrder(Comparator<T>cmp);

返回一个强行逆转指定比较器排序顺序的比较器。

——————————————Arrays工具类——————————————

十、Arrays工具类中的方法:(类名调用静态方法)

1、数组转集合:

Arrays.asList(T[] t) :返回一个受指定数组支持的固定大小的列表。

2、二分法查找:

binarySearch(T[] t,T key)
:
使用二分搜索法来搜索指定数组,从而获得指定对象。
binarySearch(T[] a, int fromIndex, inttoIndex, T key) : (在指定范围内查找)
还可查找的数组: byte[]、char[]、double[]、float[]、short[]、int[]、long[]。

3、复制:

copyOf(T[] original, int newLength)
:
复制数组到指定长度的新数组;

(长度不够则截取,多余则用false、0、null
填充)

copyOfRange(T[] original, int from, int to) :
将指定数组的指定范围复制到新数组;

4、排序:

sort(Object[] a)
:
对指定数组进行自然顺序的升序排序;

sort(Object[] a, int fromIndex, inttoIndex) :
在数组指定范围内进行升序排序;

sort(T[] a,Comparator<? super T> c)
:
根据指定比较器对指定对象数组进行排序。

sort(T[] a, int fromIndex, inttoIndex, Comparator<? super T>c)

:根据指定比较器排序顺序对指定对象数组的指定范围进行排序。

5、其他:

boolean equals(Object[]o1,Object[] o2); :
判断两个指定数组是否彼此相等;

fill(Object[] o, Objectobj); :
用元素obj替换掉指定数组中的每个元素;

fill(Object[] a, int fromIndex, int toIndex, Object val)

将指定的
Object 引用分配给指定 Object 数组指定范围中的每个元素。

hashCode(Object[]a) :
基于指定数组的内容返回哈希码。

toString(Object[] a) :
返回指定数组内容的字符串表示形式。

【在此仅用Object[] 数组代表Object及八个基本数据类型的数组】

PS :
更多的Collections、Arrays的方法详见API文档的java.util包。

——————————————集合与数组的转换——————————————

十一、集合与数组的转换:

1、数组变成集合: List<T> =Arrays.asList(T[] arr);

示例: int[] i = {2,4,5};

Integer[] it = {2,4,5}; //自动装箱。

在两个数组中,只有Integer[]中元素能存储到集合中,而int[]存储的是整个int[]数组。

代码模拟:

List<int[]> list1 =Arrays.asList(i);
//存储的是int[],非int数值。

List<Integer> list2 =Arrays.asList(it); //Integer是对象,可存储。

注意 :

如果T[] arr(数组)中的元素都是对象(类型),那么直接将数组中的元素转成集合中的元素;如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

【只有对象类型数组能够转换成集合,并将对象元素存储到转换后的集合中】

PS:
因为集合只能存储对象,而基本数据类型不是对象,但是存储基本数据类型的整个数组是一个对象,所以转换时是将整个存储基本数据类型的数组以单个对象存储到集合中。

2、数组转集合 Arrays.asList(T t)
//T
为指定集合类型;

原因、好处:

操作数组方法有限,转换成集合后可调用集合中的方法操作元素(除增删方法);

例如: 判断指定元素在数组中是否存在,需要遍历、判断条件,而转成集合后,只需调用contains()方法即可。

3、集合转数组 (Collection接口类中方法)

Object[] toArray(); :
转换成Object类型数组;

T[] t toArray(T[]t) //T[]为指定数组类型;

注意: 需要指定数组的长度,可将数组长度定义为:
集合的size(); [元素个数];

【定义过短时会重新创建数组,定义过长时则用null来填补空位】

原因、好处:
限定对元素的操作(禁止进行增删元素等);

理由: 当向外提供指定目录中文件的名单时(只是数据资料,而非操作对象),为了保证不被添加、删除(因为不是在该目录等中操作),所以可将存储这些数据的集合转换数组,则无法实现增删操作。

———————————————高级for循环———————————————

十二、高级for循环: (JDK1.5的新特性)

定义: 已知Collection(包括List、Set)等通过实现Iterable接口的iterator()方法调用迭代器Iterator实现元素取出。

Iterable接口有什么特殊?

1、由来: 在JDK1.5版本之前,iterator()方法是嵌套在Collection类中,JDK1.5版本起才通过继承Iterable接口获得该创建迭代器的方法;

2、改进的原因: (了解Iterable接口的功能)

接口Iterable
:

public interfaceIterable<T> :
实现此接口允许对象成为 "foreach" 语句的目标。

方法: Iterator<T> iterator(); 返回可操作T类型集合的迭代器;

即: 实现该接口的对象可调用高级for循环方法:

for(修饰符 数据类型 数据类型名
: 被遍历的Collection集合或数组)

{ ...................; }

【注意: 1、如果要遍历Map映射,跟调用Iterator迭代器一样,但要先转成Set集合。

2、高级for循环的底层原理也是迭代器,通过封装简化代码;

3、高级for循环数据类型之前是可添加修饰符,或默认缺省修饰符,多采用final修饰使其可被内部类调用;】

因此: 通过继承封装的Iterable接口,实现该接口的类对象不仅可以调用迭代器,还能使用“简化书写”的高级for循环方法。

高级for循环与迭代器的区别:

1、高级for循环的底层是封装迭代器方法,简化迭代集合时代码书写;

2、因为高级for是相当于匿名迭代器(该迭代方法只能使用一次),而迭代器可分多次将集合Collection中的元素取完(但是集合中每个元素也只能取一次)。

【注意: ListIterator列表迭代器除外,因为列表迭代器有逆序取出等的方法】

(补充帮助理解,可忽略:) 高级for循环 对应
一个 Iterator 和 while()循环;

(Iterator迭代器仅能遍历集合全部元素一次)

即创建两次for(String s : al){} 相当于创建两个彼此独立但迭代同一集合的迭代器。

【不理解可参考IterableDemo.java中的验证,里面有个不理解的理论,不过感觉是结论歧义了,可能要说的就是第2这个点】

注意: 高级for循环是基于迭代器产生的,虽然它能遍历集合,也能遍历数组,但要求遍历的对象是明确已存在的。(即该集合或数组创建好且已存放需要遍历的元素。)

这也就是高级for循环与一般for循环的区别,因此在不明确数组的情况下优先使用一般for循环。 (PS:
一般for循环只能遍历List集合(带脚标),而迭代器只能遍历集合。)

例如: 给一个数组中添加从1到100的数字元素。

【高级for循环跟迭代器一样,只能遍历集合、数组,不能添加删除集合、数组中的元素,当然列表迭代器ListedIterator除外。】

——————————————可变参数、静态导入——————————————

十三、可变参数、静态导入:

1、可变参数:

格式:
方法(T...t); : 此方法中的“
T...t”就是泛型下的可变参数;

这表示可给该方法传入不限个数的同类型T参数。

例如: 方法: void show(String s,int...args){}

调用该方法传参时: show("hehe",21,3,5,6,7);

注意:

A、如果参数列表中有多种类型参数,可变参数必须要放在最后面(如上);

因此传参的方法只能有一种类型的可变参数(这类似this()、和super()都要放在构造函数第一行)。

B、可变参数(相当于数组)也可用高级for循环遍历: for(intarg : args){....}

2、静态导入:

格式: import static java.util.Array.*; 导入Arrays类中的所有静态成员。

作用:

通过导入指定类中的静态成员,减少编程时类名的书写(静态方法是通过类名调用)。

注意: 当源程序中存在两个或两个以上同名方法时,必须要书写类名来区分。

——————————————其他功能工具类——————————————

十四、其他工具类:

一、System(系统)类: java.lang.System;

1、字段摘要:

static InputStream in :"标准"输入流;

static PrintStream out: "标准"输出流;

static PrintStream err: "标准"错误输出流;

(可指定改变标准输入/输出的方式)

字段 : 一个成员,它表示与对象或类关联的变量;

(简称作对象变量(引用)、类变量,可能有误,仅供理解下面说明)

字段除了这里的in、out、err,还有Integer类中MAX_VALUE、MIN_VALUE等。

in、out和err代表的是对象变量;而MAX_VALUE等代表的是类变量,即final修饰常量。

(类变量就不做深究了,也就是类中的常量,代表某些特定的数值。)

对象变量(in、out)的作用
:

解析: Dos控制台输出语句:System.out.println("hehe");

println(); :
是个打印数据的方法(是PrintStream类中的方法);

System.out :
虽然调用方法却不是类对象,但它是一个对象变量,指向的是它的返回值类型PrintStream,这也就可以解释为什么能调用PrintStream类中的方法。

可看做: PrintStream ps = System.out; (稍有不同于方法)

(同样不通过new对象来调用方法有常见创建迭代器iterator()方法)

PS: 1、System.in、out的默认输入/输出方式是键盘和屏幕(Dos控制台);

2、InputStream、PrintStream是IO流中的输入/输出流之一,在IO流章节也会讲到通过System类中的setIn、setOut方法改变"标准"输入/输出方式。

——————————

简要常用方法: (更多可去查看API文档中的java.lang.System类)

System.gc(); :
运行垃圾回收器;

exit(int status); :终止Java虚拟机(关闭程序)

【正常关闭使用exit(0),其他非0数值表示该程序异常终止】

Properties
getProperty(); :
获取当前系统属性;

【Properties是Hashtable子类,属于Map体系,键值对】

String getProperty(String key);
:
获取指定键描述的系统属性;

String
setProperty(Stringkey,String value); :
设置指定键指定的系统属性;

setIn(InputStream in) :
重新分配"标准"输入流;

setOut(PrintStream out) :
重新分配"标准"输出流;

二、Runtime类: java.lang.Runtime;

Runtime :
使应用程序能够与其运行环境相连接(即用于运行开启指定程序)。

注意: 当一个类没有提供构造函数,也就不能new对象,那么该类中的方法应该都是静态,例如: System、Arrays、Collections等。

但是Runtime中方法还存在非静态方法,那么该类肯定提供了获取本类对象的静态方法,返回值类型是本类类型(Runtime)。

【类似迭代器的创建方法,不同点是创建迭代器方法是封装在其他类的内部,而Runtime是本类中提供静态方法用于获取本类对象。】

方法:

static Runtime
getRuntime(); :
创建本类对象;【单例设计模式—饿汉式】

Process exec(String command); :
在单独的进程中执行指定的字符串命令。

参考格式: Runtime r= Runtime.getRuntime();

r.exec("C:\\QQProtect.exe"); 调用本机中指定目录下程序;
r.exec("QQProtect.exe");
【两者都能运行QQ程序,因为当在指定目录找不到该程序时,跟Java编译程序时一样会调用“环境变量”——Path路径等,如果该程序有设置Path的话】

(PS: Java版快捷方式创建方式应该可以通过该功能实现。)

—————

ProcessBuilder.start();和 Runtime.exec(); 在本机创建进程。

进程Process
:

Process p = Runtime.exec("路径\\启动器 路径\\文件");

Process p
声明对象,因为进程创建只能通过上面两种方式创建开启;

后半部分是运行指定工具打开指定文件,也就在本机创建进程并返回Process子类实例。

Process类中方法
:

abstract void
destroy(); :关闭进程;(只能用于Java程序自身启动的进程对象)

InputStream getInputStream(); :
获取子进程的输入流。

OutputStream getOutputStream(); :
获取子进程的输出流。

—————————————————

三、Date(日期)类 java.util.Date;

其他相关:

TimeZone :
时区(类)

DateFormat :
日期格式化(抽象类,java.text.DateFormat;)

DateFormat子类: SimpleDateFormat。

格式化日期属性(即按指定格式输出日期格式)
:

Date d = new Date();

SimpleDateFormat sdf =
newSimpleDateFormat(yyyy年MM月dd日Ehh:mm:ss)

String time =sdf.format(d); sop("time:"+time);

获取日期单个属性: java.util.Calendar;

Calender 日历;

GregoriarCalendar
格林威治日历(Calender实例化子类)

格式: (示例)

Calender c =Calendar.getInstance();

System.out.println(c.get(Calendar.YEAR)+"年");

【注意: 月份数值是-1的,范围是0—11; 星期:七、一到六】

(因此可用查表法解决,且可实现中文显示等。)

方法 :

c.set(2015.4.23); :
将时间设置为2015.4.24; 【可定义获取其他属性(星期几等)】

c.add(Calendar.DAY_OF_MONTH,-18); :
指定日期前推(18天前等)

其他:

setFirstDayOfWeek(intvalue) :
设置一星期的第一天是哪一天(默认是周日);

TimeZone getTimeZone() :
获取时区;

String toString()
:
返回此日历的字符串表示形式;

————————————————

四、Math(数学)与Random(随机)类:

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

Random类的实例用于生成伪随机数流。

Math类: java.lang.Math;

常数: E : 比任何其他值都更接近
e(即自然对数的底数)的 double 值。

PI :比任何其他值都更接近pi(即圆的周长与直径之比)的double 值。

方法:

float
Math.abs(floatf); :
返回float值的绝对值;

(还可用于double、int、long数值类的基本数据类型)

double Math.ceil(doublea); :
返回大于指定数值的最小整数;

double Math.floor(doublea); :
返回小于指定数组的最大整数;

long/int round(double/float a);:
返回最接近参数的数值(四舍五入);

double pow(a,b); :
返回a^b (a 的
b 次方);

更多: sin(double a)[角的三角正弦]、cos(余弦)、tan(正切)、cbrt(立方根)等;

max(T t1,T t2)、min(T t1,T t2) :返回两个同类型数中较大或较小的数;

注意 : (此方法比Random类的方法方便易使用)

double Math.random(); :
返回正数double值(0.0<x<1.0);

(伪随机数生成器原理: int i = (int)(Math.random()*10+1); 输出1-10的随机数;)

Random(随机)类: java.util.Random;

Int nextInt(inti); :
返回一个“0”(包括)到指定数值间的伪随机数。

Double
nextDouble(); :
返回一个伪随机数(在0.0至1.0范围内的double值)

【可用于boolean、float、int、long等】

nextBytes(byte[] bytes) :
生成随机字节并存储到指定byte数组中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: