当前位置: 首页 > news >正文

山东春季高考网站建设线上课程如何推广

山东春季高考网站建设,线上课程如何推广,网页设计入门与应用电子书pdf百度网盘,做花馍网站第7讲 | int和Integer有什么区别#xff1f; Java 虽然号称是面向对象的语言#xff0c;但是原始数据类型仍然是重要的组成元素#xff0c;所以在面试中#xff0c;经常考察原始数据类型和包装类等 Java 语言特性。 今天我要问你的问题是#xff0c;int 和 Integer 有什么…第7讲 | int和Integer有什么区别 Java 虽然号称是面向对象的语言但是原始数据类型仍然是重要的组成元素所以在面试中经常考察原始数据类型和包装类等 Java 语言特性。 今天我要问你的问题是int 和 Integer 有什么区别谈谈 Integer 的值缓存范围。 典型回答 int 是我们常说的整形数字是 Java 的 8 个原始数据类型Primitive Typesboolean、byte 、short、char、int、float、double、long之一。Java 语言虽然号称一切都是对象但原始数据类型是例外。 Integer 是 int 对应的包装类它有一个 int 类型的字段存储数据并且提供了基本操作比如数学运算、int 和字符串之间转换等。在 Java 5 中引入了自动装箱和自动拆箱功能boxing/unboxingJava 可以根据上下文自动进行转换极大地简化了相关编程。 关于 Integer 的值缓存这涉及 Java 5 中另一个改进。构建 Integer 对象的传统方式是直接调用构造器直接 new 一个对象。但是根据实践我们发现大部分数据操作都是集中在有限的、较小的数值范围因而在 Java 5 中新增了静态工厂方法 valueOf在调用它的时候会利用一个缓存机制带来了明显的性能改进。按照 Javadoc这个值默认缓存是 -128 到 127 之间。 考点分析 今天这个问题涵盖了 Java 里的两个基础要素原始数据类型、包装类。谈到这里就可以非常自然地扩展到自动装箱、自动拆箱机制进而考察封装类的一些设计和实践。坦白说理解基本原理和用法已经足够日常工作需求了但是要落实到具体场景还是有很多问题需要仔细思考才能确定。 面试官可以结合其他方面来考察面试者的掌握程度和思考逻辑比如 我在专栏第 1 讲中介绍的 Java 使用的不同阶段编译阶段、运行时自动装箱 / 自动拆箱是发生在什么阶段 我在前面提到使用静态工厂方法 valueOf 会使用到缓存机制那么自动装箱的时候缓存机制起作用吗 为什么我们需要原始数据类型Java 的对象似乎也很高效应用中具体会产生哪些差异 阅读过 Integer 源码吗分析下类或某些方法的设计要点。 似乎有太多内容可以探讨我们一起来分析一下。 知识扩展 理解自动装箱、拆箱 自动装箱实际上算是一种语法糖。什么是语法糖可以简单理解为 Java 平台为我们自动进行了一些转换保证不同的写法在运行时等价它们发生在编译阶段也就是生成的字节码是一致的。 像前面提到的整数javac 替我们自动把装箱转换为 Integer.valueOf()把拆箱替换为 Integer.intValue()这似乎这也顺道回答了另一个问题既然调用的是 Integer.valueOf自然能够得到缓存的好处啊 如何程序化的验证上面的结论呢 你可以写一段简单的程序包含下面两句代码然后反编译一下。当然这是一种从表现倒推的方法大多数情况下我们还是直接参考规范文档会更加可靠毕竟软件承诺的是遵循规范而不是保持当前行为。 Integer integer 1; int unboxing integer ;反编译输出 1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 8: invokevirtual #3 // Method java/lang/Integer.intValue:()I这种缓存机制并不是只有 Integer 才有同样存在于其他的一些包装类比如 Boolean缓存了 true/false 对应实例确切说只会返回两个常量实例 Boolean.TRUE/FALSE。 Short同样是缓存了 -128 到 127 之间的数值。 Byte数值有限所以全部都被缓存。 Character缓存范围’\u0000’ 到 ‘\u007F’。 自动装箱 / 自动拆箱似乎很酷在编程实践中有什么需要注意的吗 原则上建议避免无意中的装箱、拆箱行为尤其是在性能敏感的场合创建 10 万个 Java 对象和 10 万个整数的开销可不是一个数量级的不管是内存使用还是处理速度光是对象头的空间占用就已经是数量级的差距了。 我们其实可以把这个观点扩展开使用原始数据类型、数组甚至本地代码实现等在性能极度敏感的场景往往具有比较大的优势用其替换掉包装类、动态数组如 ArrayList等可以作为性能优化的备选项。一些追求极致性能的产品或者类库会极力避免创建过多对象。当然在大多数产品代码里并没有必要这么做还是以开发效率优先。以我们经常会使用到的计数器实现为例下面是一个常见的线程安全计数器实现。 class Counter {private final AtomicLong counter new AtomicLong(); public void increase() {counter.incrementAndGet();} } 如果利用原始数据类型可以将其修改为 class CompactCounter {private volatile long counter;private static final AtomicLongFieldUpdaterCompactCounter updater AtomicLongFieldUpdater.newUpdater(CompactCounter.class, counter);public void increase() {updater.incrementAndGet(this);} } 源码分析 考察是否阅读过、是否理解 JDK 源代码可能是部分面试官的关注点这并不完全是一种苛刻要求阅读并实践高质量代码也是程序员成长的必经之路下面我来分析下 Integer 的源码。 整体看一下 Integer 的职责它主要包括各种基础的常量比如最大值、最小值、位数等前面提到的各种静态工厂方法 valueOf()获取环境变量数值的方法各种转换方法比如转换为不同进制的字符串如 8 进制或者反过来的解析方法等。我们进一步来看一些有意思的地方。 首先继续深挖缓存Integer 的缓存范围虽然默认是 -128 到 127但是在特别的应用场景比如我们明确知道应用会频繁使用更大的数值这时候应该怎么办呢 缓存上限值实际是可以根据需要调整的JVM 提供了参数设置 -XX:AutoBoxCacheMaxN这些实现都体现在java.lang.Integer(http://hg.openjdk.java.net/jdk/jdk/file/26ac622a4cab/src/java.base/share/classes/java/lang/Integer.java)源码之中并实现在 IntegerCache 的静态初始化块里。 private static class IntegerCache {static final int low -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h 127;String integerCacheHighPropValue VM.getSavedProperty(java.lang.Integer.IntegerCache.high);...// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high 127;}...}第二我们在分析字符串的设计实现时提到过字符串是不可变的保证了基本的信息安全和并发编程中的线程安全。如果你去看包装类里存储数值的成员变量“value”你会发现不管是 Integer 还 Boolean 等都被声明为“private final”所以它们同样是不可变类型 这种设计是可以理解的或者说是必须的选择。想象一下这个应用场景比如 Integer 提供了 getInteger() 方法用于方便地读取系统属性我们可以用属性来设置服务器某个服务的端口如果我可以轻易地把获取到的 Integer 对象改变为其他数值这会带来产品可靠性方面的严重问题。 第三Integer 等包装类定义了类似 SIZE 或者 BYTES 这样的常量这反映了什么样的设计考虑呢如果你使用过其他语言比如 C、C类似整数的位数其实是不确定的可能在不同的平台比如 32 位或者 64 位平台存在非常大的不同。那么在 32 位 JDK 或者 64 位 JDK 里数据位数会有不同吗或者说这个问题可以扩展为我使用 32 位 JDK 开发编译的程序运行在 64 位 JDK 上需要做什么特别的移植工作吗 其实这种移植对于 Java 来说相对要简单些因为原始数据类型是不存在差异的这些明确定义在Java 语言规范里面不管是 32 位还是 64 位环境开发者无需担心数据的位数差异。 对于应用移植虽然存在一些底层实现的差异比如 64 位 HotSpot JVM 里的对象要比 32 位 HotSpot JVM 大具体区别取决于不同 JVM 实现的选择但是总体来说并没有行为差异应用移植还是可以做到宣称的“一次书写到处执行”应用开发者更多需要考虑的是容量、能力等方面的差异。 原始类型线程安全 前面提到了线程安全设计你有没有想过原始数据类型操作是不是线程安全的呢 这里可能存在着不同层面的问题 原始数据类型的变量显然要使用并发相关手段才能保证线程安全这些我会在专栏后面的并发主题详细介绍。如果有线程安全的计算需要建议考虑使用类似 AtomicInteger、AtomicLong 这样的线程安全类。 特别的是部分比较宽的数据类型比如 float、double甚至不能保证更新操作的原子性可能出现程序读取到只更新了一半数据位的数值 Java 原始数据类型和引用类型局限性 前面我谈了非常多的技术细节最后再从 Java 平台发展的角度来看看原始数据类型、对象的局限性和演进。 对于 Java 应用开发者设计复杂而灵活的类型系统似乎已经习以为常了。但是坦白说毕竟这种类型系统的设计是源于很多年前的技术决定现在已经逐渐暴露出了一些副作用例如 原始数据类型和 Java 泛型并不能配合使用 这是因为 Java 的泛型某种程度上可以算作伪泛型它完全是一种编译期的技巧Java 编译期会自动将类型转换为对应的特定类型这就决定了使用泛型必须保证相应类型可以转换为 Object。 无法高效地表达数据也不便于表达复杂的数据结构比如 vector 和 tuple 我们知道 Java 的对象都是引用类型如果是一个原始数据类型数组它在内存里是一段连续的内存而对象数组则不然数据存储的是引用对象往往是分散地存储在堆的不同位置。这种设计虽然带来了极大灵活性但是也导致了数据操作的低效尤其是无法充分利用现代 CPU 缓存机制。 Java 为对象内建了各种多态、线程安全等方面的支持但这不是所有场合的需求尤其是数据处理重要性日益提高更加高密度的值类型是非常现实的需求。 针对这些方面的增强目前正在 OpenJDK 领域紧锣密鼓地进行开发有兴趣的话你可以关注相关工程http://openjdk.java.net/projects/valhalla/ 。 今天我梳理了原始数据类型及其包装类从源码级别分析了缓存机制等设计和实现细节并且针对构建极致性能的场景分析了一些可以借鉴的实践。 一课一练 关于今天我们讨论的题目你做到心中有数了吗留一道思考题给你前面提到了从空间角度Java 对象要比原始数据类型开销大的多。你知道对象的内存结构是什么样的吗比如对象头的结构。如何计算或者获取某个 Java 对象的大小? 请你在留言区写写你对这个问题的思考我会选出经过认真思考的留言送给你一份学习鼓励金欢迎你与我一起讨论。 你的朋友是不是也在准备面试呢你可以“请朋友读”把今天的题目分享给好友或许你能帮到他。 析了一些可以借鉴的实践。 一课一练 关于今天我们讨论的题目你做到心中有数了吗留一道思考题给你前面提到了从空间角度Java 对象要比原始数据类型开销大的多。你知道对象的内存结构是什么样的吗比如对象头的结构。如何计算或者获取某个 Java 对象的大小? 请你在留言区写写你对这个问题的思考我会选出经过认真思考的留言送给你一份学习鼓励金欢迎你与我一起讨论。 你的朋友是不是也在准备面试呢你可以“请朋友读”把今天的题目分享给好友或许你能帮到他。
http://www.hkea.cn/news/14500627/

