------<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); } }