命名解释

现在一搜索堆污染或者Heap Pollution基本是官网教程的翻译,基本没有解释,堆污染,污染了什么,为什么这么叫。

本文关于名称由来的部分基本从文章末尾的参考[1]中翻译过来,感兴趣可以看原文。

堆污染简单来说就是在你的堆(new对象存放的地方)里面有坏东西,所以叫堆污染。类比水污染,是水里面有脏东西把水污染了,所以叫水污染。

这就是java人创造的术语,至于这背后是否有某些原因(助记符之类的),maybe no why,这也许和Java作者的背景文化有关。

堆污染概念

技术上说,堆污染是可变类型的变量指向了一个不是该类型的对象时发生的。关于这方面定义可以看官网[3]的第六个标题Heap Pollution,以下示例来自[2]

Example:

// Program to illustrate Heap pollution situationimport java.util.*;class Geeks {public static void main(String[] args){// Creating a List of type StringList<String> listOfString = new ArrayList<>();listOfString.add("Geeksforgeeks");// Creating a List of type Integer which holds// the reference of a List of type String// Here compiler will detect that// there is a chance of Heap pollution// Compiler will throw an unchecked warning// at the compile-time onlyList<Integer> listOfInteger= (List<Integer>)(Object)listOfString;// Here we are trying to access// firstElement of listOfInteger which holds// the reference of a List of type String// and trying to store it into// one variable of type IntegerInteger firstElement= listOfInteger.get(0);System.out.println(firstElement);}
}

上述代码线创建了一个 listOfString 添加了一个字符串元素,而后强制类型转化为 List<Integer> ,最后再获取转化过后的第一个元素。

编译时warning,但能够完成编译:

prog.java:12: warning: [unchecked] unchecked castList listOfInteger = (List)(Object)listOfString;^required: Listfound:    Object
1 warning

运行输出:

Exception in thread “main” java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at Geeks.main(File.java:16)

参考

  • [1] java-heap-pollution
  • [2] waht is heap pollution
  • [3] heap-pollution

Java中堆污染Heap Pollution的命名来源相关推荐

  1. java安全编码指南之:堆污染Heap pollution

    简介 什么是堆污染呢?堆污染是指当参数化类型变量引用的对象不是该参数化类型的对象时而发生的. 我们知道在JDK5中,引入了泛型的概念,我们可以在创建集合类的时候,指定该集合类中应该存储的对象类型. 如 ...

  2. Java虚拟机:Java中堆和栈的详细区别

    一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...

  3. Java中堆、栈、常量池等概念解析

    Java中堆.栈.常量池等概念解析 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有 ...

  4. java non-heap_Java堆内存Heap与非堆内存Non-Heap简介和设置

    Java 开发对JVM(Java虚拟机)的了解很有必要,网上看到,收集整理转载一下,方便日后的懒人计划 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一 ...

  5. 让你彻底明白JAVA中堆与栈的区别

    原文地址:http://www.2cto.com/kf/201302/190704.html 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象 ...

  6. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  7. JAVA中堆和栈的区别和联系

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...

  8. Java中堆内存和栈内存详解(转)

    Java栈与堆 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快, ...

  9. java中堆和堆栈的区别

    1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...

最新文章

  1. 互联网人不敢生孩子:加班多、想跳槽、怕被边缘化
  2. ubuntu 下review board一遍安装成功
  3. GridView空记录时显示Header和Footer
  4. linux 学习笔记 显示压缩文件 gong.zip 的文件内容
  5. 第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?
  6. JS-元素的样式操作-文本内容-位置
  7. Direct2D教程(五)复合图形
  8. 华为回应“发射卫星抢占6G”:假消息
  9. python 3.9 性能_Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型
  10. java openSession和getCurrentSession的比较
  11. 广搜最短路径变形,(POJ3414)
  12. 辐射避难所买了东西显示服务器异常,辐射避难所常见问题汇总 专治疑难杂症...
  13. mybatis-plus主键生成策略
  14. 分布式存储系统学习笔记(一)—什么是分布式系统(6)—2PC和Paxos协议
  15. python中怎么统计英文字符的个数_python 输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数用python代码输入一行字符...
  16. bluetoothctl No default controller available
  17. hibernate的检索策略(抓取策略)
  18. 4G全网通MTK6737开发板-安卓核心板通信LTE模块方案
  19. 期货行业首批信创试点单位转型实践|信创专题
  20. linux教程试卷_Linux 系统安装试题

热门文章

  1. 量子计算机编程pdf,浅谈量子计算与编程.pdf
  2. 第二代AMD EPYC处理器正式登陆大中华区市场
  3. Java 面向对象基础和进阶
  4. 第一次使用爱斯维尔(Elsevier)论文模板注意事项
  5. 大宗农产品交易知识图谱推理引擎的构建--需求分析
  6. for in 与 for of的区别
  7. win10 局域网其他电脑/手机无法访问我的web项目
  8. 编程中一些基本英语单词,及学习方法——划词,翻译软件
  9. 计算机专业写论文遇到的问题,毕业论文写作经常遇到的十大问题,你知道吗?...
  10. 学生会办公室专用信息收集软件1.6版