Set和List都是Collection接口下的,实现了这个接口,这个接口中的功能有add()、remove()、isEmpty()、iterator()、size()等。
1.其中List下面又分为:ArrayList和LinkedList,就像它的名字一般一个内部以数组的形式实现,另一个以链表的形式实现,分别在各自的领域有着应用。
2. 其中Set又分为TreeSet和HushSet,TreeSet是排好序的。
3. 自己去定义的时候在最右边一定是最底层的数据类型,不能是Set或者是List,那样你会需要实现他的所有接口。
4. 注意,next()返回的是Object,而且集合中的元素只能是类不能是基本数据类型,这与C++不同!!!
1.List(类似java数组)
List也可以用Iterator进行遍历,但是List自己增加了get()、set()函数,使得遍历和修改都更加方便。
public class Main {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it=list. iterator();
list.set(1,"aaaa");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println(list.get(2));
}
}
2.TreeSet(无重复值,且自动排序)
(1)基础语法:
1. 内部数据是有序的,如果Set中的数据是基本数据类型或者是java自带的String、Long等类型的就自带比较的内部函数,也就是自带规则。但是如果是你自己定义的类,那就需要你实现接口Comparable中的comParaTo函数,自己在函数内部制定一个比较的规则。
2. 但是遍历只能用Iterator,hasNext(),next()进行,没有函数set啥的!!!。
package test;
import java.util.Iterator;
import java.util.TreeSet;
import java.util.*;
public class Main {
public static void main(String[] args) {
StuTest stu1=new StuTest(1,"Sean");
StuTest stu2=new StuTest(2,"Xiao");
StuTest stu3=new StuTest(3,"Zhan");
StuTest stu4=new StuTest(4,"Yan");
TreeSet<StuTest> set=new TreeSet<>();
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
Iterator<StuTest> it=set.iterator();
while(it.hasNext()){
StuTest temp=(StuTest)it.next();
System.out.println(temp.getId()+" "+temp.getName());
}
Set<String> stuName=new TreeSet<>();
stuName.add("a");
stuName.add("c");
stuName.add("e");
stuName.add("d");
Iterator<String> iter=stuName.iterator();
while (iter.hasNext()){
System.out.println((String) iter.next());
}
}
}
class StuTest implements Comparable<Object>{
private int id;
private String name;
@Override
public int compareTo(Object o) { //Set内元素是自定义类型的的话,需要自己去设定排序的条件或者称为规则。
StuTest temp=(StuTest)o;
int result=id>temp.id? 1:(id==temp.id?0:-1);
return result;
}
public StuTest(int id, String name){
this.id=id;
this.name=name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
(2)新添加的函数,Set中没有,TreeSet中才有的。
subSet()、headSet()、tailSet()函数,但是返回的都是Set类型的,而不是TreeSet类型的。
Set<String> subSet1=stuName.subSet("a","d");
iter=subSet1.iterator();
System.out.println();
while(iter.hasNext()){
System.out.print((String) iter.next()+" ");
}
System.out.println();
Set<String> subSet2=stuName.headSet("d");
iter=subSet2.iterator();
while(iter.hasNext()){
System.out.print((String) iter.next()+" ");
}
System.out.println();
Set<String>subSet3=stuName.tailSet("c");
iter=subSet3.iterator();
while(iter.hasNext()){
System.out.print((String) iter.next()+" ");
}
3.Map
添加了put()、containsKey()、containsValue()、get()、keySet()、values()函数。
发现HushMap中的输出顺序与建立时数据的输入顺序不同,是因为HashMap散列图、Hashtable散列表是按“有利于随机查找的散列(hash)的顺序”。并非按输入顺序。遍历时只能全部输出,而没有顺序。甚至可以rehash()重新散列,来获得更利于随机存取的内部顺序。总之,遍历HashMap时不要求顺序输出,即与顺序无关。
public class Main {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("71","Xia");
map.put("13","Li");
map.put("02","Yan");
Set<String>set=map.keySet();
Iterator<String> it=set.iterator();
while(it.hasNext()){
String temp=(String) it.next();
System.out.print(temp+" ");
System.out.println(map.get(temp));
}
}
}
改成TreeMap后:就是有序的了,按照Key值进行排序。
但是一般建议使用HashMap,因为效率高,遍历使用Iterator进行遍历