Java 核心技术卷1 -- 第三章Java基本程序设计结构

Github代码链接: https://github.com/deyou123/corejava.git

第三章Java基本程序设计结构

3.2注释

1、//
2、/* */
3、自动生成文档
以 / ** 开始, */结束

3.3数据类型

8种基本类型,4种整形、2种浮点型、1种Unicode的char和1种boolean

3.3.1整形

在这里插入图片描述

int:正好超过20亿
long:900万亿 星球上居住人数 70亿

3.3.2 浮点类型

在这里插入图片描述

  • 默认:double
  • 正数 / 0 = 正无穷大,负数/0 = 负无穷大
  • NaN(Not a number)
  • x == Double.NaN : false
  • Double.isNan(x): 检查x是不是一个数字
警告

浮点数值不适用于无法接受舍入误差的金融计算中。

  • System.out.println(2.0-1.1)
    得出0.8999999999999,而不是0.9。
  • 原因是浮点数值采用二进制系统表示,无法精确表示1/10。
  • 可以使用BigDecimal进行精确计算。

3.3.3char型

‘A’ : 65
转移字符
在这里插入图片描述

3.3.5boolean类型

  • 不能用0/1表示真假值
后缀

长整型数值:L(400000000000L)
float:F | f (3.14f)
double:D | d (3.14D)

前缀

十六进制:0x | 0X(0xCAFE)
八进制:0(010 =》 8)
二进制:0b | 0B (0b1001 => 9)

下划线

1_000_000
只是更易读,编译器会去掉下划线

3.4变量

  • 字母:‘A’~‘Z’, ‘a’ ~‘z’, ‘_’,’$’,或是表示字母的任何Unicode字符(Π等)
  • 数字: ‘0’~‘9’,或是任何表示数字的任何Unicode字符
  • Character.isJavaIdentifierStart()/isJavaIdentifierPart检查是否是java中的“字母”
  • 不能使用Java保留字作为变量名
  • 逐一声明每一个变量可以提高程序的可读性
3.4.1变量初始化
  • 声明一个变量后必须用赋值语句对变量进行显示初始化;不能使用未初始化的变量。
  • 变量可以在任何地方声明;变量的声明应尽可能地靠近变量第一次被使用的地方。
3.4.2常量
  • final指示常量: 只能被赋值一次。
  • 常量名全大写+下划线。
  • 类常量[public] static final:可以在一个类中的多个方法中使用,public其他类也可以使用

3.5运算符

+、-、*、/、%

  • /:
    • 整除除法:两个数都是整数
    • 浮点除法:一数是浮点
  • 整数被0除将产生一个异常;浮点数被0除将会得到无穷大或NaN结果。
3.5.1 数学函数与常量
  • Math.sqrt(x): 根号x
  • Math.pow(x,a): x的a次方
  • 三角函数:Math.sin、Math.cos、Math.tan、Math.atan、Math.atan2
  • 指数函数:Math.exp、Math.log、Math.log10
  • Π和e:Math.PI、Math.E
3.5.2数值之间的转换

在这里插入图片描述

  • 如果两个操作数有一个是double,另一个就会转换为double
  • 否则,float
  • 否则, long
  • 否则,int

3.5.2强制类型转换

  • (desired)target:圆括号中给出想要的目标类型,后面紧跟带转换的变量名。
  • 浮点-》整:
    • 截断整数部分:(int)9.997
    • Math.round,舍入运算
  • boolean: express?1:0;通常不要进行强制转换。

3.5.4结合赋值和运算符

+=、-=、*=、/=

3.5.5自增与自减

++、–

  • 要注意顺序:a++、++a。

3.5.6关系和boolean运算符

==、!=、<=、&&、||(短路)
x<y? x: y

3.5.7位运算符

&(nd)、|(or)、^(xor)、~(not)

移位操作符
<<(左移)、>>(右移,用符号填充高位)、>>>(右移,高位0填充)

3.5.8括号与运算符级别

在这里插入图片描述
在这里插入图片描述

3.5.9枚举类型

