java类集(List,Set,Map)

tech2024-11-07  18

java类集(List,Set,Map)

集合和数组:

集合的长度可变,数组长度固定,集合常用来存放一组对象

集合中的常用接口和类及其关系

ArrayList的使用:

@Test //测试ArrayList public void arrayListTest(){ List<String> arlist1 = new ArrayList<>(); List<String> arlist2 = new ArrayList<>(); //测试添加add()方法 arlist1.add("我是第二个元素"); //默认在表尾添加元素 arlist1.add(0,"我是第一个元素"); //在指定索引位置处添加元素 arlist2.add("我是第三个元素"); arlist2.add("我是第四个个元素"); arlist2.add("我是第五个元素"); arlist1.addAll(arlist2); //在arlist1中插入arlist2集合中的内容 System.out.println(arlist1); //测试删除remove()方法 arlist1.remove(0);//删除指定索引处的元素 arlist1.remove("我是第二个元素"); //删除指定String对象(如果是自定义类的对象,该自定义类要重写equals()和hashCode()方法才能实现删除) arlist1.removeAll(arlist2); //删除指定集合中的一组对象(元素) //测试size()并验证删除 int size = arlist1.size(); System.out.println(size); }

LinkedList的使用:

@Test //测试LinkedList public void linkedListTest(){ //链表实现队列 Queue<String> queue = new java.util.LinkedList<>(); //测试添加(入队) queue.add("a"); queue.add("b"); queue.add("c"); System.out.println("依次入队后队列为:"+queue); //测试删除(出队) String poll = queue.poll(); System.out.println("出队的元素为:"+poll+"\t出队后队列为:"+queue); //测试寻找队头元素 String peek = queue.peek(); System.out.println("找到的队头元素为:"+peek); //链表实现栈 Queue<String> stack = new java.util.LinkedList<>(); //测试入栈 ((java.util.LinkedList<String>) stack).push("3"); ((java.util.LinkedList<String>) stack).push("2"); ((java.util.LinkedList<String>) stack).push("1"); System.out.println("依次入栈后栈为:"+stack); //测试出栈 String pop = ((java.util.LinkedList<String>) stack).pop(); System.out.println("出栈的元素为:"+pop); //测试获取栈顶元素 System.out.println("栈顶元素为:"+stack.element()); }

HashSet的使用:

@Test //测试HashSet public void hashSetTest(){ Set<String> hashSet = new java.util.HashSet<>(); //测试添加 hashSet.add("a"); hashSet.add("b"); hashSet.add("b"); hashSet.add("c"); hashSet.add("c"); hashSet.add("c"); hashSet.add("d"); System.out.println("添加元素后hashSet为:"+hashSet+"\t其长度为:"+hashSet.size()); //测试删除 hashSet.remove("a"); //和ArrayList类似,如果该对象为自定义类的对象,该类必须重新equals()和hashCode()方法 }

TreeSet使用(内部元素自动排好序):

package domain; import java.util.Date; public class Person implements Comparable<Person> { private String name; private String sex; private int age; private Date date; public Person(){} public Person(String name, String sex,int age,Date date){ this.name = name; this.sex = sex; this.age = age; this.date = date; } public String toString(){ return "姓名:"+this.name+"; 性别:"+this.sex+"; 年龄:"+this.age+"; 出生日期:"+this.date; } public boolean equals(Object obj){ if(this==obj){ return true; } if(!(obj instanceof Person)){ return false; } Person p = (Person) obj; //向下转型 if((this.name.equals(p.name)&&this.sex.equals(p.sex)&&this.date.equals(p.date))){ return true; } return false; } public int hashCode(){ return this.name.hashCode()*this.sex.hashCode(); } @Override public int compareTo(Person o) { //注意出生日期越大年龄越小(所以o的出生日期大于this,说明this比o大) return o.date.compareTo(this.date); } } import domain.Person; import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Set; public class TreeSet { @Test //测试TreeSet public void TreeSetTest () throws Exception { Set<Person> treeSet = new java.util.TreeSet<>(); //测试添加 treeSet.add(new Person("张三","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01"))); treeSet.add(new Person("李四","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-11"))); treeSet.add(new Person("王五","男",30,new SimpleDateFormat("yyyy-MM-dd").parse("1998-01-02"))); treeSet.add(new Person("赵六","男",26,new SimpleDateFormat("yyyy-MM-dd").parse("2002-01-02"))); treeSet.add(new Person("张三","男",29,new SimpleDateFormat("yyyy-MM-dd").parse("1999-01-02"))); treeSet.add(new Person("张三","女",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01"))); //重复元素 treeSet.add(new Person("张三","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01"))); treeSet.add(new Person("张三","男",28,new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01"))); int i=1; for (Person person : treeSet) { System.out.println("第"+i+"个元素为:"+person); i++; } } }
注意以上代码的输出结果为:

而将TreeSet改为HashSet则结果变为:

说明hashSet是根据类中equals()和hashCode()方法来判断对象元素是否相等,而TreeSet不管是排序还是判断对象元素是否相等都是根据类中compareTo()方法判断的。故在使用TreeSet集合时类中equals和hashCode都是无效的,没有作用。

Map接口:

与前面的List,Set所不同的是Map中是以键值对形式存储元素的,也就是说,map中一次操作的是一对对象

与Set类似,Map中也存在HashMap和TreeMap两个实现类,前者无序,后者根据Key值排序。

具体使用如下

//测试Map public void mapTest(){ java.util.Map<String,String> map = new HashMap<>(); map.put("a","wwww.mldn.cn"); map.put("b","www.zhihu.com"); map.put("c","wwww.runoob.com"); if(map.containsKey("cf")){ System.out.println("搜索的key存在!"); }else { System.out.println("搜索的key不存在"); } //获取全部的key Set<String> keys = map.keySet(); for (String key : keys) { System.out.println(key); } //获取全部的值 Collection<String> values = map.values(); for (String value : values) { System.out.println(value); } }

最后说说前面提到多次的hashCOde的理解,其可以看成一个对象的编码,可以在进行判断对象是否相等是起到一定的过滤作用,首先排除到一些比较明显的因素,比如上面的Person的hashcOde由其name和age属性决定,很明显age或name不等一定不是同一对象,然后在通过equals方法比较一些更深层次的细节,故hashCode相同的对象不一定为同一对象

最新回复(0)