由于我们的字符串,是不可变的。每次都要在 字符串池里 新建和共享。这样效率很低,而且占用空间大。
我们的 Java 就开发了 可变字符串
下面的两者,都比传统的 String 类型要快很多。
① StringBuffer:JDK1.0提供的,效率低,线程安全。
它是实现开辟一个缓冲区,然后操作的时候,直接在 缓冲区里进行操作。
② StringBuilder:JDK5.0提供的,效率高,线程不安全
① 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 只是起到了一定的辅助作用。当我们 配合着 来使用的时候。方可发现 基本不会缺少什么 需要的方法。
StringBuidler和String Buffer的方法 一毛一样。它是底层 实现的源代码不同。提高了效率,降低了安全性。
但实际上在数据量不是很大的时候,也体现不出来。
大数工具类,这个工具类是非常好用的。
甚至在一些大数运算的算法题中,可以直接用这个取巧。
在面试时,我们可能会遇到HR 这样的提问。
为什么 1.0 - 0.9 = 0.09999999999999998
答:因为 用了 double 类型,表面来看,好像是精度不够导致的。但从内存的角度详细的来说,是由于 数据会存储在内存中,进而去处理和操作。当 0.9 变为二进制时。就是无限的了,根本无法得到准确的二进制。所以要用截断法。直接截取到 支持的最大精度。这样就会导致,准确的 1.0 的二进制减去了一个 不准确的 0.9 的二进制,得到了 一个更加不准确的二进制结果,然后转为 十进制输出给你。当然会是 0.09999999999999998。
那么 我们在实际开发中,如何解决这样的问题 ?
答:那我们肯定要设计一个算法了,我们都知道 四则运算 的逻辑不是很复杂,所以我们可以开辟char数组甚至是 int 数组来进行两个 运算数的各个数字。进而模拟一下四则运算得到一个最终结果即可。现如今我们也把 这样的算法 称为 大数运算。
当然了,在 JAVA 里,已经提供了这样的 类,供我们使用。那就是 BigDecimal(BigInteger)。可以很有效的解决这种问题。
建议大家 传递的原始 运算数以 字符串的形式来传递。因为 大数运算底层都是 字符串来搞的。这样才比较准确。
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));
}
}
文章浏览阅读362次。Ø 散射边界和端口边界的使用方法和技巧(波失方向和极化方向设置、S参数、反射率和透射率的计算和提取、高阶衍射通道反射投射效率的计算)Ø COMSOL WITH MATLAB 进行复杂的物理场或者集合模型的建立(如超表面波前的衍射计算)Ø COMSOL WITH MATLAB 进行复杂函数的设置(如石墨烯电导函数的设置和仿真)Ø 热电子光探测器的电磁场空间分布与FDTD材料折射率的导出(脚本计算不同金属层的吸收)Ø 利用S参数分析组并通过脚本实现金属纳米小球的吸收/散射消光与近场增强的计算。_comsol与tcad仿真能结合起来吗
文章浏览阅读1.2w次,点赞25次,收藏24次。常见的个人能力踩坑点的问题学完了,接下来我们再看看关于 "工作能力" 的一些常见问题,面对这些问题我们又该如何的应对呢?该章节将会一一解答。
文章浏览阅读765次。uni-app运行到小程序模拟器,微信开发者工具报错“ERR_CONNECTION_TIMED_OUT”_微信接口connect timed out
文章浏览阅读238次。鲲鹏弹性云服务器型号 内容精选换一换弹性云服务器(Elastic Cloud Server)是一种可随时自动获取、计算能力可弹性伸缩的云服务器,可帮助您打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率。公有云平台支持弹性云服务器在专属主机与公共资源池之间迁移,具体包括:将创建在专属主机上的弹性云服务器迁移至其他专属主机。将创建在专属主机上的弹性云服务器迁移至公共资源池,即不..._以下哪种是鲲鹏通用增强型弹性云服务器
文章浏览阅读1.6w次,点赞21次,收藏124次。前言PDF、TXT 只要资源可访问,根本就不需要进行任何处理,直接访问查看就完事了。也是因为这个PDF可以直接查看(现在浏览器基本支持了),那么我们实现Word文档在线预览,其实也是 把WORD文档 复制一份生成一份供预览的 PDF文件而已。先看看效果:正文这篇实例,实现在线预览WORD文档,分两步:一. 安装OpenOffice二.写点小代码一.安装OpenOffice不要看到安装东西就觉得麻烦,因为这个安装不需要做任何配置,你只需要..._springboot在线预览word
文章浏览阅读10w+次,点赞3.1k次,收藏2.3w次。网上看到一首诗:“代码尽头谁为峰,一见秃头道成空。编程修真路破折,一步一劫渡飞升。”感觉还挺有意境的。第一部分:Java 基础篇这个阶段就是编程入门,掌握 Java 这门编程语言的基本语法,为后面的修行之路打好基础。包括的知识点有:环境搭建——Intellij IDEA 一站式搞定Java 基础语法面向对象——封装、继承、多态数组字符串集合框架IO反射注解网络编程并发编程这方面的资源我给大家梳理下:1)针对 Intellij IDEA,GitHub 上有一份简体中文版教_java自学路线图(超全超详细)
文章浏览阅读2.8k次。小傅哥 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析、算法学习等。一、前言写这篇文章的时候我在想可能大部分程序员包括你我,常常都在忙于业务开发或奔..._asm-commonsgit下载
文章浏览阅读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
文章浏览阅读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
文章浏览阅读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软件安装在哪个目录
文章浏览阅读634次,点赞5次,收藏22次。哈工大本部2023编译系统/编译原理期末考试回忆题_哈工大编译原理期末试题
文章浏览阅读1.4k次。先看效果图再贴代码using System.Collections;using UnityEngine;using Joker.ResourceManager;using PalmPoineer.Mobile;using UnityEngine.UI;namespace Joker.Battle { public enum EOutScreenGuiderType {_unity offsreen