java类集(List,Set,Map)
集合和数组:
集合的长度可变,数组长度固定,集合常用来存放一组对象
集合中的常用接口和类及其关系
ArrayList的使用:
@Test
public void arrayListTest(){
List
<String> arlist1
= new ArrayList<>();
List
<String> arlist2
= new ArrayList<>();
arlist1
.add("我是第二个元素");
arlist1
.add(0,"我是第一个元素");
arlist2
.add("我是第三个元素");
arlist2
.add("我是第四个个元素");
arlist2
.add("我是第五个元素");
arlist1
.addAll(arlist2
);
System
.out
.println(arlist1
);
arlist1
.remove(0);
arlist1
.remove("我是第二个元素");
arlist1
.removeAll(arlist2
);
int size
= arlist1
.size();
System
.out
.println(size
);
}
LinkedList的使用:
@Test
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
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");
}
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
) {
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
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值排序。
具体使用如下
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不存在");
}
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相同的对象不一定为同一对象