首页 > 编程知识 正文

空字符串转bigdecimal,bigdecimal最大范围

时间:2023-05-03 06:35:45 阅读:39678 作者:993

String、stringbufferandstringbuilderstring有11种结构方法

1. 可变性

从String不变量StringBuffer和StringBuilder变量Java 9开始,String类的实现改为使用byte数组来存储字符串,并使用coder来标识正在使用的编码。

publicfinalclassstringimplementsjava.io.serializable,ComparableString, char sequence {/* * thevalueisusedforcharacterstring/* * theidentifieroftheencodingusedtoencodethebytesin { @ code value } . } value数组被声明为final。 也就是说,value数组初始化后,不能引用其他数组。 另外,由于在String内部没有变更value数组的方法,所以可以保证String不变。

2. 线程安全

因为String是不变的,所以作为线程安全的StringBuilder不是线程安全的,StringBuffer是线程安全的,并且在内部使用同步进行同步的String Pool字符串常量池StringBuffer 中存储了所有字符串文字字符串,还可以使用String的intern ()方法在运行时将字符串添加到String Pool中。

字符串为intern ) )方法时,如果String Pool中已有字符串与其字符串的值相等(使用equals )方法确定),则返回对String Pool中字符串的引用。 否则,会将新字符串添加到String Pool中,并返回对该新字符串的引用。

在以下示例中,s1和s2使用new String (),s3和s4使用s1.intern )检索相同的字符串引用。 intern () )首先将s1引用的字符串放入String Pool中,并返回该字符串引用。 因此,s3和s4引用相同的字符串。

stringS1=newstring(AAA ); stringS2=newstring(AAA ); system.out.println(S1==S2; //falseString s3=s1.intern (; String s4=s1.intern (; system.out.println(S3==S4 ); //true如果以字面量“BBB”的形式创建字符串,字符串将自动包含在字符串池中。

String s5='bbb '; String s6='bbb '; system.out.println(S5==S6 ); //trueJava7之前,String Pool位于运行时常量池中。 这是永久的一代。 在Java 7中,String Pool移动到堆中。 这是因为永久层代的空间有限,在大量使用字符串的场景中会出现内存输出错误。

newstring(「abc " )使用此方法时,只有在String Pool中还没有" ABC "字符串对象时,才会创建两个字符串对象。

由于" abc "是字符串文字,因此在编译时在字符串池中创建字符串对象,并指向该" abc "字符串文字; 使用new时,将在堆中创建字符串对象。 在main方法中使用此方法创建用于创建字符串对象的测试类。

publicclassnewstringtest { publicstaticvoidmain (string [ ] args ) strings=newstring('ABC ' ); 使用javap -verbose进行反向编译时,如下所示:

//constant pool 3360//. #2=class # 18//Java/lang/string #3=string # 19//ABC//. # 18=utf8 Java/lava DDD

ng/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=2, args_size=1 0: new #2 // class java/lang/String 3: dup 4: ldc #3 // String abc 6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V 9: astore_1// ...

在 Constant Pool 中,#19 存储这字符串字面量 “abc”,#3 是 String Pool 的字符串对象,它指向 #19 这个字符串字面量。在 main 方法中,0: 行使用 new #2 在堆中创建一个字符串对象,并且使用 ldc #3 将 String Pool 中的字符串对象作为 String 构造函数的参数。

以下是 String 构造函数的源码,可以看到,在将一个字符串对象作为另一个字符串对象的构造函数参数时,并不会完全复制 value 数组内容,而是都会指向同一个 value 数组。

public String(String original) { this.value = original.value; this.hash = original.hash;} BigDecimal

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

BigDecimal一共有4个构造方法:

BigDecimal(int) 创建一个具有参数所指定整数值的对象。

BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)

BigDecimal(long) 创建一个具有参数所指定长整数值的对象。

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象

这里不建议采用第二种,原因:

1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入 newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1,但是它实际上等于0.1000000000000000055511151。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法 。

BigDecimal a = new BigDecimal("2.3");

当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf,如下:

BigDecimal a = new BigDecimal.valueOf(Double.toString(2.3));

对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法

public BigDecimal add(BigDecimal value); //加法public BigDecimal subtract(BigDecimal value); //减法 public BigDecimal multiply(BigDecimal value); //乘法public BigDecimal divide(BigDecimal value); //除法 总结: 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。尽量使用参数类型为String的构造函数。BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

来源: https://maliaoblog.cn/2020/0916/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。