黑马程序猿——19,Collections工具类,Arrays工具类,高级for循环,可变參数,静态导入
------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
黑马程序猿——19,Collections工具类,Arrays工具类
/*
Collections是一个类。注意,这里后面带有一个s
千万不要和Collection弄混了!
Collection仅仅是接口而已。
两者要差别开来。
Collections是一个工具类。
这个类里面所有方法都是静态的,能够直接类名调用。
什么时候用到这个工具类呢?
比如。List集合里面能够有反复元素,可是想要对这些元素排列的话,怎么办?
这个时候就要用到这个工具类了。
这个工具类就是专门针对集合进行操作的工具类。
比如这个工具类里面有一个定义好的静态方法sort
public static <T extend Comparable<? super T>> void sort(List<T> list)
调用的时候直接Collections.sort(li);
当中,li是List<Teacher>的实例。那么这就要求Teacher类的对象本身要具备比較性
另一个经常使用的方法
public static <T>void sort(List<T>list, Comparator<? super T> c)
调用的时候直接Collections.sort(li,compa);
当中。li是List<Teacher>的实例,
而compa是实现了Comparator接口的子类的实例,
这个比較器操作的是Teacher类或者Teacher类的子类的对象。
那么这个时候,就会依照比較器的规则来对元素排序。
*/
import java.util.*;
class Je
{
public static void main(String[] args)
{
method(fh());
method2(fh());
method3(fh());
System.out.println("HelloWorld!");
}
public static List<String> fh()
{
List<String> biaoge=new ArrayList<String>();
biaoge.add("bfuibag");
biaoge.add("ibu");
biaoge.add("ibu");//注意这里有反复元素
biaoge.add("uitweru");
biaoge.add("fvgfiberbrt");
biaoge.add("zz");
biaoge.add("juykui");
soc("原本biaoge---"+biaoge);//先打印原本顺序的biaoge
return biaoge;
}
public static void method(List<String> biaoge)
{
soc("以下是method------");
Collections.sort(biaoge);//依照元素的自然顺序排列
soc("新排列biaoge---"+biaoge);
//接着再打印使用Collections.sort()方法排列好的biaoge
//String类的对象字符串本身就具备比較性
//使用Collections.sort()进行排序。遇到了反复元素也不会剔除掉的
}
public static void method2( List<String> biaoge)
{
soc("以下是method2------");
Collections.sort(biaoge,new Bijiao());//依照比較器比較排列
soc("新排列biaoge---"+biaoge);
//这里即便是使用比較器比較,反复元素也不会被剔除
}
public static void method3(List<String> biaoge)
{
//取得最大值
soc("以下是method3------");
String max=Collections.max(biaoge);
//依照元素自然顺序取得最大值。注意并非依照角标取最大值!
soc("max="+max);
Collections.sort(biaoge);
max=Collections.max(biaoge);
soc("max="+max);
max=Collections.max(biaoge,new Bijiao());
//依照比較器取得最大值
soc("max="+max);
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
class Bijiao implements Comparator<String>
{
public int compare(String s1,String s2)
{
if(s1.length()>s2.length())
{
return 1;
}
if(s1.length()==s2.length())
{
return s1.compareTo(s2);
}
return -1;
}
}
/*
以上代码编译执行结果;
原本biaoge---[bfuibag,ibu, ibu, uitweru, fvgfiberbrt, zz, juykui]
以下是method------
新排列biaoge---[bfuibag,fvgfiberbrt, ibu, ibu, juykui, uitweru, zz]
原本biaoge---[bfuibag,ibu, ibu, uitweru, fvgfiberbrt, zz, juykui]
以下是method2------
新排列biaoge---[zz, ibu,ibu, juykui, bfuibag, uitweru, fvgfiberbrt]
原本biaoge---[bfuibag,ibu, ibu, uitweru, fvgfiberbrt, zz, juykui]
以下是method3------
max=zz
max=zz
max=fvgfiberbrt
Hello World!
*/——————切割线——————
/*
Collections中的经常用法的调用
*/
import java.util.*;
class Je2
{
public static void main(String[] args)
{
fillDemo(fh());
replaceAllDemo(fh());
reverseDemo(fh());
reverseOrderDemo();
}
public static List<String> fh()
{
List<String> biaoge=new ArrayList<String>();
biaoge.add("bfuibag");
biaoge.add("ibu");
biaoge.add("ibu");//注意这里有反复元素
biaoge.add("cfff");
biaoge.add("zz");
biaoge.add("rrr");
biaoge.add("juykui");
return biaoge;
}
public static void binarySearchDemo(List<String> biaoge)
{
soc("以下是binarySearchDemo---");
Collections.sort(biaoge);//排序
soc(biaoge);
int jb= Collections.binarySearch(biaoge,"rrr") ;
//用折半查找法在biaoge中寻找"ddd",返回相应的角标
soc("jb="+jb);
int cz= Collections.binarySearch(biaoge,"rkk") ;
soc("cz="+cz);//这句话打印的是cz=-6
/*
用Collections.binarySearch()找不到列表中的元素时候,
返回的一定是负数。负号表示不存在,之后的数值是假设
不影响元素排列顺序的话合适的插入位置。
Set集合有内部隐藏自己的排列方式,所以该方法是用于List集合的。
假设元素本身不具备比較性,能够加一个比較器。写法例如以下:
int cz=Collections.binarySearch(biaoge,"rkk",biComparator) ;
当中biComparator是实现了Comparator<String>接口
*/
}
public static void fillDemo(List<String> biaoge)
{
soc("以下是fillDemo---");
soc("原本的biaoge---"+biaoge);
Collections.fill(biaoge,"yyyyyy");//把全部元素替换成"yyyyyy"
soc(biaoge);
}
public static void replaceAllDemo(List<String> biaoge)
{
soc("以下是replaceAllDemo---");
soc("原本的biaoge---"+biaoge);
Collections.replaceAll(biaoge,"rrr","kkk");
//把rrr替换成了kkk。依照元素替换元素很方便
soc(biaoge);
}
public static void reverseDemo(List<String> biaoge)
{
soc("以下是reverseDemo---");
soc("原本的biaoge---"+biaoge);
Collections.reverse(biaoge);//把List集合的元素翻转排列
soc("reverse后的biaoge---"+biaoge);
}
public static void reverseOrderDemo()
{
soc("以下是reverseOrderDemo---");
TreeSet<String> tg=new TreeSet<String>();
tg.add("bfuibag");
tg.add("ibu");
tg.add("ibu");//注意这里有反复元素
tg.add("cfff");
tg.add("zz");
tg.add("rrr");
tg.add("juykui");
soc("以下是没有加Collections.reverseOrder()的TreeSet集合tg");
soc(tg);
TreeSet<String> ts=new TreeSet<String>(Collections.reverseOrder());
ts.add("bfuibag");
ts.add("ibu");
ts.add("ibu");//注意这里有反复元素
ts.add("cfff");
ts.add("zz");
ts.add("rrr");
ts.add("juykui");
soc("以下是加了反向比較器后ts");
soc(ts);
/*
Collections.reverseOrder()会返回一个反向比較器,这里打印出来的都是反向
另一种用法举一个样例:
TreeSet<String> ts=new TreeSet<String>(Collections.reverseOrder(ggg));
当中ggg是本人随便取名的比較器,这个比較器有自己的规则,可是
Collections.reverseOrder(ggg)把ggg的规则翻转了,那么传给new TreeSet<String>的
规则就是翻转ggg比較规则之后的规则。
*/
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
/*
以上代码编译执行结果:
以下是fillDemo---
原本的biaoge---[bfuibag,ibu, ibu, cfff, zz, rrr, juykui]
[yyyyyy, yyyyyy, yyyyyy, yyyyyy, yyyyyy,yyyyyy, yyyyyy]
以下是replaceAllDemo---
原本的biaoge---[bfuibag,ibu, ibu, cfff, zz, rrr, juykui]
[bfuibag, ibu, ibu, cfff, zz, kkk, juykui]
以下是reverseDemo---
原本的biaoge---[bfuibag,ibu, ibu, cfff, zz, rrr, juykui]
reverse后的biaoge---[juykui, rrr, zz, cfff, ibu, ibu, bfuibag]
以下是reverseOrderDemo---
以下是没有加Collections.reverseOrder()的TreeSet集合tg
[bfuibag, cfff, ibu, juykui, rrr, zz]
以下是加了反向比較器后ts
[zz, rrr, juykui, ibu, cfff, bfuibag]
*/
————————切割线————————
/*
Collections工具类里面的一些经常用法
*/
import java.util.*;
class Je3
{
public static void main(String[] args)
{
swapDemo(fh());
shuffleDemo(fh());
}
public static List<String> fh()
{
List<String> biaoge=new ArrayList<String>();
biaoge.add("bfuibag");
biaoge.add("ibu");
biaoge.add("ibu");//注意这里有反复元素
biaoge.add("cfff");
biaoge.add("zz");
biaoge.add("rrr");
biaoge.add("juykui");
return biaoge;
}
public static void swapDemo(List<String> biaoge)
{
soc("以下是swapDemo---");
soc(biaoge);
Collections.swap(biaoge,3,4);
//换位操作,把第三位和第四位换一下位置
soc("换位后的biaoge---"+biaoge);
}
public static void shuffleDemo(List<String> biaoge)
{
soc("以下是shuffleDemo---");
soc(biaoge);
Collections.shuffle(biaoge); //把元素顺序打乱
soc(biaoge);
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
/*
以上代码编译执行结果:
以下是swapDemo---
[bfuibag, ibu, ibu, cfff, zz, rrr, juykui]
换位后的biaoge---[bfuibag,ibu, ibu, zz, cfff, rrr, juykui]
以下是shuffleDemo---
[bfuibag, ibu, ibu, cfff, zz, rrr, juykui]
[rrr, juykui, ibu, cfff, ibu, zz, bfuibag]
*/————————切割线————————
/*
Arrays类也是一个工具类针对数组操作的工具类。
Arrays类里面的都是静态类。
*/
import java.util.*;
class Je4
{
public static void main(String[] args)
{
toStringDemo();
asListDemo();
}
public static void asListDemo()
{
soc("以下是asListDemo---");
String[] s={"sdf","hjk","yuiio"};
List<String> k= Arrays.asList(s);
//k.add("kiuh");
/*
把数组s转换成了List集合,
可是由数组转成集合后不能对其进行添加或者删减操作,否则执行时异常
由于数组长度已经是固定好的了。
这里的数组里面的元素时String型。就是对象。
当数组里面元素时对象的时候,调用这种方法就能够直接转成List集合。
*/
soc("k---"+k);
int[] s2={12,36,14,45};
List k2=Arrays.asList(s2);
//此句等同于List<int[]> k2=Arrays.asList(s2);
soc("k2---"+k2);
/*
这里打印出来的是数组相应的哈希值,
假设数组中的元素为基本数据类型。
Arrays.asList()方法就会把整个数组作为一个元素存进List集合里面。
*/
Integer[] s3={5,14,78,5,4};
//该数组元素是对象。注意分清。
List<Integer> k3=Arrays.asList(s3);
soc("k3---"+k3);
}
public static void toStringDemo()
{
soc("以下是toStringDemo---");
int[] x={12,85,4,74,32,46};
soc(Arrays.toString(x));
//Arrays.toString(x)返回的是数组x的信息
}
public static void soc(Object obj )
{
System.out.println(obj );
}
}
/*
以上代码编译执行结果:
以下是toStringDemo---
[12, 85, 4, 74, 32, 46]
以下是asListDemo---
k---[sdf, hjk, yuiio]
k2---[[I@659e0bfd]
k3---[5, 14, 78, 5, 4]
*/
————————切割线————————
/*
集合转成数组:
*/
import java.util.*;
class Je5
{
public static void main(String[] args)
{
List<String> s=new ArrayList<String>();
s.add("sss01");
s.add("sss02");
s.add("sss03");
s.add("sss04");
soc("s---"+s);
String[] z= s.toArray(new String[7]);
/*
toArray()方法是Collection接口的方法。
假设没有new String[7]就会执行时候报错,
由于to Array()方法返回的是Object类对象的数组。
添加new String[7]后会建立而且返回一个长度为7的String类型数组。
[]里的长度过长就会填充null,假设长度过短就又会新建一个合适长度的数组。
为了节约资源,应该刚好填合适长度的。
比如在这道题中,应该这么写:
String[] z=s.toArray(new String[s.length()]);
集合转成数组之后就不能添加删减操作了。
这也是为了限制对元素的操作。
*/
soc("z---"+Arrays.toString(z));
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
/*
以上代码编译执行结果:
s---[sss01, sss02, sss03, sss04]
z---[sss01, sss02, sss03, sss04, null,null, null]
*/
——————切割线——————
/*
高级for循环
for(数据类型 变量名:被遍历的集合或者数组)
{
语句;
}
高级for循环是从jdk1.5版本号出现的。底层调用了迭代器
高级for循环不能对角标进行操作。这也是其不足之处。
*/
import java.util.*;
class Je6
{
publicstatic void main(String[] args)
{
List<String> s=new ArrayList<String>();
s.add("hjk");
s.add("yhdn");
s.add("vgbda");
s.add("tr");
for(String a: s)
{
a="233";
soc(a);
}
soc(s);
/*这一点要注意:
a原本仅仅是指向被遍历对象而已。即便a被赋值了,
依然没有改变被遍历对象里面的值。
*/
for(String a: s)
{
soc(a);
}
soc(s);
Map<String,String> m=new HashMap<String,String>() ;
m.put("yu01","李四");
m.put("yu12","小姐");
m.put("yu3","大炮");
m.put("yu45","红的");
Set<Map.Entry<String,String>> rt = m.entrySet();
for( Map.Entry<String,String> me: m.entrySet() )
{
soc( "Key---" +me.getKey()+" Value---"+me.getValue());
}
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
/*
以上代码编译执行结果:
233
233
233
233
[hjk, yhdn, vgbda, tr]
hjk
yhdn
vgbda
tr
[hjk, yhdn, vgbda, tr]
Key---yu01 Value---李四
Key---yu12 Value---小姐
Key---yu45 Value---红的
Key---yu3 Value---大炮
*/——————切割线——————
/*
jdk1.5版本号出现的新特性:
可变參数
*/
import java.util.*;
class Je7
{
public static void main(String[] args)
{
kk(12,45,75,62); //隐形的把这些数字封装成数组
//kk2(455,58,"hjn");//这句话编译错误
/*
为什么第二句的kk2(455,58,"hjn");编译时候会出错呢?
由于使用可变參数的时候,已经自己主动把括号中面的数字包装成数组了,
后面的"hjn"则是不能够被装进int型的数组里面。
*/
kk3("hjk",56,84,24);
//这句话编译执行成功的,表明可变參数要定义在括号的最后面
}
public static void kk(int... a)
//当然这里不只只能够写int,也能够是其它类型比如String等等或者是自定义的类型
{
System.out.println(a.length);
}
/*
public static void kk2(int... a,String)//这句话编译出错
{
System.out.println(a.length);
}
*/
public static void kk3(String a,int... b)
{
System.out.println(b.length);
}
}————————切割线——————
/*
静态导入
*/
import java.util.*;
import static java.util.Arrays.*;//导入Arrays类中全部的静态成员
import static java.lang.System.*;//导入System类中全部静态成员
class Je8
{
public static void main(String[] args)
{
int[] x={12,65,75,48};
//Arrays.sort(x);
sort(x);//把数组排序
/*
由于之前导入Arrays类中全部的静态成员,
所以Arrays.sort(x);的Arrays能够省略。
*/
soc(Arrays.toString(x));
/*
soc(toString(x));//这句话编译不通过
尽管前面导入了Arrays类里面的静态成员都导入了,
可是toString()这种方法在Object类里面也有,
全部的类都是直接或者间接继承Object类,
对于这样的不同包里面有同名方法,
假设不明白写出哪一个包或者哪一个类的方法,
编译会出错。
*/
System.out.println("HelloWorld!");
out.println("huhu");
}
public static void soc(Object obj)
{
System.out.println(obj);
}
}
浙公网安备 33010602011771号