Java基础之基本数据类型与String

语法基础

8种基本数据类型

基本类型是不同于类(Class)的特殊类型,在栈内存中管理

  • 字符型 char

  • 布尔型 boolean

  • 数值型
    不存在无符号的整型,范围也是固定的与环境无关

    • 整型
      • byte 一个字节存储,范围-128~127,初始化时默认为0
      • short 两个字节存储,范围-32768~32767,初始化时默认为0
      • int 四个字节存储,范围-2147483648~2147483647,初始化默认为0
      • long 八个字节存储,范围-9223372036854775808~9223372036854775807,初始化默认为0L
    • 浮点型
      • float
      • double

自动拆装箱

包装类型(Wrapper Class)

解决基本类型不面向对象(不继承Object)的缺陷,丰富了基本类型的操作

基本数据类型包装类
byteByte
booleanBoolean
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble
拆箱与装箱

将基本类型和包装类型(箱指代包装类型)转换

在Java SE5 前实现装箱需要手动new一个包装类
在Java SE5 后实现了自动的装箱和拆箱

原理:
自动装箱都是通过包装类的 valueOf() 方法来实现的。
自动拆箱都是通过包装类对象的 xxxValue() 来实现的。

自动拆装箱与缓存

如果一个变量 p 的值是:

  • -128 至 127 之间的整数
  • true 和 false 的布尔值
  • \u0000 至 \u007f 之间的字符

那么将p包装成a、b两个对象时,可以直接使用a==b判断a和b值是否相等,但是超过范围还是要用equals判断

可以通过java.lang.Integer.IntegerCache.high设置缓存最大值

其他类型的缓存机制也类似

自动拆装箱带来的问题
  • 逻辑运算更复杂
  • 如果包装对象为null,则可能拆箱时出现空指针错误
  • 大量的拆装箱操作会浪费资源

布尔型接口最佳实践

成员变量名用 success 不加is前缀,存在序列化时出错的可能,自动生成set和get方法时也会有问题

类型用包装类,没有初值时是null,会抛出错误

String

字符串的不可变性

不可变对象:创建之后内部状态保持不变的对象,既不能更新引用也不能改变内部状态

正常的改变String变量实际上是创建了新的字符串

为什么设计成不可变
  • 缓存
    大量字符串的创建非常耗费资源,利用对字符串的缓存功能可以节省大量堆空间
    JVM中专门开辟了一个空间存储字符串,称为字符串池
  • 安全性
    字符串不可修改来保存各种信息安全性更高
  • 线程安全
    多线程访问字符串或者更改字符串时,只会创建值不会修改值
  • hashcode缓存
    不可变性保证了字符串的值不会改变。因此,hashCode()方法在String类中被重写,以方便缓存,这样在第一次hashCode()调用期间计算和缓存散列,并从那时起返回相同的值。
  • 性能
    因为字符串不可变,所以可以用字符串池缓存,可以大大节省堆内存。而且还可以提前对hashcode进行缓存,更加高效
subString()方法

subString(int beginIndex, int endIndex) 方法的作用:
截取字符串并返回其[beginIndex,enIndex-1]范围内的内容

  • JDK6中的subString:
    在JDK6中String类包含三个成员变量:char valuep[], int offset,int count,分别存储真正的字符串数组,字符串第一个位置的索引,以及字符串的长度。
    调用subString方法时,创建新的String对象,但是string的value指向堆中的同一个字符数组,只有count和offset不同
    导致的问题:一个字符串被反复引用,无法被回收,可能导致内存泄漏
  • JDK7中的subString:
    为了解决JDK6中内存泄漏的风险,JDK7中subString方法会创建一个新的数组
replace相关方法

都用于替换字符

  • replace(CharSequence target,CharSequence replacement):用replacement替换所有的target,两个参数都是字符串

  • replaceAll(String regex,String replacement):replacement替换所有的regex匹配项,其中regex是个正则表达式,replacement是字符串

  • replaceFirst(String regex,String replacement):与replaceAll基本一致,但是只替换第一个匹配的部分

String的拼接
使用+拼接

Java中+对字符串进行拼接,类似于对运算符重载,但其实Java是不支持运算符重载的,这仅仅是一种语法糖。

底层的拼接是靠向StringBuilder中添加字符串然后toString
特殊情况:如果是两个字面量拼接,那么在编译期就会用一个拼接后的字符串(如 “a”+“b” 用"ab"替代)

阿里巴巴Java开发手册中不建议在循环体里使用+进行字符串拼接

concat方法

用法: String 拼接后string = string.concat(“字符串”).concat(String对象);

底层实现:先创建字符数组,后将待拼接的对象的字符串值复制到数组中,最后返回Stirng对象,本质上也是new了一个新的String

StringBuffer

String如果理解成字符串常量,那么StringBuffer类就是字符串变量,它的对象是可以扩充和修改的

用法 StringBuffer stringBuffer = stringBuffer对象.append(“字符串”).append(String对象);

底层实现:与Stirng类似的封装了一个字符数组value,但是并不是final的,可以修改,调用append将字符拷贝到内部的value中,如果长度不够还会进行扩展
此外,StringBuffer线程安全的

