java中map子类的学习

HashMap集合本身基于哈希表
  它可以保证键的唯一性(Map都是针对键有效)
  HashMap<String,String> 
举例:  
public class Demo1 {
public static void main(String[] args) {
	HashMap<String,String> map=new HashMap<String,String>();
	map.put("1", "one");
	map.put("2", "two");
	map.put("3", "three");
	map.put("4", "fif");
	map.put("1", "two");
	Set<String> set = map.keySet();
	for(String key:set) {
		String value = map.get(key);
		System.out.println(key+"---"+value);
	}
}
}

注释:主键相同的话,会替代掉的一个之间以及他们的值。

HashMap<Integer,String>
  Integer:年龄

  String:姓名

举例

public class Demo2 {
	public static void main(String[] args) {
		HashMap<Integer,String> map=new HashMap<Integer,String>();
		map.put(25,"曾轶可");
		map.put(20,"毛不易");
		map.put(23,"李荣浩");
		map.put(21,"张嘉译");
		Set<Integer> keySet = map.keySet();
		for(Integer key:keySet) {
			String value = map.get(key);
		System.out.println(key+"---"+value);
		}
	}	
}
HashMap<String,Student> 
  String:学号

  Student:学号对应一个学生:有姓名和年龄

举例:

public class Demo3 {
public static void main(String[] args) {
	Student s1=new Student("曾轶可",28);
	Student s2=new Student("李荣浩",30);
	Student s3=new Student("毛不易",25);
	Student s4=new Student("张嘉译",40);
	HashMap<String,Student> map=new HashMap<String,Student>();
	map.put("001", s1);
	map.put("002", s2);
	map.put("003", s3);
	map.put("004", s4);
	Set<String> k = map.keySet();
	for(String key:k) {
		Student value = map.get(key);
		System.out.println(key+"---"+value);
	}
	}
}
HashMap<Student,String>
  键:是一种自定义类型
  Student:学生:年龄和姓名
  String:唱歌类型 
  如果对象的成员变量值一样,认为同一个人.
  HashMap底层哈希表

  哈希表:依赖于两个方法  hashCode() ,equals()方法

举例:

public class Demo4 {
public static void main(String[] args) {
	HashMap<Student,String> map=new HashMap<Student,String>();
	Student s1=new Student("曾轶可",28);
	Student s2=new Student("李荣浩",30);
	Student s3=new Student("曾轶可",28);
	Student s4=new Student("曾轶可",18);
	map.put(s1, "随意");
	map.put(s2, "豪放");
	map.put(s3, "随意");
	map.put(s4, "呆萌");
	Set<Student> k = map.keySet();
	for(Student key:k) {
		String value = map.get(key);
		System.out.println(key+"---"+value);
	}
}
}

注释:主键相同的话,是不会被代替的。

LinkedHashMap<K,V> :
  是Map接口基于哈希表和链接列表实现的
  哈希表保证键的唯一性

  链接列表保证元素有序性(存储和取出一致)

public class Demo1 {
public static void main(String[] args) {
	LinkedHashMap<String,String> map=new LinkedHashMap<String,String>();
	map.put("1", "hello");
	map.put("2", "world");
	map.put("3", "retain");
	map.put("1", "hello");
	Set<String> k = map.keySet();
	for(String key:k) {
		String value = map.get(key);
	    System.out.println(key+"---"+value);
	}
}
}

TreeMap基于红黑树结构的Map接口的实现

  TreeMap<String,String>

举例:

public class Demo1 {
public static void main(String[] args) {
	TreeMap<String,String> map=new TreeMap<String,String>();
	map.put("hello", "nihao");
	map.put("world", "shijie");
	map.put("retain", "jiaoji");
	map.put("hello", "nihao");
	Set<String> k = map.keySet();
	for(String key:k) {
		String value = map.get(key);
		System.out.println(key+"---"+value);
	}
}
}
TreeMap存储自定义类型
  TreeMap<Student,String>

  主要条件:年龄从小到大

举例:

public class Demo2 {
public static void main(String[] args) {
	TreeMap<Student,String> map=new TreeMap<Student,String>(new Comparator<Student>() {

		@Override
		public int compare(Student s1, Student s2) {
	    int num=s1.getAge()-s2.getAge();
		int num2=num==0?s1.getName().compareTo(s2.getName()):num;	
	    return num2;
		}
	});
	Student s1=new Student("曾轶可",28);
	Student s2=new Student("李荣浩",30);
	Student s3=new Student("毛不易",25);
	Student s4=new Student("张嘉译",40);
	Student s5=new Student("李荣浩",29);
	Student s6=new Student("李荣浩",30);
	map.put(s1, "随性");
	map.put(s2, "豪放");
	map.put(s3, "伤感");
	map.put(s4, "帅气");
	map.put(s5, "帅气");
	map.put(s6, "帅气");
Set<Student> k = map.keySet();
for(Student key:k) {
	String value = map.get(key);
	System.out.println(key+"--"+value);
}
}
}

