day17 集合框架 LinkedHashSet TreeSet Map 泛型

本文深入探讨了Java集合框架中的重要类如LinkedHashSet、TreeSet、HashMap等,详细讲解了它们的特点、应用场景及内部实现原理,并提供了示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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讲的不多,这里就不写了.

泛型

? 通配符




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值