StringBuilder

用法和StringBuffer基本一致
底层实现也基本一致,但是线程不安全

StringUtils.join

StringUtils由apache.commons提供,其中的join方法可以拼接字符串
用法 StringUtils.join(“字符串”,Strng对象,…);

也可以将数组或集合以拼接符拼接到一起形成字符串如

String []list  ={"Univero","更新Java相关技术文章"};
String result= StringUtils.join(list,",");
System.out.println(result);
//结果:Univero,更新Java相关技术文章

底层实现:底层也是通过StringBuilder实现的

StringJoiner

StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾。虽然这也可以在StringBuilder类的帮助下在每个字符串之后附加分隔符,但StringJoiner提供了简单的方法来实现,而无需编写大量代码。

用法:StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix),参数依次为分隔符、前缀、后缀
拼接时使用add()方法,用法与StringBuilder的append方法类似

底层实现:依赖于StringBuilder

为什么使用StringJoiner:
可以简化Stream通过Collectors.joining(CharSequence)拼接字符串,如

list.stream().collect(Collectors.joining(":"));

Java 8中提供了StringJoiner来丰富Stream的用法,而且StringJoiner也可以方便的增加前缀和后缀。

效率比较

StringBuilder < StringBuffer < concat < + < StringUtils.join

+ 每次都要创建StirngBuilder,再将StringBuilder,再进行append,会耗费更多的时间
所以,阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。而不要使用+。

1、如果不是在循环体中进行字符串拼接的话,直接使用+就好了。

2、如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder。

3、如果是通过一个List进行字符串拼接,则考虑使用StringJoiner。

String.valueOf 和 Integer.toString的区别
int i = 5;String i1 = "" + i;
String i2 = String.valueOf(i);
String i3 = Integer.toString(i);

上述三种方式都可以将int类型转换成字符串
第一种方法其实是String i1 = (new StringBuilder()).append(i).toString();
而第二种和第三种方法没有区别,因为String.valueOf(i)也是调用Integer.toString(i)来实现的。

switch对String类型的支持

字符串的switch是通过equals()和hashCode()方法来实现的。记住,switch中只能使用整型,比如byte。short,char(ASCII码是整型)以及int。而hashCode返回的是int

String的长度限制

字符串有长度限制,在编译期,要求字符串常量池中的常量不能超过65535,并且在javac执行过程中控制了最大值为65534。

在运行期,长度不能超过Int的范围,否则会抛异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SVN的使用-源代码管理工具-SVN介绍-服务器的搭建 Objective-C语言】

一、首先,我们来介绍一下源代码管理工具 1.源代码管理工具的起源 为什么会出现源代码管理工具,是为了解决源代码开发的过程中出现的很多问题: 1)无法后悔:把项目关了,无法Command + Z后悔, 2)版本备份:非空间、费时间、写的名称最后自己都忘了干什么的了, 3)版本…

易保全推动区块链应用与AI融合创新发展

数字化时代&#xff0c;区块链和人工智能技术作为当下两大“黑科技”&#xff0c;两者的深度结合&#xff0c;正在为企业数字化转型带来前所未有的机遇。 易保全作为国内权威的电子数据存证保全机构&#xff0c;积极探索两者的融合之道&#xff0c;将区块链的去中心化、不可篡…

【Threejs进阶教程-着色器篇】2. Uniform的基本用法与Uniform的调试

Uniform的基本用法与Uniform的调试 关于本Shader教程优化上一篇的效果优化光栅栏高度让透明度和颜色变的更平滑pow()函数借助数学工具更好的理解函数 Unifoms简介编写uniforms修改片元着色器代码借助lil.gui调试uniforms使用uniform控制颜色继续在uniforms添加颜色在着色器中接…

刷题Day41|322. 零钱兑换、279. 完全平方数、139.单词拆分

322. 零钱兑换 322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; dp[j]&#xff1a;装满容量为j&#xff0c;最少物品为dp[j] 放物品i&#xff1a;dp[j - coins[i]] 1 dp[j] min(dp[j - coins[i]] 1, dp[j]); dp[0] 0; dp[非零] Integer.MAX_VALUE; 思路&…

C# —— Math对象

Math 数学类 提供了一些相关数学计算的属性和方法、四舍五入、向上求整、向下求整、开平方&#xff0c;几次方 最大值和最小值 sin cos 绝对值 方法 1.Math 常用的字段 Math.PI double x 2 * 180 / Math.PI; Console.WriteLine(x); 2 Math.Abs() 求绝对值 int a -3; Con…

西南交通大学【算法分析与设计实验5】

有障碍物的不同路径数量 实验目的 &#xff08;1&#xff09;理解动态规划算法的求解过程。 &#xff08;2&#xff09;分析动态规划算法的时间复杂度&#xff0c;比较动态规划算法与其他算法的效率差异。 &#xff08;3&#xff09;学会如何利用动态规划算法求解具体问题&…

git配置ssh-keygen -t rsa -c“xxxx@xxxx.com.cn出现Too many arguments.解决办法

