寒假Day56:JAVA集合-Set+TreeSet+List+Map
java集合简单介绍
存放在java.util包中,集合可以存放不同的数据类型
java集合分为Set、List、Map
下面所说的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。
Set:无序、不可重复
List:有序、可重复
Map:具有映射关系
Set
遍历set集合中的元素:
方法一:
//迭代器遍历集合 Iterator it = set.iterator(); //hasNext()判断迭代器中是否还有下一个元素 有ture //next() 获取下一个元素 while (it.hasNext()) { System.out.println(it.next()); }
注意:使用迭代器的时候,不能仅仅只导入HashSet和Set,必须要导入util包,否则报错。
import java.util.*;
报错如下:
方法二:
//遍历二:for each迭代集合 //set中的每一个元素赋值给obj for (Object obj : set) { System.out.println(obj); }
Set操作完整代码:
import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.*; public class A { public static void main(String[] args) { Set set = new HashSet(); //等价于Set<Object> set =new HashSet<Object>(); set.add(1); set.add("a");//set里可以存不同类型的对象 //如果只想存同一类型,那么引入泛型 //则写成Set<String> set=new HashSet<String>(); set.remove(1); // System.out.println(set); System.out.println(set.contains("a")); set.clear();//[] set.add(1); set.add(2); set.add(null);//可以存取null,会被放在set集合的第一个位置,因为是按照hashcode值排列的 set.size();//获取集合元素个数 //遍历一: //迭代器遍历集合 Iterator it = set.iterator(); //hasNext()判断迭代器中是否还有下一个元素 有ture //next() 获取下一个元素 while (it.hasNext()) { System.out.println(it.next()); } //遍历二:for each迭代集合 //set中的每一个元素赋值给obj for (Object obj : set) { System.out.println(obj); } //两个对象相等:equals相等、hasCode返回值相等 } }
TreeSet
支出两种排序方法:自然排序和定制排序。默认自然排序。
基本操作+自然排序:
import java.util.Set; import java.util.TreeSet; public class A{ public static void main(String[] args){ Set<Integer> set=new TreeSet<Integer>(); set.add(5); set.add(2); set.add(4); set.add(3); System.out.println(set);//TreeSet的自然排序 //output:[2, 3, 4, 5] //其他一些操作和set一样 //Interator<Integer> it=.... //for(In teger i:set){ //} } }
自定义排序:
TreeSet如何实现自定义排序?
需要提供一个Comparator接口的实现类对象,
然后新建一个类Person,把Person对象存到TreeSet中且按年龄排序,
再实现一个接口,
接着写两个构造,一个无参数,一个有参数。
import java.sql.PseudoColumnUsage; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; public class A { public static void main(String[] args) { Set<Person> set = new TreeSet<Person>(new Person()); Person p1 = new Person("Bob", 30); Person p2 = new Person("Alice", 10); Person p3 = new Person("Cindy", 20); set.add(p1); set.add(p2); set.add(p3); for (Person p : set) { System.out.println(p.name + "-->" + p.age); } } } class Person implements Comparator<Person> { int age; String name; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; }//使对象实例化 @Override public int compare(Person o1, Person o2) {//重写了compare这个方法 if (o1.age > o2.age) { return 1; } else if (o1.age < o2.age) { return -1; } else { return 0; } } }
输出:
注意:
如果把他们的年龄全部改成一样的,输出就只有第一个人的信息。
List
List是一个接口,所以List集合要有一个实现类,主要的实现类就是ArrayList。
基本操作:
import java.sql.Array; import java.util.ArrayList; import java.util.*; public class A { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("11"); list.add("22"); list.add("33"); //list.get(2);//访问list下表为2的元素 //list.add(1,"a");//在下标为1的位置插入a,其他元素后移 List<String> list2 = new ArrayList<String>(); list2.add("insert"); list.addAll(1, list2);//在list中插入list2 System.out.println(list);//output:[11, insert, 22, 33] // list.indexOf("11");//获取该元素在list中出现的第一次的下表 // list.lastIndexOf("11"); //list.remove(2);//remove该下标对应的数据 //list(1,"ff");//把1下标的位置元素改成ff // List<String> sublist=list.subList(2,4);//截取下标2-3元素(左开右闭) } }
Map
在java中,Map是一个接口,自然就需要一个实现类,就是HashMap类。
基本操作:
import java.util.HashMap; import java.util.*; import java.util.Map; public class A { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); //key-value map.put("b", 9);//和前面两个不一样,不是add map.put("a", 3); map.put("c", 7); System.out.println(map);//{a=3, b=9, c=7}按照key排序 System.out.println(map.get("b"));//9 根据key取出值 map.remove("c");//根据key移除键值对 System.out.println(map.containsKey("a"));//判断是否存在key /true System.out.println(map.containsValue(10));//judge value /false Set<String> keys = map.keySet();//获取所有key map.values();//获取所以value //遍历一:集合,map.keySet() for (String key : keys) { System.out.println("key:" + key + " " + "value:" + map.get(key)); } // //遍历二:map.entrySet();效率更高 // Set<Entry<String, Integer>> entrys = map.entrySet(); // for (Entry<String, Integer> en : entrys) { // System.out.println("key:" + en.getKey() + " " + "value:" + en.getValue()); // }//这个不知道为什么我这边会报错?? } }
待解决:
上面的map中基本操作中不知道为什么Entry会报错。