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相同的对象不一定为同一对象