Java核心技术讲解六

次次文章简单的学习了虚拟机相关的知识。可以点击java核心技术讲解学习五

这篇文章来说下简单的知识,也是我们经常用的String ,StringBuffer,StirngBuilder.

String

String 是一个典型的Immutable(不可变)类。在实现的上被申明为final class.并且其属性也是final。 所以其不可变性导致在进行字符串操作的时候很容易产生。

  • String 因为是不可变类。我们在对其进行操作的时候都能保证了基础的线程安全。我们无法对其内部进行修改。
  • Stirng内部底层是用的char数据存储。在Java9中引入了一种新的设计,将其底层改为byte数组,数据存储方式改为了byte数组加上一个标识编码。
  • 字符串的创建 机制,String content ="111"; 该方式会将值 放入字符串常量池
  • Stirng ss = new String("111"); 不放入字符串常量池。
  • 只对常量池的优化, 当两个对象拥有同样的值时,只是常量池中的一个拷贝。当一个字符串内容经常出现时,可以大幅度节省内存空间。
  • 在Java8中 对字符串进行了优化,字符串拼接 编译的时候会直接编译成StringBuilder。

StringBuffer

StringBuffer 是为了解决String在进行字符串拼接过程中产生大量中间对象而形成的的一个类。我们可以使用其进行字符串的拼接,使用append或者add方法来实现 。

  • 该方法是一个线程安全的可修改字符序列,保证了线程安全,这样就会带来额外消耗,所以我们在多线程时可以使用该类进行操作 ,建议使用StringBuffer,例如XML解析、HTTP参数解析与封装。。
  • 默认初始值对象大小为16,跟数据类似。如果需要进行扩容的话,会进行数据内容的复制。增加性能的损耗。如果大概知道数据大小,那么可以进行指定大小。

StringBuilder

StringBuilfer与StringBuffer基本上没什么区别,但是特点是该StringBuilder是线程不安全的,在单线程上操作比StringBuffer性能损耗小。

  • 我们在操作字符串的时候,需要大量的字符串操作,可以采用StringBuilder.例如 在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程环境下,建议使用StringBuilder,例如SQL语句拼装、JSON封装等 。
  • 其中 默认初始值对象大小为16,跟数据类似。如果需要进行扩容的话,会进行数据内容的复制。增加性能的损耗。如果大概知道数据大小,那么可以进行指定大小。

说完字符串我们来说下int和Integer的区别,了解其类型让我们在开发过程中更加方便

int和Integer

int

int就是我们常说的几种原始类型之一(boolean、byte 、short、char、int、float、double、long)字节占用是4字节。 我们在一些大数据进行开发的时候需要特别的包装类型和原始数据类型的应用。

  • 原始数据类型不保证线程安全性,我们可以使用线程安全的类

Integer

Integer 是int的包装类型,该类也是一个不可变类。可以与int进行转换。

自动装箱和自动拆箱

在笔者原先做web开发的时候并没有注意对int类型还有Integer类型特别的注意,因为在这里面笔者并没有注意自动装箱和自动拆箱的作用,在这次大数据进行开发的时候,因为我们内存的原因并且处理量太大,不容易处理,java中自动拆箱和自动装箱让笔者才注意到。

  • 我们在编程中要避免无意中的装箱和拆箱行为,特别是在处理数据量特别大的情况下,创建100万个对象跟100万个整数性能开销是不同的。因为包装类型里面还包含着对象头这些信息,占用数据内容太大。导致性能降低。解决方案建议用原始数据类型,,数组或者本地代码来实现替换。
  • 对象头在对象中究竟占用了多少呢? 对象分为 对象头,对象实例,对其填充。我们这次先说下这个分类。等下次再进行分析

Java原始数据和引用类型局限性

  1. 原始数据类型在泛型中不能使用,我们在使用泛型的时候必须转为Object类型。
  2. 无法高效的表达数据,也不方便表达复杂的数据结构。 数据存储的是引用,原始数据类型是连续的内存。但是对象一般都是分散在堆中的不同位置。

原文发布于微信公众号 - LuckQI(YoungRUIQ)

原文发表时间:2018-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

Swift4语法新特性 原

      随着iPhone X的来到,iOS11的发布,Swift语言也更新到了第4个版本。在Swift4中,无论是代码风格还是编程理念都更进一步的融合了许多...

27930
来自专栏前端架构与工程

【翻译】ES6生成器简介

原文地址:http://davidwalsh.name/es6-generators ES6生成器全部文章: The Basics Of ES6 Generat...

21270
来自专栏信安之路

【作者投稿】奇葩webshell技巧

前段时间看XDCTF的一道web题,发现了一种很奇特的构造webshell的方法。

14200
来自专栏Java Web

《编写高质量代码》学习笔记(2)

写着写着发现简书提醒我文章接近字数极限,建议我换一篇写了。 ---- 建议52:推荐使用String直接量赋值 一般对象都是通过new关键字生成的,但是Str...

37340
来自专栏从流域到海域

《Java程序设计基础》 第3章手记

《Java程序设计基础》 第3章手记 本章主要内容: 1. 数据类型 2. 变量 3. 基本类型变量 4. 数据类型的转换规则 ...

20960
来自专栏web编程技术分享

小兔JS教程(四)-- 彻底攻略JS数组

44580
来自专栏程序猿

Linux sed 命令的使用

首先,就昨晚的发的消息道歉,虽然整蛊大家了,但是我还是挺开心的。 sed是一种流编辑器,配合正则表达式使用,sed处理文件之时,把当前处理的文保存...

410100
来自专栏程序员互动联盟

【编程基础】C++初学者需掌握的10个C++特性(中)

Strongly-typed enums 强类型枚举 传统的C++枚举类型存在一些缺陷:它们会将枚举常量暴露在外层作用域中(这可能导致名字冲突,如果同一个作用域...

34140
来自专栏JMCui

MongoDB系列六(聚合).

 一、概念     使用聚合框架可以对集合中的文档进行变换和组合。基本上,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理。这些构件包...

88960
来自专栏数据科学与人工智能

【Python环境】Python面试题汇总(一)

拿网络上关于Python的面试题汇总了,给出了自认为合理的答案,有些题目不错,可以从中学到点什么,答案如不妥,请指正...... +++++++++++++++...

36660

扫码关注云+社区

领取腾讯云代金券