HashMap集合中key只能为引用数据类型,不能为基本类型

在HashMap中,为什么不能使用基本数据类型作为key?

其实和HashMap底层的存储原理有关,HashMap存储数据的特点是:无序、无索引、不能存储重复元素。

存储元素采用的是hash表存储数据,每存储一个对象的时候,都会调用其hashCode()方法,算出其hash值,如果相同,则认为是相同的数据,直接不存储,如果hash值不同,则再调用其equals方法进行比较,如果返回true,则认为是相同的对象,不存储,如果返回false,则认为是不同的对象,可以存储到HashMap集合中。

 之所以key不能为基本数据类型,则是因为基本数据类型不能调用其hashcode()方法和equals()方法,进行比较,所以HashMap集合的key只能为引用数据类型,不能为基本数据类型,可以使用基本数据类型的包装类,例如Integer Double等。

当然,在HashMap存储自定义对象的时候,需要自己再自定义的对象中重写其hashCode()方法和equals方法,才能保证其存储不重复的元素,否则将存储多个重复的对象,因为每new一次,其就创建一个对象,内存地址是不同的。

   

   另:HashMap中key是可以为null, 只能存储一个null, 因为计算key的hash值的时候,如果key为null, 则其hash值为0

 

包装类的作用:

 1. 包装类里面有一些很有用的方法和属性,如HashCode,ParseInt,equals;比如hashmap中就用到了
 2. 基本类型不能赋null值,某些场合需要;
 3. 很多地方不能直接用基本类型,比如集合,范型;
 4. 包装类的缓存提高了存取效率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以使用Java的DOM解析器来解析XML文件。DOM解析器会将XML文件解析成一个树状结构,我们可以遍历这个树状结构,将解析到的数据存入HashMap。 以下是一个简单的示例代码: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; import java.util.HashMap; import java.util.ArrayList; import java.util.List; public class XmlParser { public static void main(String[] args) { try { File inputFile = new File("data.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); HashMap<String, List<String>> map = new HashMap<String, List<String>>(); NodeList nList = doc.getElementsByTagName("province"); for (int i = 0; i < nList.getLength(); i++) { Node nNode = nList.item(i); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; String province = eElement.getAttribute("name"); NodeList cityList = eElement.getElementsByTagName("city"); List<String> cityNames = new ArrayList<String>(); for (int j = 0; j < cityList.getLength(); j++) { Node cityNode = cityList.item(j); if (cityNode.getNodeType() == Node.ELEMENT_NODE) { Element cityElement = (Element) cityNode; cityNames.add(cityElement.getAttribute("name")); } } map.put(province, cityNames); } } // 输出HashMap数据 for (String province : map.keySet()) { System.out.println("Province: " + province); List<String> cities = map.get(province); for (String city : cities) { System.out.println("\tCity: " + city); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码,我们首先创建了一个HashMap,用于存储解析后的数据。然后使用DOM解析器解析XML文件,遍历每个省份节点,并将省份名称作为HashMapkey,城市列表作为value存入HashMap。在遍历每个省份节点时,我们同样遍历该省份下的所有城市节点,并将城市名称添加到城市列表。最后,我们遍历HashMap数据并输出。 需要注意的是,上述代码的XML文件结构应该类似于以下结构: ```xml <provinces> <province name="北京"> <city name="北京市"/> </province> <province name="上海"> <city name="上海市"/> </province> <province name="广东"> <city name="广州市"/> <city name="深圳市"/> <city name="珠海市"/> </province> </provinces> ``` 其,每个省份节点包含一个name属性,表示省份名称;每个城市节点包含一个name属性,表示城市名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值