有限的集合。

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

3.6字符串

String str = "";

3.6.1字串

  • str.substring(a,b): str下标 [a,b)的字符串,length = b - a;

3.6.2拼接

  • +可以拼接字符串,String a = b + c;
  • String.join(" / ",“S”,“M”) = > “S / M”:多个字符串用定界符分割链接。

3.6.3不可变字符串

优点:编译器可以让字符串共享。
各种字符串存放在公共的存储池中,字符串变量指向存储池中相应位置;如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。

总而言之,共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。

3.6.4检测字符串是否相等

s.equal(t);
s.equalsIgnoreCase(t):不区分大小写

== 只能确定两个自负床是否放在同一个位置。+或substring操作产生的结果并不是共享的。

3.6.5空串与null

  • 空串: “”
  • null,检查null : if(str == null)
  • 检查: if(str != null && str.length() != 0)

3.6.6码点与代码单元

背景

而在设计Java时,当时的Unicode才发布1.0版本,字符连65536代码值一半都不到,为了方便后面增加,Java使用了16位的Unicode字符集。但是没想到,随着计算机的普及,各国计算机的发展,16位也放不下人类的集体文化财富。
码点是指一个编码表中的某个字符对应的代码值。Unicode的码点分为17个代码级别,第一个级别是基本的多语言级别,码点从U+0000——U+FFFF,其余的16个级别从U+10000——U+10FFFF,其中包括一些辅助字符。
基本的多语言级别,每个字符用16位表示代码单元,而辅助字符采用连续的一对连续代码单元进行编码。

  • 码点数量:字符串实际长度
    str.codePointCount(0,str.length());
  • 第i个码点:
str.codePointAt(str.offsetByCodePoints(0,i));

3.6.7String常用API

char charAt(int index):返回给定位置的代码单元。
int codePointAt(int index):返回从给定位置开始的码点。
int offsetByCodePoints(int stratIndex,int cpCount):返回从startIndex代码点开始,位移cpCount后的码点索引。
int compareTo(String other):按字典顺序,str位于other之前返回负数;位于other之后,返回整数;相等,返回0IntStream codePotin():将str的码点作为一个流返回
new String(int[]codePoints,int offset,int count):用数组中从offset开始的count个码点构造一个字符串
boolean equals(Object other);
boolean equalsIgnoreCase(String other);
boolean startsWith(String prefix);
boolean endWith(String suffix);

int indexOf(String str);
int indexOf(String str,int fromIndex);
int indexOf(int cp);
int indexOf(int cp, int fromIndex);
返回与字符串str或代码点cp匹配的第一个字串开始为自,索引从0或者fromIndex开始计算;不存在返回-1int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
int lastindexOf(int cp);
int lastindexOf(int cp,int fromIndex);
返回与字符串str 或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromlndex开始计算。
int length();
int codePointCount(int startIndex,int endIndex):返回startIndex和endIndex-1之间的代码点数量。
String replace(CharSequence oldString, CharSequence newString):返回一个新字符串,用newString代替原来字符串中所有的oldString。CharSequenceStringStringBuilder.
String substring(int beginIndex);
String substring(int beginIndex,int endIndex);
返回一个从beginIndex到串尾或endIndex-1的所有代码单元
String toLowerCase()
String toUpperCase();
String trim():删除str头部和尾部的空格
String join(CharSequence delimiter,...):返回给定定界符链接所有元素的字符串。
  • CharSequence是一个接口,所有字符串都属于这个接口

3.6.8阅读联机API文档

  • 浏览器指向JDK的 docs/api/index.html文件就可以看到API文档。

3.6.9构建字符串

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

StringBuffer:允许多线程操作。
String Builder:效率高

StringBuilder();
int length();
StringBuilder append(String str);
StringBuilder append(char c);
StringBuilder appendCodePoint(int cp);
void setCharAt(int i, char c);:将第i个代码单元设为c
StringBuilder insert(int offset, String str/char c);:在offset位置插入一个代码单元/str并返回
StringBuilder delete(int startIndex, int endIndex);:删除从startIndex到endIndex-1的代码单元。
String toString();

