Java 常用类 03 可变字符串和BigDecimal(BigInteger)_java字符串和bigdecimal类-程序员宅基地

技术标签: java  学习笔记  后端  开发语言  

3.1 可变字符串和BigDecimal


3.1.1 可变字符串

由于我们的字符串,是不可变的。每次都要在 字符串池里 新建和共享。这样效率很低,而且占用空间大。

我们的 Java 就开发了 可变字符串

下面的两者,都比传统的 String 类型要快很多。

StringBuffer:JDK1.0提供的,效率低,线程安全。

它是实现开辟一个缓冲区,然后操作的时候,直接在 缓冲区里进行操作。

StringBuilder:JDK5.0提供的,效率高,线程不安全


3.1.2 StringBuffer

append('字符串') 追加一个字符串 toString()以字符串的形式去表示

public class StringBufferAndStringBuilder {
    
    public static void main(String[] args) {
    
        StringBuffer sb = new StringBuffer();
        sb.append("hello world");
        System.out.println(sb.toString());
        sb.append("java");
        System.out.println(sb.toString());
    }
}

在这里插入图片描述
insert(下标位置,插入的字符串) 可以在指定位置插入一个字符串。

replace(开始位置,终止位置,更新后的字符串) 可以替换指定范围的 字符串。切记是在 终止位置截止,即不包含终止位置。我们是替换了开始位置到终止位置-1的这个长度。


public class StringBufferAndStringBuilder {
    
    public static void main(String[] args) {
    
        StringBuffer sb = new StringBuffer();
        sb.append("hello world");
        System.out.println(sb.toString());
        sb.append("java");
        System.out.println(sb.toString());
        sb.insert(0,"hahahaha:");
        System.out.println(sb.toString());
        sb.replace(0,4,"四个元素");
        System.out.println(sb.toString());
    }
}

在这里插入图片描述
delete(开始位置,终止位置) 删除指定范围的字符串。

public class StringBufferAndStringBuilder {
    
    public static void main(String[] args) {
    
        StringBuffer sb = new StringBuffer();
        sb.append("hello world");
        System.out.println(sb.toString());
        sb.append("java");
        System.out.println(sb.toString());
        sb.insert(0,"hahahaha:");
        System.out.println(sb.toString());
        sb.replace(0,4,"四个元素");
        System.out.println(sb.toString());
        String string = sb.toString();
        System.out.println(string.contains("hello world"));
        System.out.println("以转换为String:"+string);
        sb.delete(0,sb.length());
        System.out.println(sb.toString());

    }
}

如果 想要有更多的方法操作字符串,实际上是不必的要的。因为 我们的 String 类才是字符串的 大类。这个 StringBuffer 只是起到了一定的辅助作用。当我们 配合着 来使用的时候。方可发现 基本不会缺少什么 需要的方法。

在这里插入图片描述


3.1.3 StringBuilder

StringBuidler和String Buffer的方法 一毛一样。它是底层 实现的源代码不同。提高了效率,降低了安全性。

但实际上在数据量不是很大的时候,也体现不出来。

在这里插入图片描述


3.2.1 BigDecimal(BigInteger)

大数工具类,这个工具类是非常好用的。
甚至在一些大数运算的算法题中,可以直接用这个取巧。

在面试时,我们可能会遇到HR 这样的提问。

为什么 1.0 - 0.9 = 0.09999999999999998

答:因为 用了 double 类型,表面来看,好像是精度不够导致的。但从内存的角度详细的来说,是由于 数据会存储在内存中,进而去处理和操作。当 0.9 变为二进制时。就是无限的了,根本无法得到准确的二进制。所以要用截断法。直接截取到 支持的最大精度。这样就会导致,准确的 1.0 的二进制减去了一个 不准确的 0.9 的二进制,得到了 一个更加不准确的二进制结果,然后转为 十进制输出给你。当然会是 0.09999999999999998。

那么 我们在实际开发中,如何解决这样的问题 ?

答:那我们肯定要设计一个算法了,我们都知道 四则运算 的逻辑不是很复杂,所以我们可以开辟char数组甚至是 int 数组来进行两个 运算数的各个数字。进而模拟一下四则运算得到一个最终结果即可。现如今我们也把 这样的算法 称为 大数运算。

当然了,在 JAVA 里,已经提供了这样的 类,供我们使用。那就是 BigDecimal(BigInteger)。可以很有效的解决这种问题。


