JAVA 基础学习注意知识点

1、精确计算
(1)strictfp关键字

**

可移植性是Java语言的设计目标之一。无论在哪个虚拟机上运行,同一运算应该得到同样的结果。对于浮点数的算术运算,实现这样的可移植性是相当困难的。double类型使用64位存储一个数值,而有些处理器则使用80位浮点寄存器。这些寄存器增加了中间过程的计算精度。例如,以下运算:
double w=x * y / z; 很多Intel处理器计算x*y,并且将结果存储在80位的寄存器中,再除以z并将
结果截断为64位。这样可以得到一个更加精确的计算结果,并且还能够避免产生指数溢出。但是,这个结果可能与始终使用64位计算的结果不一样。因此,Java
虚拟机的最初规范规定所有的中间计算都必须进行截断。这种做法遭到了数字社区的反对。截断计算不仅可能导致溢出,而且由于截断操作需要消耗时间,所以在计算速度上实际上要比精确计算慢。为此,Java
程序设计语言承认了最优性能与理想的可再生性之间存在的冲突,并给予了改进。在默认情况下,现在虚拟机设计者允许对中间计算结果采用扩展的精度。但是,对于使用strictfp
关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。 例如,可以把main方法标记为 public static strictfp
void main(String[] args)那么,main方
法中的所有指令都将使用严格的浮点计算。如果将一个类标记为strictfp,这个类中的所有方法都要使用严格的浮点计算。具体的计算细节取决于Intel
处理器的行为。在默认情况下,中间结果允许使用扩展的指数,但不允许使用扩展的尾数(Intel芯片支持截断尾数时并不损失性能)。因此,这两种方式的区别仅仅是采用默认方式不会产生溢出,而采用严格的计算有可能产生溢出。如果没有仔细阅读这个注释,也没有什么关系。对大多数程序来说,浮点溢出不属于大问题。在本书中,将不使用strictfp关键字。

  1. strictfp关键字加在某 class 前,则表示这个类中的所有方法都要使用严格的浮点计算。
  2. strictfp关键字加在main方法前,则表示main方法中的所有指令都将使用严格的浮点计算。
  3. 具体的计算细节取决于Intel处理器的行为。在默认情况下,中间结果允许使用扩展的指数,但不允许使用扩展的尾数(Intel芯片支持截断尾数时并不损失性能)。因此,这两种方式的区别仅仅是采用默认方式不会产生溢出,而采用严格的计算有可能产生溢出。
(2)计算溢出,运算符返回错误不提示错误

Math 类提供了一些方法使整数有更好的运算安全性。如果一个计算溢出,数学运算符只是悄悄地返回错误的结果而不做任何提醒。例如,10 亿乘以3 (100000000 * 3)的计算结果将是-1294967296,
因为最大的int值也只是刚刚超过20亿。不过,如果调用Math.
multiplyExact(1000000000,3),就会生成一个异常。你可以捕获这个异常或者让程序终止,而不是允许它给出一个错误的结果然后悄无声息地继续运行。另外还有一些方法(addExact、subtractExact、
incrementExact、 decrementExact 和negateExact)也可以正确地处理int和long参数。

2、数值类型转换
(1)精度损失关系

在这里插入图片描述

  • 实线为无信息丢失的转换,虚线表示可能有精度损失的转换。
(2)强制转换

警告: 如果试图将一个数值从一种类型 强制转换为另一 种类型,而又超出了目标类型 的表示范围,结果就会截断成一个完全不同的值。例如,(byte) 300的实际值为44。
不要在boolean类型与任何数值类型之间进行强制类型转换, 这样可以防止
发生一些常见的错误。只有极少数的情况才需要将布尔类型转换为数值类型,这时可 以使用条件表达式b? 1:0。

(3)运算符在 运算中发生强制转换情况

如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。例如,如果x是一个int, 则以下语句
x +=3.5;
是合法的,将把x设置为(int)(x+3.5)。

3、字符串(不可变)

java中的字符串当定义后,储存中间中的字符串是不可变的。(当需要由较短的字符串构建字符串。每次拼接字符串是,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类可以避免这个问题。

当字符串量值存储为“”空时,字符串是由长度为0的。而null则没有。
当在null值上调用方法时,会出现错误。所以判断字符串是否为null值时,需用 == 或 != 运算符判断。

案例


//构建一个空的字符串构建起:
StringBuilder builder = new StringBuilder();

//当每次需要添加一部分内容时,就调用append方法。
builder.append(ch) //参数为字符串

//在字符串构建完成时调用toString方法,
//即可得到一个String对象,其中包含了构建中的字符串序列。
String completedString = builder.toString();

(1)常用方法 / 函数
1、字符串提取方法

substring方法的第二个参数是不想复制的第一个位置。 这里要复制位置为0、1和2 (从 0到2,包括0和2)的字符。在substring中从0开始计数,直到3为止,但不包含3。substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a, b)的长度 为b-a。例如,子串"Hel" 的长度为3-0=3。


String greeting = "Hello";
String s = greeting.substring(0,3); //返回值为:Hel

2、指定定界符分割的 拼接方法

如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态join 方法:


String all = String.join(" / ", "S", "M", "L", "XL");
//返回字符串为:"S/M/L/XL"


3、指定字符串重复拼接方法(Java11开始提供!)

在Java11中,还提供了一个repeat方法:


String repeated = "Java" .repeat(3); 
//返回字符串为:"JavaJavaJava"


4、判断俩个字符串是否相等区分大小写(不能用 == 判断,当str变量存储 null 值时可用 str != null 判断)原因见下方详细讲解。

s 变量和 t 变量都可直接为字符串

1、一定不要使用 == 运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否存放在同一个位置上。当然,如果字符串在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串副本放置在不同的位置上。
2、如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串字面量是共享的,而+或substring等操作得到的字符串并不共享。因此,千万不要使用 == 运算符测试字符串的相等性,以免在程序中出现这种最糟糕的bug,看起来这种bug就像随机产生的间歇性错误。
3、当str变量存储 null 值时可用 str != null 判断


String s = "Jsava"
String t = "helo"
s.equals(t);
//返回值为:true 或 false

5、判断俩个字符串是否相等,不区分大小写(同4)

s 变量和 t 变量都可直接为字符串

1、一定不要使用 == 运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否存放在同一个位置上。当然,如果字符串在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串副本放置在不同的位置上。
2、如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串字面量是共享的,而+或substring等操作得到的字符串并不共享。因此,千万不要使用 == 运算符测试字符串的相等性,以免在程序中出现这种最糟糕的bug,看起来这种bug就像随机产生的间歇性错误。
3、当str变量存储 null 值时可用 str != null 判断


String s = "Jsava"
String t = "helo"
s.equalsIgnoreCase(t);
//返回值为:true 或 false

6、获取字符串“实际长度” ,即Unicode/码点数量

返回 参数一 和 参数而-1 之间的码点个数


String s = "Jsava"
String t = "helo"
int n = s.codePointCount(0,s.length());
//返回值为:数值

7、获取指定下标字符

String t = "helo"
int n = s.charAt(0);
//返回值为:“h”

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值