3.7输入输出

3.7.1输入读取

Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();//读取下一行
scanner.next();//读取一个单词,空格作为分割符
scanner.nextInt();

double nextDouble();
boolean hasNext();
boolean hasNextInt();
boolean hasNextDouble();

3.7.2格式化输出

  • System.out.printf();
    double x= 1000.0/3;
    System.out.printf("%8.2f", x);
    在这里插入图片描述
    在这里插入图片描述
  • String.format("");

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.7.3文件输入输出

后面再总结 IO流

3.8控制流程

3.8.1快作用域

  • 块是指有一对大括号括起来的若干条简单的java语句
  • 确定了变量的作用域
  • 一个块可以嵌套再另一个块中
  • 但是,不能再嵌套的两个块中声明同名变量。区别于c/c++:内层定义的变量会覆盖在外层定义的变量。

3.8.2条件语句

if(condition) statement1 [else statement2]

3.8.3循环

while(condition) statement
do statement while(condition);
for
增强 for

3.8.5switch

case标签可以是:

  • 类型为char、byte、short、int的常量表达式
  • 枚举变量
  • JavaSE7开始,还可以是String字面量。

3.8.6中断控制流程语句

  • goto作为保留字。
  • break:
    • 带标签的break:用于跳出多重嵌套循环语句,标签必须放在希望跳出最外循环之前,并且紧跟一个冒号(label:),break label;
    • 可以将标签应用到任何语句中,if,或块语句,但只能跳出语句块。
  • continue

3.9大数值

  • BigInteger
BigInteger add(BigInteger other);
BigInteger subtract(BigInteger other);
BigInteger multiply(BigInteger other);
BigInteger divide(BigInteger other);
BigInteger mod(BigInteger other);
int compareTo(BigInteger other);
static BigInteger valueOf(long x);
  • BigDecimal
BigDecimal add(BigDecimal other);
BigDecimal subtract(BigDecimal other);
BigDecimal multiply(BigDecimal other);
BigDecimal divid(BigDecimal ohter);
int compareTo(BigDecimal other);
static BigDecimal valueOf(long x)
static BigDecimal valueOf(long x,int scale);

3.10数组

int[] a;
int a[];
int[] a = new int[100];

3.10.1for each循环

  • for(variable : collection) statement
  • Arrays.toString(a)

3.10.2数组初始化和匿名数组

int[] array = {1,2,3,4,5};
new int[]{1,2,3,4,5};	//匿名数组

3.10.3数组拷贝

  • 允许将一个数组变量拷贝给另一个数组变量,这是,两个变量将引用同一个数组。
  • 拷贝值:
    int[] array1 = Arrays.copyOf(array2, length);
    多余的元素赋值为0;布尔型false;

3.10.4命令行参数

3.10.5数组排序

int[] a = new int[1000];
Arrays.sort(a);	//优化的快速排序

static String toString(type[] a):返回包含a中数据元素的字符串,类型为intlongshortcharbytebooleanfloatdouble
static type copyOf(type[] a, int length):
static type copyOfRange(type[] a,int start, int end);:返回和a类型相同的一个数组,长度为length或end-start。
static void sort(type[] a);
static int binarySearch(type[] a, type v);
static int binarySearch(type[] a, int start, int end, type v):采用二分搜索算法查找值v,成功返回下标值,否则返回一个负数。
static void fill(type[] a, type v):将a所有制设为v
static boolean equals(type[]a, type[] b):两个数组对应下标的值都相等,返回true

3.10.6多维数组

  • double[][] arrays;
  • for each循环语句不能自动处理二维数组的每一个元素,它是按照行,也就是一维数组处理的。
for(double[] row : a)
	for(double value: row)
		do something with value;
  • 快速打印二维数组:
    System.out.println(Arrays.deepToString(a));

3.10.7不规则数组

  • 交换数组的两行
double[] temp = balance[i];
balance[i] = balance[i + 1];
balance[i + 1] = temp;

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值