3.2.1 BigDecimal 大浮点数运算类

建议大家 传递的原始 运算数以 字符串的形式来传递。因为 大数运算底层都是 字符串来搞的。这样才比较准确。

import java.math.BigDecimal;

public class BigDecimalDemo {
    
    public static void main(String[] args) {
    
        double d1 = 1.0;
        double d2 = 0.9;
        System.out.println(d1 - d2);

        BigDecimal bd1 = new BigDecimal("1.0");
        BigDecimal bd2 = new BigDecimal("0.9");

        System.out.println(bd1.subtract(bd2));

    }
}

在这里插入图片描述

除法的问题,当除不尽的时候。

当除不尽的时候,我们通常都要给两个参数 传参。

 bd1.divide(bd2,2,BigDecimal.ROUND_UP);

这个的意思是,我们要保留两位小数,而且还要采取 四舍五入的模式来进行。

保留几位小数后,往往结果可能和我们想的不一样。比如说 你采取了四舍五入到小数一位。那么 1.111111 这样的数字,最后的结果反而是 1.2。而不是 1.1。但可能你现在的需求 就是得到 1.1。

解决办法:也别用其它模式了,省的复杂。直接转为字符串,对字符串进行处理即可。

import java.math.BigDecimal;

public class BigDecimalDemo {
    
    public static void main(String[] args) {
    
        double d1 = 1.0;
        double d2 = 0.9;
        System.out.println(d1 - d2);

        BigDecimal bd1 = new BigDecimal("1.0");
        BigDecimal bd2 = new BigDecimal("0.9");

        System.out.println(bd1.subtract(bd2));

        System.out.println(bd1.add(bd2));
        System.out.println(bd1.multiply(bd2));
        BigDecimal bd3 = bd1.divide(bd2,2,BigDecimal.ROUND_UP);

        String retStr = bd3.toString();
        System.out.println(retStr);

        System.out.println(retStr.substring(0,retStr.length()-1));



    }
}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52606908/article/details/122385553

智能推荐

COMSOL光电、FDTD光学器件超表面、TCAD半导体器件仿真技术与应用直播学习_comsol与tcad仿真能结合起来吗-程序员宅基地

文章浏览阅读362次。Ø 散射边界和端口边界的使用方法和技巧(波失方向和极化方向设置、S参数、反射率和透射率的计算和提取、高阶衍射通道反射投射效率的计算)Ø COMSOL WITH MATLAB 进行复杂的物理场或者集合模型的建立(如超表面波前的衍射计算)Ø COMSOL WITH MATLAB 进行复杂函数的设置(如石墨烯电导函数的设置和仿真)Ø 热电子光探测器的电磁场空间分布与FDTD材料折射率的导出(脚本计算不同金属层的吸收)Ø 利用S参数分析组并通过脚本实现金属纳米小球的吸收/散射消光与近场增强的计算。_comsol与tcad仿真能结合起来吗

〖程序员的自我修养 - 精炼面试篇⑫〗- HR面试避坑指南 - 工作能力类型问题的踩坑点-程序员宅基地

文章浏览阅读1.2w次,点赞25次,收藏24次。常见的个人能力踩坑点的问题学完了,接下来我们再看看关于 "工作能力" 的一些常见问题,面对这些问题我们又该如何的应对呢?该章节将会一一解答。

uni-app运行到小程序模拟器,微信开发者工具报错“ERR_CONNECTION_TIMED_OUT”_微信接口connect timed out-程序员宅基地

文章浏览阅读765次。uni-app运行到小程序模拟器,微信开发者工具报错“ERR_CONNECTION_TIMED_OUT”_微信接口connect timed out

鲲鹏弹性云服务器型号,鲲鹏弹性云服务器型号-程序员宅基地

文章浏览阅读238次。鲲鹏弹性云服务器型号 内容精选换一换弹性云服务器(Elastic Cloud Server)是一种可随时自动获取、计算能力可弹性伸缩的云服务器,可帮助您打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率。公有云平台支持弹性云服务器在专属主机与公共资源池之间迁移,具体包括:将创建在专属主机上的弹性云服务器迁移至其他专属主机。将创建在专属主机上的弹性云服务器迁移至公共资源池,即不..._以下哪种是鲲鹏通用增强型弹性云服务器

Springboot 超简单实现在线预览,Word文档 doc、xlsx、pdf、txt等_springboot在线预览word-程序员宅基地

