学习集合的时候感觉乱七八糟的,今天趁着复习的时间好好总结一番,如有不如意的地方请指出,鄙人将感激不尽。
首先可以根据集合框架图来理顺这章的内容。
上图只是为了很好地说明问题,并不是完整的Collection集合图,如EnumSet 、AbstractQueue等都没在图中表示出来。
1.set集
在java语言中,java.util.set与数学上的set集合的意义一致,都是不允许有重复的元素出现。set接口只有从Collection继承下来的方法,并没有添加自己的新方法。注意这儿并不代表它的实现类没有添加新的方法。
A. 散列集 HashSet
HashSet是无序集,它的顺序是不定的。
当向其中添加元素时,先调用元素对象的hashCode()方法计算它的散列码,若散列码指向的位置为空,则可以加进去,反之则需要调用equals()方法判断两个对象是否相同,若相同,则不允许加入,反之能加入进去。
public class Collection {
public static void main(String[] args)
{
String str[]={"we","are","a","student","hello","a"};
HashSet<String> set=new HashSet<>();
for(String s:str)//给set添加元素
{
set.add(s) ;
}
System.out.println("第一次输出");
for(Iterator<String> it=set.iterator();it.hasNext();)//迭代器
{
System.out.println(it.next());
}
//添加一个相同的字符串的情形
String ss="a";
set.add(ss);
System.out.println("第二次输出");
for(Iterator<String> it=set.iterator();it.hasNext();)//迭代器
{
System.out.println(it.next());
}
}
}
输出的结果:
第一次输出
hello
are
student
a
we
第二次输出
hello
are
student
a
we
B.TreeSet
TreeSet属于有序集,默认情况下是从小到大的顺序排列。同时也允许我们将自定义的Comparator对象传递给TreeSet构造器告诉TreeSet使用所提供的这种方式排序。
代码说明:
public class Collection {
public static void main(String[] args)
{
TreeSet<Person> sorttreeset=new TreeSet<>(new Comparator<Person>()
{
public int compare(Person a,Person b)
{
return a.getAge()-b.getAge();
}
});
sorttreeset.add(new Person("张山",21));
sorttreeset.add(new Person("丽丽",20));
sorttreeset.add(new Person("海尒",17));
sorttreeset.add(new Person("杰克",24));
sorttreeset.add(new Person("魔姬",21));
//按自己定义的方式排序
System.out.println("输出sorttreeset");
for(Iterator<Person>it=sorttreeset.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
}
运行结果:
输出sorttreeset
Person [name=海尒, age=17]
Person [name=丽丽, age=20]
Person [name=张山, age=21]
Person [name=杰克, age=24]
由运行结果可以看出,出现重复元素时,会把多余的元素删除;
若存储的是自定义的类时,一定要定义它的比较器。否则会报错。
C.LinkedHashSet
数据结构是一种双链表,且是有序集,但是它的有序与TreeSet的有序稍微有点差别,它的有序是指按插入的顺序排列。LinkedHashSet中的方法只是继承了HashSet和Set中的方法。
代码:
public class Collection {
public static void main(String[] args)
{
LinkedHashSet<String> linkedhashset=new LinkedHashSet<>();
String str[]={"hello","welcome","to","nanchang"};
for(String s:str)
{
linkedhashset.add(s);
}
for(Iterator<String>it=linkedhashset.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
运行结果:
hello
welcome
to
nanchang
2.List接口
java.util.List<E>是列表,它表示的是有序列表(插入顺序)。允许包含重复的元素,也允许包含null元素。除了继承Collection的方法外,还增添了自己特有的方法,常用的有subList(),ListIterator<E> listIterator(),indexOf(Object o)等。
A.ArrayList
ArrayList是属于动态数组,它的存储大小不固定,可以储存null元素。
代码:
public class Collection {
public static void main(String[] args)
{
ArrayList<String> arraylist=new ArrayList<>();
String str1[]={"hello","welcome","to","nanchang","nanchang",null};
for(String s:str1)
{
arraylist.add(s);
}
for(Iterator<String>it= arraylist.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
}
运行结果:
hello
welcome
to
nanchang
nanchang
null
B.LinkedList
LinkedList的数据结构是双向链表,它与ArrayList的优缺点可以很快就知道。操作与ArrayList类似。只不过是有属于自己的一些方法而已。如previous()。
。。。。队列后续补充