对集合的知识补充,可变参数

xiaoxiao2025-10-31  3

import java.util.*; /* * TreeMap使用的注意点: * 1.什么类型的数据类型可以作为key? * a实现了Comparable接口的CompareTo()方法 * b实现了Comparator接口的Compare()方法 * * JAVA的三种引用引用类型:类,接口,数组。 * 其中类和数组的父类都是Object(问了老师,数组的父类是Object) * 而Object类没有做a,b处理 * TreeMap添加键时调用的put方法会去检测是否做了a,b中的任何一个处理,没有会有运行时异常 * 可以的代表:String 包装类,自定义的实现了这两个接口重写了相应方法的任意一个的类 * 不可以的代表:没有做a,b处理的自定义类,数组,ArrayList和LinkedList * * * 疑问:为什么HashMap就任何引用类型都可以作为key? * JAVA的三种引用引用类型:类,接口,数组。 * 其中类和数组的父类都是Object(问了老师,数组的父类是Object) * 接口是没有父类的 * Object类中里有equals()方法和hashCode()方法的声明及方法体 * 所以在HashMap里存对象和数组是没有问题的 * * 2.元素可不可以作为key,跟元素内部的元素类型有没有关系 */ class A{} public class Demo1 { public static void main(String[] args) { TreeMap <char[],String> map=new TreeMap<>(); map.put(new char[] {'d'}, "String"); //在调用put方法的时候会报运行时异常,数组内部没有实现那两个接口 TreeMap<A,Integer> map1=new TreeMap<>(); map1.put(new A(),1); //在调用put方法的时候会报运行时异常,类A内部没有实现那两个接 //2.元素可不可以作为key,跟元素内部的元素类型有没有关系 TreeMap<Test,String> tree=new TreeMap() ; tree.put(new Test(), "ok"); System.out.println(tree); } } class Test implements Comparable{ Object object = new Object(); @Override public int compareTo(Object o) { return 0; } } import java.util.*; public class Demo3 { public static void main(String[] args) { /* * 增强for循环 * 可以遍历的内容: * 数组,Collction---直接遍历 * Map---间接遍历 */ /* * 1遍历数组,Collction: * for(元素的数据类型 变量:数组/Collection) * { * 循环体 * } */ //遍历数组 /* * 原理:当执行增强for循环时,会从数组中自动按顺序取值,取出的值放入前面的变量中, * 本次循环使用的就是当前的变量 * 结束后,自动开始第二个变量,会自动从数组中取出第二个变量,再次放入 * 前面的变量中一次进行下去,直到将数组中的元素取完为止 * 总结:增强for循环会自动生成数组中的每一项将它赋值给指定元素,从而达到遍历的作用 */ int[] arr=new int[] {4,5,7,8,8}; for(int i:arr){ System.out.println(i); } //对Collection实现类的遍历 ArrayList<String> list=new ArrayList<>(); list.add("java2"); list.add("java3"); for(String str:list) System.out.println(str); //对Map的遍历 Map<String,String> map=new HashMap<>(); map.put("01","java"); map.put("04","java3"); map.put("06","java7"); System.out.println(map); //得到set Set<String> set=map.keySet(); //使用增强for循环遍历 for(String key:set) { System.out.println(key+" "+map.get(key)); } } } import java.util.Arrays; import java.util.List; public class Demo4 { public static void main(String[] args) { /* * Arrays:数组工具类,内部封装了大量操作数组的方法--工具类的方法都是静态的 */ //简单数组类型转字符串 int[] arr1= {23,4,6,7,8}; System.out.println(arr1.toString());//[I@7852e922 //打印的hash码,哈希码通常也成为地址 //因为这个值唯一,但是它其实并不是真正的物理地址 //打印出hash码值说明数组并没有重写toString方法 //简单数组类型转字符串---方便查看数组的内容 //内部其实是遍历了这个数组,拼接成字符串 String s1=Arrays.toString(arr1); System.out.println(s1);//[23, 4, 6, 7, 8] //数组转集合?---集合的方法多,方便操作 //基本数据类型的数组转集合 int[] arr2={23,4,6,7,8}; List<int[]> list=Arrays.asList(arr2); //返回一个List集合,集合的泛型为int[],也就是说该List数组的元素是整型的数组 System.out.println(list);[[I@4e25154f] System.out.println(list.size());//1 //该集合中只有一个整形数组元素 //引用类型的数组转集合 String[] strs= {"haha","java","xiake"}; List<String> list2=Arrays.asList(strs); //此时List泛型的类型为String,也就是集合里的元素是String System.out.println(list2);//此时数组与集合的元素一一对应 //[haha, java, xiake] System.out.println(list2.size());//3 //注意点:转过来的集合,内存空间是固定的,即长度不能变,所以不能进行增删元素 //但是可以修改,遍历 //list2.add("hehe");运行时异常 for(String s:list2) { System.out.println(s); } //二分查找 int[] arr3= {3,9,7,8,1}; Arrays.sort(arr3);//二分查找的前提是数组有序,所以要先对数组排序 System.out.println(Arrays.toString(arr3));//[1, 3, 7, 8, 9] int i=Arrays.binarySearch(arr3, 1);//找得到返回>=0,负数表示找不到,这里并不是简单的找不到返回-1,而是任意的复数 System.out.println(i); } } public class Demo5 { //可变参数 //作用:简化代码,方便能操作 //求三个数的和--值传递 public static int sum(int a,int b,int c) { return a+b+c; } //求三个数的和--地址传递 public static int sum(int[] a) { int sum=0; for(int i=0;i<=a.length-1;i++) sum=sum+a[i]; return sum; } //通过可变参数求和 //可变参数的格式:数据类型... //可变参数可以直接理解成一个数组 //int... 等价于int[] //public static int sum(int... a)系统认为这是和上面的sum名字相同,参数表相同的方法,会编译异常 public static int sum1(int... a) { int sum=0; for(int i=0;i<=a.length-1;i++) sum=sum+a[i]; return sum; } //public static int sum2(int... a,int b)编译异常,因为会把传的参数都存到a里 public static int sum2(int b,int... a)// { int sum=0; for(int i=0;i<=a.length-1;i++) sum=sum+a[i]; return sum; } //-------------这两个sum3是重载方法------------- public static int sum3(int a ,int b) { System.out.println("不可变"); return a+b; } //当可变参数的方法与不可变参数的方法是重载关系时,调用的顺序是固定参数的优先于可变参数的 public static int sum3(int...a) { System.out.println("可变"); int sum=0; for(int i=0;i<=a.length-1;i++) sum=sum+a[i]; return sum; } public static void main(String[] args) { //可变参数:参数的个数可以改变 //求和1: System.out.println(sum(9,8,2)); int[] arr1= {3,5,7,9}; sum(arr1); int[] arr2= {3,5,7,9}; sum1(arr2); //注意点: //1.给这个可变参数传值的实参可以直接写且个数不限制 sum1(35,7,8);//系统自动把数封装到一个数组,把数组作为一个参数传给方法 //2.当包括可变参数在内有多个参数时,可变参数必须写在参数表的最后,并且一个方法只能有一个可变参数 System.out.println(sum3(3,4)); } } import java.util.*; /* * Collections:操作类,内部封装了大量的操作Collections的方法 */ public class Demo6 { public static void main(String[] args) { //要求:存储多个数据,可重复,能排序 //可以想到的集合: //1.ArrayList,LinkedList:可重复,不能排序(它的有序只是和添加顺序相同) //2.TreeSet:不可重复,能排序 //这两个都不符合我们的要求 //这里使用ArrayList实现可重复,能排序 //即要想实现排序,元素必须实现了Comparable接口的comapreTo()方法 //或Comparator接口的compare()方法 ArrayList<String> list=new ArrayList<>(); list.add("java"); list.add("ios"); list.add("html"); list.add("html"); list.add("BigData"); list.add("python"); list.add("javascripts"); System.out.println("默认的顺序:"+list);//默认顺序 //升序排序 Collections.sort(list);//String方法已经实现了comapreTo() //所以这里直接用就行了 System.out.println("升序排序:"+list); //按照长短排序 //实现从短到长排序---让元素(String),实现Comparator接口 //创建比较器对象 ComWithLength comWithLength=new ComWithLength(); Collections.sort(list,comWithLength);//第二个参数为List内元素的比较器 System.out.println("从短到长排"+list); //实现从长到短排序 //得到一个从长到短的比较器 Comparator<String> comparator1=Collections.reverseOrder(comWithLength); Collections.sort(list,comparator1); System.out.println("从长到短排序 "+list); //字典顺序反转 Comparator<String> comparator2=Collections.reverseOrder(); Collections.sort(list,comparator2); System.out.println("逆序排序"+list); //现有顺序的反转 Collections.reverse(list); System.out.println("现有顺序反转排序"+list); //求最大值--按照字典排序得到最大值 String max1=Collections.max(list); System.out.println(max1); //求最大值---按照字典排序得到的最大值 String max2=Collections.max(list,comWithLength); System.out.println(max2); } } //创建比较器实现字符串从短到长排序 class ComWithLength implements Comparator<String>{ public int compare(String o1,String o2) { int num=o1.length()-o2.length(); return num; } }

 

转载请注明原文地址: https://www.6miu.com/read-5038843.html

最新回复(0)