文章浏览阅读1.6w次,点赞21次,收藏124次。前言PDF、TXT 只要资源可访问,根本就不需要进行任何处理,直接访问查看就完事了。也是因为这个PDF可以直接查看(现在浏览器基本支持了),那么我们实现Word文档在线预览,其实也是 把WORD文档 复制一份生成一份供预览的 PDF文件而已。先看看效果:正文这篇实例,实现在线预览WORD文档,分两步:一. 安装OpenOffice二.写点小代码一.安装OpenOffice不要看到安装东西就觉得麻烦,因为这个安装不需要做任何配置,你只需要..._springboot在线预览word

史上最强 Java 学习路线图!_java自学路线图(超全超详细)-程序员宅基地

文章浏览阅读10w+次,点赞3.1k次,收藏2.3w次。网上看到一首诗:“代码尽头谁为峰,一见秃头道成空。编程修真路破折,一步一劫渡飞升。”感觉还挺有意境的。第一部分:Java 基础篇这个阶段就是编程入门,掌握 Java 这门编程语言的基本语法,为后面的修行之路打好基础。包括的知识点有:环境搭建——Intellij IDEA 一站式搞定Java 基础语法面向对象——封装、继承、多态数组字符串集合框架IO反射注解网络编程并发编程这方面的资源我给大家梳理下:1)针对 Intellij IDEA,GitHub 上有一份简体中文版教_java自学路线图(超全超详细)

随便推点

ASM字节码编程 | 如果你只写CRUD,那这种技术栈你永远碰不到!!!_asm-commonsgit下载-程序员宅基地

文章浏览阅读2.8k次。小傅哥 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析、算法学习等。一、前言写这篇文章的时候我在想可能大部分程序员包括你我,常常都在忙于业务开发或奔..._asm-commonsgit下载

微信8.0.6内测版本更新啦,这次又“炸”了(附内测地址)-程序员宅基地

文章浏览阅读2.9k次。哈喽大家好,我是程序员双木L,不定时给大家带来各种好玩且有趣的功能!iOS微信8.0.6正式版已经发布,很多安卓微信用户就吐槽:iOS都8.0.6版本了,安卓咋还一直停留在8.0.3版本呢?最近,微信团队直接跳过了安卓微信8.0.4和8.0.5,直接发布了8.0.6测试版,这下终于跟iOS版本同步了微信团队的更新说明只是说了"解决了一些已知问题",下面就让小编带领大家看看有哪些变化吧:1、新版拍一拍可以设置使用动效表情我觉得最有意思的更新是:拍一拍支持添加表情啦,只需在拍一拍后缀加入炸弹、庆祝、烟_微信8.0.6

小程序swiper组件的bindchange方法重复执行问题(解决真机无限滑动问题)_swiper bindchange-程序员宅基地

文章浏览阅读1k次。修正方法<swiperautoplay="{{autoplay}}"interval="{{interval}}"duration="{{duration}}"bindchange="swiperChange"current="{{current}}">swiperChange(e){ let current = e.detail.current; let source = e.detail.source //console.log(source); _swiper bindchange

Linux软件安装到哪个目录_linux软件安装在哪个目录-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏62次。软件安装:usr:系统级目录。可理解为C:Windows/,usr/lib:可理解为C:Windows/System32。usr/loc:用户级的程序目录。可理解为C:/Progrem Files/。用户自己编译的软件默认安装到这里。/opt:用户级的程序目录,可理解为D:/Software,opt用于放置第三方大型软件,当不需要时,直接rm-f即可。当硬盘容量不够时,也可将opt单独挂载到其他磁盘上使用。源码:usr/src:系统级源码目录。usr/local/src:用户级源码目录。常用目录及_linux软件安装在哪个目录

哈工大本部2023编译系统、编译原理期末试题回忆版_哈工大编译原理期末试题-程序员宅基地

文章浏览阅读634次,点赞5次,收藏22次。哈工大本部2023编译系统/编译原理期末考试回忆题_哈工大编译原理期末试题

Unity实现脱屏提示_unity offsreen-程序员宅基地

文章浏览阅读1.4k次。先看效果图再贴代码using System.Collections;using UnityEngine;using Joker.ResourceManager;using PalmPoineer.Mobile;using UnityEngine.UI;namespace Joker.Battle { public enum EOutScreenGuiderType {_unity offsreen

推荐文章

热门文章

相关标签