java核心技术阅读笔记-chapter3基础类型和操作符

1.使用BigDecimal类处理需要精确表示浮点数的场合。
2.使用final定义const常量。
final double CM_PER_INCH=2.54;
定义常量最好使用大写。

3.4.4枚举类型

enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
Size s= Size.MEDIUM;

3.5.1
整数除以0会抛出异常。浮点数除以0会得到NaN(infinite);

使用StrictMath可以得到更精确的结果。

Math.multiplyExact(1000000,3)如果溢出会抛出异常。接收int long 参数。其他方法类似。

3.5.3
类型转换
int->long int ->double 不会丢失精度
int->float long->float有可能会丢失精度

3.5.4类型转换
Math.round 可以四舍五入
boolean值无法直接转换为数,但可以利用
b?1:0

3.5.9 switch语句

String seasonName=switch(seasonCode){
  case 0 ->"Spring";
  case 1 ->"Summer";
   case 2-> "Fall";
  case 3 ->" Winter";
  default->"???";
};

case 可以是String int enum类型

case 包含多个标签

int numLetters= switch(seasonName){
  case "Spring", "Summer","Winter"->6;
  case "Fall"->4;
  default ->-1;
};

使用枚举

enum Size={SMALL,MEDIUM,LARGE<EXTRA_LARGE};
Size itemSize;
String label=switch(itemSize){
  case SMALL->"S";
  case MEDIUM->"M";
  case LARGE->"L";
  case EXTRA_LARGE->"XL";
};

注意:使用int 或String作为case必须设置default值。
如果case为null,会抛出NullPointerException;

3.5.10位操作符
^异或,~非 &与 | 或

左移,<<右移

3.6.1 substring

String greeting="Hello";
String s=greeting.substring(0,3);//Hel

第一个参数是起始位置,第二个参数是不希望获得的位置起始位置。有效位置为0,1,2。3为无效位置
子串长度是b-a。即3-0 =3

3.6.2 join方法
String all=String.join("/","S","M","L","XL");//S/M/l/XL
第一个参数是分隔符。
repeat方法
String repeated="JAVA".repeat(3);//JAVAJAVAJAVA
3.6.3 JAVA字符串是不可改变的,下面示意一个得到新字符串的小技巧

String greeting="Hello";
greeting=greeting.substring(0,3)+"p!";//Help!

3.6.4字符串相等
使用equals方法
"Hello".equals(greeting);
忽略大小写
"Hello".equalsIgnoreCase("Hello");
不要使用判断字符串相等。仅在两个字符串存在同一空间内时相等。
3.6.5空串
str.length()方法。
str==null空对象
判断串不为空且不为空对象
if(str!=null&&str.length()!=0)
这里运用了短路效应,否则会抛错。

3.6.6码点
char在Java中是UTF-16

String greeting="Hello";
int n=greeting.length();//5

获得真正的长度
int cpCount=greeting.codePointCount(0,greeting.length());
获得某位置的字符
char first=greeting.charAt(0);//'H'
char last =greeting.charAt(4);//'o'

遍历字符串,确定是否是码点

int cp= sentence.codePointAt(i);
if(Chracter.isSupplementaryCodePoint(cp))i+=2;
else i++;

反向遍历

i--;
if(Chracter.isSurrogate(setence.charAt(i))i--;
int cp=sentence.codePointAt(i);

更方便的方法
int[] codePoints=str..codePoints().toArray();

反之,把码点变为字符串
String str=new String(codePoints,0,codepPoints.length);

将单码点变为字符串

int codePoint=0x1F37A;
str=Chracter.toString(codePoint);

strip(),stripLeading(),stripTrailing()方法。
去除两端空格。首,尾。

3.6.9StringBuilder
String每次改变都会新分配内存,造成空间浪费,使用StringBuilder进行类似操作。

StringBuilder builder=new StringBuilder();
builder.append(ch);
builder.append(str);
String completedString=builder.toString();

StringBuffer类可允许多线程改变String.

3.6.10 文本块 JAVA15
使用"""开始,"""结束

String greeting="""
Hello
World
""";

3.7.1input

Scanner in = new Scanner(System.in);

System.out.print("What is your name? ");
String name = in.nextLine();

读取单词
String firstName=in.next();
读取整数

System.out.print("How old are you? ");
int age = in.nextInt();

import java.util.*;

读取密码
Console cons=System.console();
String username=con.readLine("User name: ");
char[] passwd=cons.readPassword("Password: ");//返回值是字符数组

3.7.3 文件输入输出

Scanner in =new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);

写文件
PrintWriter out = new PrintWriter("myfile.txt",StandardCharsets.UTF_8);
然后使用print,printIn,printf写文件

3.10.7多维数组

double[][] balances;
balances=new double[NYEARS][NRATES];

foreach循环。循环只遍历一维,所以两维遍历为

for(double[] row :a)
for(double value : row)
  value=1;

打印
System.out.println(Arrays.deepToString(a)));

JAVA二维数组,不同的行可以有不同长度的列。

posted @ 2024-12-08 14:49  zhongta  阅读(14)  评论(0)    收藏  举报