LinkedHashSet
LinkedHashSet类是HashSet类的子类:同时体现了双向链表和哈希表算法
哈希表算法:决定了存储位置.
双向链表算法:用来包装在迭代的时候就是插入时顺序.
LinkedHashSet相对于HashSet来说,性能更低,因为需要保证输出顺序.
问题:既然想保证元素的添加顺序,为何不直接使用List的实现类.
因为:LinkedHashSet类不仅可以保证添加顺序还包装元素不能重复.
package _01_LinkedHashSet;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class Demo1 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("430");
set.add("Burnning");
set.add("kaka");
set.add("820");
System.out.println(set);
//LinkedHashSet 从名字上可以看出存储在hash表里,
//双向链表算法用来包装在迭代的时候就是插入时顺序.
set = new LinkedHashSet();
set.add("one");
set.add("two");
set.add("Three");
System.out.println(set);
}
}
TreeSet
该类底层使用红黑色算法(平衡二叉树).可以对集合中的数据按照一定的规则来排序.
注意:使用TreeSet,一定要包装该集合中的元素必须是同一种数据类型.
Comparable---->compareTo()
package _02_TreeSet;
import java.util.TreeSet;
public class Demo1 {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Student("王",23,70));
ts.add(new Student("赵",23,80));
ts.add(new Student("周",23,90));
System.out.println(ts);
}
}
class Student implements Comparable{
private String name;
private int age;
private int score;
Student(String name,int age,int score){
this.name = name;
this.age = age;
this.score = score;
}
@Override
public int compareTo(Object o) {
Student other = (Student)o;
if(this.score>other.score){
return 1;
}else if(this.score<other.score){
return -1;
}
return 0;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score
+ "]";
}
}
Comparator----->compare(Object o1,Object o2)
package _03_TreeSet;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class Demo2 {
public static void main(String[] args) {
Set ts = new TreeSet(new StudentLength(){
public int compare(Object o1, Object o2) {
Student2 s1 = (Student2)o1;
Student2 s2 = (Student2)o2;
if(s1.getName().length()>s2.getName().length()){
return 1;
}else if(s1.getName().length()<s2.getName().length()){
return -1;
}
return 0;
}
});
Student2 s1 = new Student2("tea");
Student2 s2 = new Student2("mnnnnn");
Student2 s3 = new Student2("good");
Student2 s4 = new Student2("wills");
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
System.out.println(ts);
}
}
class Student2 {
private String name;
Student2(String name){
this.name = name;
}
public String getName(){
return name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
class StudentLength implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Student2 s1 = (Student2)o1;
Student2 s2 = (Student2)o2;
if(s1.getName().length()>s2.getName().length()){
return 1;
}else if(s1.getName().length()<s2.getName().length()){
return -1;
}
return 0;
}
}
Map
Map和Set的关系
Map的常用的实现类:
Hashtable类:在没有集合框架之前,就使用Hashtable来表示映射关系.
现在已经不推荐使用,建议使用HashMap类.
HashMap类:底层使用Hash表算法,和Hashtable有和关系?
通过阅读源代码发现,Hashtable中的每一个方法都是用synchronized修饰,HashMap中没有使用synchronized修饰.
HashMap相对于Hashtable来说,性能较高,但是安全性较低.
和 ArrayList 和 Vector的区别相同.
-----------------------------------------------------------
LinkedHashMap类:保证Map中的key会记录添加顺序.
TreeMap类: 保证Map中的key会按照指定的规则来排序.
Map的使用
package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
Map map = new HashMap();
map.put("zz", 19);
map.put("xx", 18);
map.put("cc", 20);
map.put("vv", 22);
System.out.println(map);
System.out.println("----------------------------------------");
Set t =map.keySet();
System.out.println(t);
System.out.println("----------------------------------------");
Collection l = map.values();
System.out.println(l);
System.out.println("----------------------------------------");
Set s2 = map.entrySet();
System.out.println(s2);
for (Object object : s2) {
Map.Entry entry = (Map.Entry)object;
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
集合工具类
Collections
1先说个Arrays
package collections;
import java.util.Arrays;
import java.util.List;
public class ArraysDemo {
public static void main(String[] args) {
String[] name = {"一","二","三"};
List list = Arrays.asList(name);//字符串转换为List集合
for (Object object : list) {
System.out.println(object);
}
//list.add("四"); 转换的不能删除和添加
//List转换为数组
Object[] obj = list.toArray();
}
}
Collections讲的不多,这里就不写了.
泛型
? 通配符