注释:如果学生对象完全一样则会看成一个人,所以会被代替。

Map子实现类的应用

HashMap集合嵌套HashMap集合

  西部开源
  jc(基础班)
曾轶可 28
   李荣浩 30
   jy(就业班)
   毛不易 29

   张嘉译 30

举例:

public class Demo2 {
public static void main(String[] args) {
	HashMap<String,HashMap<String,Integer>> map=new HashMap<String,HashMap<String,Integer>>();
    HashMap<String,Integer> map1=new HashMap<String,Integer>();
    map1.put("曾轶可", 28);
    map1.put("李荣浩", 30);
    map.put("jc(基础班)", map1);
    HashMap<String,Integer> map2=new HashMap<String,Integer>();
    map2.put("毛不易",29);
    map2.put("张嘉译",30);
    map.put("jy(就业班)",map2);
    Set<String> k1 = map.keySet();
    for(String key:k1) { 	
    	System.out.println(key);
    	HashMap<String, Integer> value = map.get(key);
    	Set<String> k2 = value.keySet();
    	for(String key1:k2) {
    		Integer value1 = value.get(key1);
    		System.out.println("\t"+key1+"---"+value1);
    	}
    }
}
}
假设HashMap集合的元素是ArrayList。有3个。
 每一个ArrayList集合的值是字符串。
 元素我已经完成,请遍历。
 结果:
  三国演义
  吕布
  周瑜
  笑傲江湖
  令狐冲
  林平之
  神雕侠侣
  郭靖

  杨过 

举例:

public class Demo3 {
public static void main(String[] args) {
	HashMap<String,ArrayList<String>> map=new HashMap<String,ArrayList<String>>();
	ArrayList<String> arr1=new ArrayList<String>();
	arr1.add("吕布");
	arr1.add("周瑜");
	map.put("三国演义", arr1);
	ArrayList<String> arr2=new ArrayList<String>();
	arr2.add("令狐冲");
	arr2.add("林平之");
	map.put("笑傲江湖", arr2);
	ArrayList<String> arr3=new ArrayList<String>();
	arr3.add("郭靖");
	arr3.add("杨过 ");
	map.put("神雕侠侣", arr3);
	Set<String> k = map.keySet();
	for(String key:k) {
		System.out.println(key);
		ArrayList<String> value = map.get(key);
		
		for(String s:value) {
			System.out.println("\t"+s);
		}
	}
}
}
面试题:
  HashMap集合和Hashtable的区别?
  共同点:都是map接口的实现类,都是基于哈希表的实现类
  HashMap集合线程不安全的类,不同步,执行效率高(允许键和值是null的)
  Hashtable集合线程安全的类,同步,执行效率低(不允许有null键和null值) 
 线程安全的类:
  StringBuffer :字符串缓冲区
  Vector :List集合

  Hashtable :Map集合的

需求:
  字符串:比如: aaaaabbbbcccddddee   ,最终控制台要出现的结果:a(5)b(4)c(3)d(3)e(2)
 思路:
  1)改进:键盘录入一个字符串
  2)创建一个HashMap集合key:Character,Value:Integer
  3)将录入的字符串转换成字符数组
  4)遍历可以获取每一个字符 
 * 5)将元素添加到对应的HashMap集合中
  使用的put(key,value): 通过判断值是否null ,如果是null表示第一次存储
  集合对象.put(ch,1) ;
  否则,不是null
  Integer那个值++;
  集合对象.put(ch,变量Integer值)  ;

  6)遍历HashMap集合即可

public class Demo5 {
public static void main(String[] args) {
	Scanner sc=new Scanner (System.in);
	HashMap<Character,Integer> map=new HashMap<Character,Integer>();
	System.out.println("请输入一个字符串:");
	String s=sc.nextLine();
	char[] arr = s.toCharArray();
	for(char ch:arr) {
		Integer i = map.get(ch);		
		if(i==null) {
			map.put(ch, 1);
		}else {
			i++;
			map.put(ch, i);
		}
	}
		StringBuffer sb=new StringBuffer();
		Set<Character> k = map.keySet();
		for(Character key:k) {
			Integer value = map.get(key);
		    sb.append(key).append("(").append(value).append(")");
		}
		String ss = sb.toString();
		System.out.println(ss);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值