先看看专业说法
本人理解:
map集合中存放的都是一组组映射关系
(可以理解为结婚证,一夫一妻制 key对应着value)
代码解释:
package com.wxm.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 三个map集合中特别的方法
* 1.put
* 新增的作用
* 覆盖/修改(当容器中已经存在key,再次存放,那么会覆盖原来的--值的唯一性 理解记忆)
* 调用此方法可以获取原来key对于的值
* 案列:
* 主播刷平台
*
*
* 2.entryset
*
* 3.keyset
* 这两个方法是map集合中特有的遍历方法
* HashMap是无序,集合底层是set集合做的
*
* HashMap 数据结构 哈希表
* TreeMap 数据结构 二叉树
* 能够进行自然排序
*
* map集合是不继承collection的
* 就意味着它不能具备迭代器 方法
* @author wxm
*
*/
public class MapDemo {
public static void main(String[] args) {
Map map=new HashMap<>();
map.put("zs", 12);
map.put("wanting", 18);
map.put("xiaopei", 22);
map.put("yigui", 16);
map.put("xiaomei", 19);
map.put("xiaomei", 59);
Object old=map.put("xiaomei", 10);
System.out.println("可以查看到原来的值"+old);
map.put("yuanyuan", 18);
//System.out.println(map);
/**
* HashMap的两种遍历方式:
*
* 区别:
*
*/
//1.通过Map.entrySet遍历key和value:推荐,尤其是容量大时
Set> entrySet=map.entrySet();
for (Entry
在JavaSE中,对Map的实现主要包括: HashMap, TreeMap, HashTable 和 LinkedHashMap
****这次案列讲解HashMap 与TreeMap
1.HashMap
package com.wxm.map;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeMap;
/**HashMap
* 应用一:
* 1、将学生作为键,地址作为值进行存储,名字年龄相同则被认定为一个人,最后输出
* 思路:
* a、封装学生类
* b、判重(hashCode/equals)
* c、打印
* 2、最后按年龄进行排序
* a、需要让学生类自身具备比较性,实现Comparable接口
* 3、需求改变、按姓名进行排序
* 改变的代码是不可取的,我们需要新增个比较器来完成需求
* 实现java.util.comparator
*
* @author wxm
*
*/
public class HashMapDemo {
public static void main(String[] args) {
// HashMap map=new HashMap<>();
TreeMap map=new TreeMap<>(new StuNameComp());
map.put(new Student("zs", 19), "shanghai");
map.put(new Student("xiaopei", 19), "beijing");
map.put(new Student("xiapmei", 13), "shanghai");
map.put(new Student("lisi", 35), "tianjin");
map.put(new Student("lisi", 35), "tianjin");
Set keySet=map.keySet();
for (Object key : keySet) {
System.out.println(key);
}
}
}
class StuNameComp implements Comparator{
@Override
public int compare(Student o1, Student o2) {
int num=o1.getName().compareTo(o2.getName());
if(num==0) {
return o1.getAge()-o2.getAge();
}
return num;
}
}
class Student implements Comparable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {//方便查看
return "Student [name=" + name + ", age=" + age + "]";
}
public Student() {
super();
}
@Override
public int hashCode() {
return this.name.hashCode()+this.age;
}
@Override
public boolean equals(Object obj) {
Student stu=(Student) obj;
return this.name.equals(stu.name)&&this.age==stu.age;
}
/*
*重写比较器
*/
@Override
public int compareTo(Student o) {
int num=this.age-o.age;
if(num==0) {//当年龄相等时
this.name.compareTo(o.name);//进行名字比较
}
return num;
}
}
2.TreeMap
package com.wxm.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
/**
* 统计字符串字符出现的次数
* sadfafjdfdfijjfmfldm
* @author wxm
*a(?),b(?)...z(?)
*
*思路:
*1.我们需要把字符a-z当作键key,把次数作为值value,
*也就是说我们需要创建一个map集合来做这些事情
*2.需要将待处理的字符串转成字符数组以便于获取map集合的key
*3.如果将字符(a)第一出现 的时候,就给a对应key映射值value赋值为1
* 如果说该字符在次出现,那么就是value+1
*4.打印出a-z说明要对key排序
*
*
*
*
* 面试题 String,StringBuffer,StringBuilder三者的区别?
* String a=new String("abc");
* String b="abc";
* a+="de";
* StringBuffer sb1=new StringBuffer("abc");
* StringBuilder sb2=new StringBuilder("abc");
* sb1.append("de");
* sb2.append("de");
*
* StringBuffer与StringBuilder的区别?
* StringBuffer 同步 安全
* StringBuilder 异步 不安全
*/
public class TreeMapDemo {
public static void main(String[] args) {
String str="sadfafjdfdfijjfmfldm";
// Mapmap=new HashMap<>();
//最后进行排序
Mapmap=new TreeMap<>();
char [] charArray=str.toCharArray();
for (char c : charArray) {
Integer obj=map.get(c);
if(obj==null) {
//之前没有出现过,第一次出现
map.put(c, 1);
}else {
//之前这个字符已经出现过
map.put(c, ++obj);
}
}
StringBuilder sb=new StringBuilder();
Set> entrySet=map.entrySet();
for (Entry entry : entrySet) {
sb.append(entry.getKey()+"("+entry.getValue()+")");
}
System.out.println(sb);
}
}
API中的方法
sort(List list) ;
sort(List list, Comparator super T> c) ;
二分搜索法搜索指定元素的位置
如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) - 1))
binarySearch(List extends Comparable super T>> list, T key) ;
binarySearch(List extends T> list, T key, Comparator super T> c) ;
替换集合中的所有元素
fill(List super T> list, T obj) ;
替换集合中的某一个元素;
replaceAll(List list, T oldVal, T newVal) ;
反转元素顺序
reverse(List> list);
强行逆转了排序(Comparable、Comparator)规则
reverseOrder() ;
reverseOrder(Comparator cmp) ;
指定置换与随机置换(扑克牌)
swap(List> list, int i, int j);
交换集合中指定元素索引的位置
shuffle(List> list) ;
将有规则的一组数据打乱成无规则数据。
我的代码理解
package com.wxm.map;
import java.util.Arrays;
/**
* 集合框架工具类(Collections.Arrays)
* @author wxm
*
*/
public class UtilDemo {
public static void main(String[] args) {
int array[]= {1231,78,99,13};
System.out.println(array);
//[I@6d06d69c
//二分搜索法...
//提供了许多便利数组查询的方法
System.out.println(Arrays.toString(array));
}
}
效果:[I@6d06d69c [1231, 78, 99, 13]
Arrays
1、数组转为集合的好处和不足
好处:可以使用集合的思想和方法操作数组中的元素。
不足:因为数组的长度是固定的,所以,数组转为集合后,不能使用集合的增加、删除方法。若使用增加、删除,则会报错误(UnsupportedOperationException).
注意:
如果数组中的元素是对象,那么转为集合时,数组中的元素直接转为集合中的元素;
如果数组中的元素都是基本数据类型,那么,会将该数组作为集合中的元素。
补充:集合转为数组,要注意转成后数组的长度!!!
2、那为什么要将集合转为数组呢?
当然是为了限定元素的操作,不需要进行增加、删除啦!
3、指定类型的数组长度怎么定义呢?
当指定类型的数组长度小于集合的size时,该方法内部会创建一个新的数组,长度为集合的size;
当指定类型的数组长度大于集合的size时,是使用传递进来的数组,直接创建一个刚刚好的数组最好。