HashMap简介
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。key和value一一对应,key不得重复
HashMap的定义和声明,<key,value>然后key和value可以是类,interger string,等等
HashMap<String, String> map1 = new HashMap<>();
put()
put() 的作用是对外提供接口,让HashMap对象可以通过put()将“key-value”添加到HashMap中。
map1.put("2", "王宝强");
map1.put("3", "黄渤");
map1.put("4", "靳东");
map1.put("4", "靳");//这里由于key 重复,所以覆盖上面那条
map1.put("5", null);
get()
get() 的作用是获取key对应的value,它的实现代码如下
String a = map1.get("1");
System.out.println(a);
size()
int size = map1.size();
System.out.println(size);
remove()
remove() 的作用是删除“键为key”元素
String remove = map1.remove("5"); //移除
System.out.println(remove);
通过key确认该key对应的value是否还存在的两种方法
方法1:运用get()方法,如果存在返回其value,如果 不存在返null
String b = map1.get("5");
System.out.println(b);
方法2:可以利用map的contains功能判断指定的key是否存在,如果存在返回true,不存在,返回 Flase(boolean值)
boolean c = map1.containsKey("5"); // 此方法才能真正确定map中是否存在指定的key
System.out.println(c);
Set<String> keySet = map1.keySet();
HashSet
HashSet是set接口的实现类,也是我们最常用的set集合
储存的是无序,唯一的对象
由于是无序的所以每组数据都没有索引,很多list可用的方法他都没有
凡是需要通过索引来进行操作的方法都没有
所以也不能使用普通for循环来进行遍历,只有加强型for和迭代器两种遍历方法
1迭代器法
由于这种数据类型的存储是无序的,所以无法直接遍历,开发者为用户构造了迭代器为其遍历所使用
迭代器有三个方法iterator() 迭代器的声明,hasNext() 返回值是boolean类型,用于判断该HashSet中是否还有数据,如果还有数据,就继续将指针后移,next()取出当前位置的数据。
Iterator<News> it = set.iterator(); //首先先进行迭代器的声明 构造迭代器的对象,然后<写的是set中存的数据类型>
while (it.hasNext()) { //hasNext() 返回值是boolean类型,如果还能取返回true并且游标下移。如果是Flase就取完了,结束
News n = it.next(); //取出当前位置的数据
System.out.println(n.getID()+"\t"+n.getLitter()+"\t"+n.getAuthor());
}
增强型for 增强for循环:内部封装了迭代器的使用
set用增强for遍历
for(News n : set) 这里数据语法如下
set
for(数据类型 变量:需要遍历的集合)
{
循环体
}
实际例子
for(News n : set){
System.out.println(n.getID()+"\t"+n.getLitter()+"\t"+n.getAuthor());
}
// 数组也可以用增强for循环来遍历
int[] arr = new int[] {3,5,7,9,2};
for(int x:arr) {
System.out.println(x);
}
// arraylist也可以用增强for循环来遍历
ArrayList<Product> pdts = new ArrayList<>();
pdts.add(new Product("1", "肥皂", 12.45f, 2));
pdts.add(new Product("2", "香皂", 12.45f, 3));
pdts.add(new Product("3", "洗衣粉", 12.45f, 1));
for(Product p:pdts) {
System.out.println(p.getProductName());
}
Map集合中三种方法的简介:
values():获取集合中的所有的value值;
keySet():将Map中所有的key存放到Set集合中。应为Set集合有迭代器,可以通过迭代器循环key,在通过get()方法,得到每个key所对应的value;
entrySet():Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。 Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 。
/**通过values()方法,获取集合中所有的值**/
Collection<String> collection = map.values();
System.out.println(collection);
/**通过keySet()方法将所有的key值存放到Set集合中,Set集合中有迭代器**/
Set<String> keySet = map.keySet();//先获取map集合的所有键的Set集合
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()){
String key = iterator.next();
System.out.println("key="+key+" "+map.get(key));
}
/**通过entrySet()方法将key和value存放到Set集合中,Set集合中有迭代器**/
Set<Entry<String,String>> entry = map.entrySet();
Iterator<Entry<String,String>> iterators = entry.iterator();
while(iterators.hasNext()){
Entry<String,String> entrys = iterators.next();
System.out.println("key="+entrys.getKey()+"&&value="+entrys.getValue());
/**通过entrySet()方法将key和value存放到Set集合中,用for增强循环**/
Set<Entry<String,String>> entry = map.entrySet();
for (Entry x:entry){
System.out.println("key="+x.getKey()+"&&value="+x.getValue());
}
HashMap的应用:找出重名的商品
package cn.edu360.javase24.day06.hashmapdemo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import cn.edu360.javase24.day05.shop.Product;
/**
* hashmap的应用练习2:
*
* @author ThinkPad
*
*/
public class HashMapTest2 {
public static void main(String[] args) {
// 1、造几个product对象,放入一个hashmap中
Product p1 = new Product("1", "香蕉", 20, 2);
Product p2 = new Product("2", "橘子", 10, 2);
Product p3 = new Product("3", "榴莲", 120, 2);
Product p4 = new Product("4", "香蕉", 20, 2);
Product p5 = new Product("5", "榴莲", 120, 2);
Product p6 = new Product("6", "榴莲", 120, 2);
HashMap<String, Product> pdtMap = new HashMap<>();
pdtMap.put(p1.getProductId(), p1);
pdtMap.put(p2.getProductId(), p2);
pdtMap.put(p3.getProductId(), p3);
pdtMap.put(p4.getProductId(), p4);
pdtMap.put(p5.getProductId(), p5);
pdtMap.put(p6.getProductId(), p6);
// 2、给我找出hashmap中产品名称重复的数据,并打印出发生了重复的数据产品id:
// 遍历pdtMap,逐一取出里面的product对象,然后构造一个新的hashmap
// 然后判断,这个product对象的name在新hashmap是否存在,如果尚不存在,则将这个product对象的name作为key,id作为value放入一个新的hashmap中
// 如果已存在,则将之前的id拼上这个product的id作为value覆盖进去
HashMap<String, String> newMap = new HashMap<>();
Set<String> keySet = pdtMap.keySet();
for (String id : keySet) {
Product p = pdtMap.get(id);
if (newMap.containsKey(p.getProductName())) {
String id_value = newMap.get(p.getProductName()); // 从新map中取出已存在的产品id
newMap.put(p.getProductName(), id_value + "," + p.getProductId()); // 将新map中的产品id拼上这次从老map中取出的产品的id
} else {
newMap.put(p.getProductName(), p.getProductId());
}
}
Set<String> keySet2 = newMap.keySet();
for (String name : keySet2) {
String ids = newMap.get(name);
System.out.println(ids + "-->" + name);
}
// 1,4-->香蕉
// 3,5,6-->榴莲
}
}
应用二:找出相同的字母
首先将单词HashMap安排中,存入的方式是这样,将单词依次存入,这里字母为key,数量为value,如果key不存在该单词,便将其存入且数量设为1,如果存在,则数量+1
package hashmapdemo;
import java.util.HashMap;
import java.util.Set;
public class WordCount {public static void main(String[] args) {
String str = "a,b,c,d,e,f,g,h,b,b,b,c,x,x,y,x,b";
String[] words = str.split(",");
HashMap<String, Integer> countMap = new HashMap<>();
for(String ch:words) {
if(countMap.containsKey(ch)) {
Integer value = countMap.get(ch);
countMap.put(ch, value+1);
}else {
countMap.put(ch, 1);
}
}
/**
* 遍历hashmap,打印数据
*/
// 先取出所有的key
Set<String> keySet = countMap.keySet();
// 然后遍历一个一个的key,去map中取value
for(String key:keySet) {
Integer count = countMap.get(key);
System.out.println(key + "," + count);
}
}
}