git配置ssh-keygen -t rsa -c"xxxxxxxx.com.cn出现Too many arguments.解决办法 问题描述 配置Git公钥私钥时候输入命令ssh-keygen -t rsa -c"xxxxxxxx.com.cn出现Too many arguments. 解决办法&#xff1a; 提示输入的参数格式不正确&#xff0c;需要注意这几个地…

按是否手工执行测试的角度划分:手工测试、自动化测试

1.手工测试&#xff08;Manual testing&#xff09; 手工测试是由人一个一个的输入用例&#xff0c;然后观察结果&#xff0c;和机器测试相对应&#xff0c;属于比较原始但是必须的一个步骤。 由专门的测试人员从用户视角来验证软件是否满足设计要求的行为。 更适用针对深度…

uniapp 开发备忘录-防坑指南

uniapp 开发备忘录-防坑指南 npm run dev:mp-weixin 编译微信小程序报错&#xff1a; [plugin:uni:mp-using-component] Expected ‘,’ or ‘}’ after property value in JSON at position 解决方案&#xff1a;升级uniapp 到最新 alpha 版。&#xff08;2024年7月13日&am…

Markdown+VSCODE实现最完美流畅写作体验

​下载VSCODE软件 安装插件 Markdown All in One &#xff1a;支持markdown的语言的&#xff1b; Markdown Preview Enhanced &#xff1a;观看写出来文档的效果&#xff1b; Paste IMage :添加图片的 Code Spell Checker检查英文单词错误&#xff1b; 基础语法 标题 #一个…

【数据分享】《中国建筑业统计年鉴》2005-2022 PDF

而今天要免费分享的数据就是2005-2022年间出版的《中国建筑业统计年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 需要2023的数据的请添加小编咨询 数据介绍 在过去的十八个年头中&#xff0c;中国建筑业经历了翻天覆地的变化。从《中国建…

伺服调试三环讲解

在伺服调试过程中,有些项目要求不高,采用伺服自整定就可以调试好伺服,但有些项目对伺服有着比较高的要求,于是需要采取手动调试伺服参数,下面就介绍一下伺服三环参数的调试的方法。 三环指:电流环、速度环、位置环 带宽关系:电流环带宽>速度环带宽>位置环带宽 三环控…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务7:格式化并启动Hadoop集群

任务描述 任务内容为格式化并启动Hadoop集群&#xff0c;并修复可能出现的Bug。 任务指导 Hadoop集群启动前需要在NameNode上格式化元数据&#xff0c;成功格式化后才能启动Hadoop的HDFS和YARN。 格式化启动Hadoop集群的步骤如下&#xff1a; 1. 在NameNode&#xff08;ma…

约束:对于数据的限制

主键约束 主键约束&#xff1a;唯一约束非空约束&#xff0c;该字段上的数据不能重复且不能为null 注意&#xff1a;一张表必须有且只有一个主键 添加主键约束 -- 方式一(推荐) CREATE TABLE user(username VARCHAR(32) PRIMARY KEY,password VARCHAR(32),nick_name VARCHAR(3…

Java使用分布式锁来防止缓存穿透与雪崩

步骤如下&#xff1a; 1&#xff09;选择合适的分布式锁实现&#xff1a;常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。根据具体情况选择最佳方案。 2&#xff09;获取分布式锁&#xff1a;在需要进行操作时&#xff0c;首先尝试获取分布式锁。如果成功获取到&#…

C++文件系统操作2 - 跨平台实现文件夹的创建和删除

1. 关键词2. fileutil.h3. fileutil.cpp4. filesystem_win.h5. filesystem_win.cpp6. filesystem_unix.cpp7. 源码地址 1. 关键词 C 文件系统操作 创建文件夹 创建多级目录文件夹 删除文件夹 删除文件夹下的所有文件和子目录 跨平台 2. fileutil.h #pragma once#include <…

Linux中为什么etc是存放配置文件

在计算机系统中&#xff0c;/etc 是一个目录的名称&#xff0c;通常位于Unix和类Unix操作系统中&#xff0c;如Linux。这个目录用于存放系统配置文件。/etc 的命名来源于早期Unix系统中的 "etcetera"&#xff08;拉丁语 "et cetera" 的缩写&#xff0c;意为…

AI绘画Stable Diffusion超强提示词插件!一键翻译,AI帮你写提示词!

大家好&#xff0c;我是向阳。 对于AI绘画来说&#xff0c;提示词写得好坏&#xff0c;十分影响最终生成图片的结果。会写提示词的话&#xff0c;生成的图片质量就会比较高&#xff0c;不会写的话&#xff0c;结果可能就不会好。 之前大家在使用Stable Diffuison&#xff08;以…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

【linux/shell案例实战】解决Linux和Windows的换行符CRLF和LF问题

目录 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF 二.使用Linux 中命令 dos2unix 和 unix2dos 实现CRLF 和LF的转换 三.使用 windows 中的代码编辑器实现 CRLF 和 LF 的转换&#xff08;Notepad&#xff09; 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF CR是Carria…