【从零开始的Java秃头之旅】01

从零开始的秃头之旅之Java篇

先介绍一下本人的情况,某辣鸡本科计算机系在读,但是不是计算机科学与技术专业,目前大四,深感就业无望,遂决定奋发图强学习java。现在的学习路线就是跟着网上的java某马培训机构基础视频走,共有500多P,目前已经学到了260+p,以后就当记录每天的学习情况,当作一个个人笔记。如果有什么写错的地方,路过的大佬麻烦指点一二。

Collections集合工具类

今天主要学习了一些Collections工具类的方法,主要有以下四个方法:
-public static boolean addAll(Collection c, T… elements):往集合中添加一些元素。
-public static void shuffle(List list): 打乱集合顺序
-public static void sort(List list): 将集合中元素按照默认规则排序。
-public static void sort(List list,Comparator):将集合元素按照指定规则排序。

第一个方法比较简单,但说实话并没有特别读懂其中为什么返回类型是要布尔值。这个方法就是用来添加多个元素,避免多个add()方法出现。
【从零开始的Java秃头之旅】01_第1张图片
第二个方法就无需解释了,就是将集合元素打乱。
第三个方法也比较简单,就是将集合中的元素进行默认排序,不过能够默认排序的元素类型应该仅限于String和Intger类,一旦涉及到自定义类,便只能通过自定义规则来定义排序规则。
那么说到这个自定义规则,我们就得先明白一点,sort(List list)使用前提是被排序的集合里边存储的元素,必须实现Comparable接口,那么意味着我们就必须要重写接口中的CompareTo方法
【从零开始的Java秃头之旅】01_第2张图片
实现Comparable接口,泛型填入Person类
【从零开始的Java秃头之旅】01_第3张图片 那么这边第一个问题就来了,为什么compareTo方法的返回值类型是int因为:compareTo就是比较两个值,如果前者大于后者,返回1,等于返回0,小于返回-1。
接下来的问题就是为什么this-参数 是升序排列,参数-this是降序排列。查阅了好几个回答后,发现这个貌似是API文档中方法定义,所以只能死记硬背了?与这个相似的还有compare(T o1,T o2)方法。

说到最后一个方法Comparator,那就得和第三个Comparable进行比较了。

Comparator和Comparable的区别:
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法。
Comparator: 相当于找一个第三方的裁判,比较两个参数。
那么话不多说,我们直接看代码:

ArrayList list02 = new ArrayList<>();
		 list02.add(new Student("b迪丽热巴",18));
		 list02.add(new Student("古力娜扎",20));
		 list02.add(new Student("玛尔扎哈",17));
		 list02.add(new Student("a玛尔扎哈",18));
		 System.out.println(list02);
			 
		 Collections.sort(list02,new Comparator() {
			 //按照年龄升序排列
			@Override
			public int compare(Student o1, Student o2) {
				int result =  o1.getAge()-o2.getAge();
				//如果两个人年龄相同,再使用姓名的第一个字比较
					if(result == 0){
					result = o1.getName().charAt(0)-
					o2.getName().charAt(0);
					}
					return result;
				}		 
			 });
			 System.out.println(list02);

首先这里先自定义了一个Student类,无参有参构造、gettersetter方法都整上。接下来就开始练习comparator方法。
值得一提的是,这里的Student类必须要重写toString方法,否则的话这边输出的打印值会是哈希值,而并不是我们想要的name和age。
经过百度,原因如下:
toString方法的目的是使用文字描述这个对象里各个变量是什么值 ,这个变量是什么类型的变量等 ,并且任何类都从Object继承了这个方法,你不重写toString()方法的话输出的就是一个内存地址,也就是哈希码值。并不是输出这个类的各个变量的值。

接下来注意到compare(Student arg0.Student arg1)方法中,我们用arg0-arg1实现了升序排列(若改为o2.getAge()-o1.getAge();就是降序排列)。
其次我们看到最后两个getName().charAt(0); 返回值应该是字节类型,可是最后result还是能直接当作返回值。为什么呢?
因为:Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把两个byte类型值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型。
这里我们两个char类型数据相减,所以得到了int类型的结果,随后可以进行返回值。

你可能感兴趣的:(【从零开始的Java秃头之旅】01)