浅谈集合框架二 List、Set常用方法
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。
之前有介绍集合框架的体系概念(http://www.cnblogs.com/yjboke/p/8761195.html),本篇介绍一下常用方法及常用工具类。
Collection→List→ArrayList:
增(add)、删(remove)、改(set)、查(get)。
List<String> alist = new ArrayList<String>(); alist.add("abc1"); //.add 增加 alist.add("abc2"); alist.add("abc3"); alist.add("abc4"); System.out.println(alist.get(2)); //.get 查询 System.out.println(alist.remove(1));//.remove 删除元素,并输出删除元素 alist.set(1,"a"); //.set 修改 System.out.println(alist);
Collection→List→LinkedList:
除了以上介绍的增删改查方法外还有LinkedList的特有方法。
alist.addFirst("abc1"); //.addFirst在集合前添加 alist.addLast("abc4"); //.addLast在集合后方添加 System.out.println(alist); //输出结果为:[abc3, abc2, abc1, abc4] System.out.println(alist.getFirst()); //获得首个元素 System.out.println(alist.getLast()); //获得最后的元素 System.out.println(alist.removeFirst());//删除首个元素,并输出元素值 System.out.println(alist.removeLast()); //删除最后的元素,并输出元素值
Collection→Set→HashSet:
添加:add(添加元素);addAll(添加集合中所有元素)
删除:remove(删除元素);
查询集合长度:size
查询是否存在:contains
HashSet<String> set1 = new HashSet<String>(); //定义Set集合set1 HashSet<String> set2 = new HashSet<String>(); //定义Set集合set2 set1.add("abc1"); //add:将set集合中添加元素 set1.add("abc2"); set1.add("abc3"); set1.add("abc3"); //添加重复元素不会添加进去, set2.addAll(set1); //addAll:将集合set1添加到set2中 System.out.println(set1); //输出内容为:[abc1, abc3, abc2] 无序 System.out.println(set2); //输出内容为:[abc1, abc3, abc2] 和set1相同 set1.remove("abc2"); //remove:删除元素 System.out.println(set1); //输出内容为:[abc1, abc3]
System.out.println(set1.size()); //输出内容为:2 set1的长度
System.out.println(set1.contains("abc1")); //输出内容为:true
使用HashSet存储自定义对象,包含重写hashCode和equals的方法:
首先定义一个手机类(Phone),包含价格(price)和名称(name);
1 class Phone{ 2 3 private int price; 4 private String name; 5 6 Phone(int price,String name) { 7 super(); 8 this.name = name; 9 this.price = price; 10 } 11 12 public int getPrice(){ 13 return price; 14 } 15 public void setPrice(int price){ 16 this.price = price; 17 } 18 19 public String getName(){ 20 return name; 21 } 22 public void setName(String name){ 23 this.name = name; 24 } 25 26 public String toString(){ 27 return "Phone:price = "+price + ",name = " + name; //输出格式 28 } 29 //复写hashCode方法 30 public int hashCode(){ 31 final int prime = 31; 32 int result = 1; 33 result = prime * result + price; 34 result = prime * result + ((name == null) ? 0 : name.hashCode()); 35 return result; 36 } 37 //复写equals方法 38 public boolean equals(Object obj){ 39 40 if(!(obj instanceof Phone)){ 41 throw new ClassCastException("类型不匹配"); //也可写为:return false; 42 } 43 Phone p = (Phone)obj; 44 System.out.println(this.name + " and " + p.name + "重复了"); //如果重复数据则打印输出 45 return this.name.equals(p.name) && this.price==p.price; 46 } 47 }
创建一个HashSet集合,并添加数据并输出,添加重复数据进行验证:
public static void main(String[] args) { HashSet<Phone> hs = new HashSet<Phone>(); //定义HashSet集合 hs.add(new Phone(4888, "xiaomi")); hs.add(new Phone(8388, "iphoneX")); hs.add(new Phone(8388, "iphoneX")); hs.add(new Phone(3288, "vivo")); //重复数据 //迭代器输出 for(Iterator<Phone> it = hs.iterator();it.hasNext();){ System.out.println(it.next()); } }
输出结果为:
iphoneX and iphoneX重复了
Phone:price = 4888,name = xiaomi
Phone:price = 3288,name = vivo
Phone:price = 8388,name = iphoneX
--------------------------------------------------------------------------------------------------------------
Collection→Set→TreeSet:
操作元素方式与HashSet相同,但TreeSet是有序的,现介绍TreeSet如何存储自定义对象。
现封装一个Person类,其中有年龄和姓名两种属性,实现Comparable接口使元素具备比较性,并创建一个比较器。
1 class Person implements Comparable{ //注:Comparable接口可让Person类具备比较性 2 3 private int age; 4 private String name; 5 6 Person(int age,String name) { 7 super(); 8 this.name = name; 9 this.age = age; 10 } 11 12 public int getAge(){ 13 return age; 14 } 15 public void setAge(int age){ 16 this.age = age; 17 } 18 19 public String getName(){ 20 return name; 21 } 22 public void setName(String name){ 23 this.name = name; 24 } 25 26 public String toString(){ 27 return "年龄为 : "+age + ",姓名为: " + name; //输出格式 28 } 29 //比较器 30 public int compareTo(Object obj){ 31 if(!(obj instanceof Person)){ 32 throw new ClassCastException("不是人"); //可用:return false;代替 33 } 34 Person p = (Person)obj; 35 if(this.age > p.age){ 36 return 1; //比较大小进行排序 37 } 38 if (this.age == p.age) { 39 return this.name.compareTo(p.name); //如果年龄相同则比较姓名,返回1、0、-1 40 } 41 return -1; 42 }
43 }
创建一个TreeSet集合,并添加数据进行验证。
public static void main(String[] args) { TreeSet<Person> hs = new TreeSet<Person>(); //定义HashSet集合 hs.add(new Person(4888, "xiaomi")); hs.add(new Person(8388, "iphoneX")); hs.add(new Person(8388, "iphoneX")); //重复数据 hs.add(new Person(3288, "vivo")); //迭代器输出 for(Iterator<Person> it = hs.iterator();it.hasNext();){ Person per = (Person)it.next(); System.out.println(per.getAge() + "....." + per.getName() ); } }
输出结果为:
3288.....vivo 4888.....xiaomi 8388.....iphoneX
另:在不改变当前代码的前提下要求按照姓名排序。可定义一个类,实现Comparator接口,覆盖compare方法。
class MyCompars implements Comparator{ public int compare(Object o1,Object o2){ Person s1 = (Person) o1; Person s2 = (Person) o2; int num = s1.getName().compareTo(s2.getName()); //当名称相同时,比较年龄大小进行排序。 if(num == 0){ return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); //与下方注释的方法意义相同。 /*if (s1.getAge() > s2.getAge()) { num = 1; } if(s1.getAge() == s2.getAge()){ num = 0; } return -1;*/ } return num; } }
然后将其传入到集合中:
public static void main(String[] args) { TreeSet<Person> hs = new TreeSet<Person>(new MyCompars()); //定义HashSet集合 hs.add(new Person(4888, "xiaomi")); hs.add(new Person(8388, "iphoneX")); hs.add(new Person(8188, "iphoneX")); //重复数据 hs.add(new Person(3288, "vivo")); //迭代器输出 for(Iterator<Person> it = hs.iterator();it.hasNext();){ Person per = (Person)it.next(); System.out.println(per.getAge() + "....." + per.getName() ); } }
输出结果为:
8188.....iphoneX 8388.....iphoneX 3288.....vivo 4888.....xiaomi
总结:当元素自身不具备比较性或者所具备的比较性不是自己所需要的,就可以让容器自身具备比较性。当两种排序都存在时,以比较器为主。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步