相关文章:

  • 上海公司建立网站鄂州网站建设
  • 凡科建站登录入口官方我想注册一个网站怎么注册
  • 教育类的网站案例苏州高端网站设计定制
  • 九江企业网站的建设咸阳网站建设培训
  • 郑州网络营销公司优化seo设置
  • 校园网站设计方案第三方网站做app
  • 最好的购物网站排名网站建设按年收费吗
  • 九一制作网站网页背景图片高清
  • 贵阳网站托管做论坛网站需要多少钱
  • 网站有什么到期网站开发用了哪些知识要点
  • 网站 维护土地流转网站开发
  • 做彩票网站需要境外天津 企业网站建设
  • 可视化建网站调用别人网站注册表单
  • 网站开发完没人运营sns社交网站 有哪些
  • 首页调用网站栏目id网站后台登入密码忘记了
  • 如何在云主机上建设网站国内比较高端的设计网站
  • 保定做网站设计开发门户网站
  • 网站建设用什么程序语言wordpress客户管理系统
  • 哪个网站可以做私单网站后台模板安装显示不了
  • 网页制作与网站建设宝典wordpress 版权声明
  • 如何增加网站的反链金湖县网站建设
  • 成都网站设计最加科技网站建设需要注意什么
  • 成都络迈品牌网站建设发布信息哪个平台好
  • 怎么自己做淘宝客网站微网站 php
  • 985建设网站电商设计软件有哪些
  • 做3d图的网站有哪些软件有哪些wordpress 屏蔽升级
  • 手机网站自动适配电商要怎么做起来
  • 济宁商城网站建设企业wordpress主题下载地址
  • 做的网站百度上可以搜到吗wordpress 一直跳转到老域名
  • 网站开发人员配置网页版梦幻西游贴吧