Java核心技术学习笔记

Java核心技术学习笔记

  • 第二章Java程序设计环境
    • 2.1安装Java开发工具包
    • 2.2使用命令行工具
    • 2.4Jsell(java9)引入
  • 第三章Java的基本程序设计结构
    • 3.1一个简单的Java应用程序
    • 3.2注释
    • 3.3数据类型
    • 变量与常量
    • 运算符
    • 字符串
    • 输入与输出
    • 控制流程
    • 大数
    • 数组

第二章Java程序设计环境

2.1安装Java开发工具包

2.1.1下载JDK
1.下载Java Development Kit(JDK)Java开发工具包
2.Java Runtime Enviornment(JRE)Java运行时环境
3.Server JRE(服务器JRE)
4.三个版本Standard edition(SE)标准版 Enterprise Edition(EE)企业版 Micro Edition(ME)微型版
2.1.2设置JDK
1.编辑用户环境变量,增加一个变量值为jdk/bin

2.2使用命令行工具

1.打开一个终端窗口
2.进入目录
3javac Welcome.java java Welcome

2.4Jsell(java9)引入

1.启动Jsell 只用键入Jsell就可以启动

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

3.1一个简单的Java应用程序

1.JAVA区分大小写
2.public 称为访问修饰符控制程序的其他部分对这段代码的访问级别
3.关键之Class表明Java程序中的全部内容都包含在类中
4.class的命名规则必须以大写字母开头,后面可以跟数字或字母任意组合,每一个单词开头都应该大写(驼峰命名法),文件的公共类必须与文件名相同(只能有一个公共类)
5.大括号括起来的为一个块,每个Java语句用分号代表结束
6.System.out.println()不传参数会打印一个空行

3.2注释

1.一行注释//从行头到行尾
2.多行注释/* */这个注释不能嵌套

3.3数据类型

1.8种数据类型,4种整形(byte,short,int,long),2种浮点型(float,double),1种用于表示一个代码单元的char,1种用于表示真假值的boolean
Java整形

类型 存储需求 取值范围
int 4个字节 -2147483648~2147483647(刚好超过20亿)
short 2个字节 -32768~32767
long 8个字节 -9223372036754775808~9223372036854775807
byte 1个字节 -127~128

2.Java因为数据类型取值范围固定所以在任何机器上运行都有相同结果
3.长整形数值有一个后缀L或l。十六进制数值有一个前缀0x或0X,八进制有一个前缀0,二进制用0b表示
4.可以在字面量下增加下划线,更容易阅读
5.如果想表示0到255的范围,也可以储存在一个byte中,只要不溢出,加法、减法和乘法都能正常计算。但对于其他运算,需要调用Byte.toUnsignedInt(b)来得到一个0到255的int,处理完在把他转回byte.

浮点类型

类型 存储需求 取值范围
float 4个字节 大约±3.40282347E+38F(有效位数为6~7位)
double 8个字节 大约±1.79769313486231570E+308

1.double表示这种类型的值精确度是float类型的两倍有人称为双精度
2.float类型的数值要加后缀f或者F,字面量本身为double类型.
3.一个正整数除以0结果为无穷大,计算0/0或者负数的平方根结果为NAN
4.Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY、Double.NAN表示三个特殊值,以及FLOAT对应的值。
5.浮点数不适用于无法接受舍入误差的计算,原因是在二进制系统中无法精确的表示分数1/10

char类型
char类型表示一个代码单元,如果为一对代码单元,则无法用char类型表示。char类型的值也可以表示为十六进制,其范围为\u0000到\uFFFF,所有转义字符都可以放在字符串或者字符常量中,\u开头的还可以出现在字符串或者字符常量外。

boolean类型
1.整形和布尔值之间不能进行互相转化

变量与常量

1.变量可以声明在代码中的任何地方。
2.从Java10开始,对于局部变量,如果可以从变量推断出它的类型就不再需要声明类型,只需要使用关键字var而无须指定类型
3.常量只能被赋值一次,就不能更改了,常量名用大写
4.变量的名字命名以字母开头并由数字,字母组成。java里的字母和数字范围很大可以用某种语言表示"字母"的Unicode字符,尽管$是一个合法的JAVA字符,但不要在你自己的代码中使用这个字符。它只用在Java编译器或其他工作生成的名字中

运算符

算术运算符
1.整除被0除会产生异常,而浮点数被0除将会得到无穷大或NAN
2.浮点型运算移植性相当困难,在默认情况下计算细节取决于Intel处理器的行为,中间结果允许扩展指数,但不允许扩展尾数(Intel芯片支持截断尾数时并不损失性能)这可能导致计算结果不一样,可以在main方法加strictfp采用严格的计算方法,但是这种方法会可能导致溢出

数字函数与常量
3.n%2 如果n为负数则表达式则为-1,floorMod()方法如果除数是负数的话,结果也会是负数
4.如果得到一个可以预测的结果比运行速度重要的话,那么久应该使用StrictMath确保所有平台得到相同的结果
5.Math的一些方法的提供使整数有更好的运算安全性,如果一个计算溢出,数字运算符只会悄悄的返回错误结果而不会提示,而Math类不抛出异常

数值类型之间的转换
6.当用一个二元运算符连接两个值时,先要转换为同一类型。如果两个操作数中有一个为double类型,则转换为double类型。否则,如果其中有一个操作数是float类型,则转换为float类型。否则,如果其中有一个操作数是long类型,则转换为long类型,否则,两个操作数都为int类型。

强制类型转换
7.在有时候需要将double转换成int,Java允许进行这种数值之间的转换,当然会丢失一些信息。这种可能损失信息的转换要通过强类型转换(cast)来完成,强类型通过截取小数点来将浮点值转换为整形。
8.如果试图将一个数值从一种类型转换成另外一种类型,而又超出了目标类型的表示范围,这将会得到一个完全不同的值,如(byte)300的值为44。
9.不要在boolean值上进行转换,如果想转换为数值可以用条件表达式b?1:0

自增与自减
10.由于自增与自减是改变变量的值,所以不能应用于数值本身。
11.有两种方式,前缀和后缀,前缀的方式先完成加1;而后缀形式会先使用变量原来的值。

关系和boolean运算符
12.&&和||运算符是按照“短路”方式来求值的:如果第一个操作数已经确定了结果,则第二个操作数就不必操作了

位运算符
&(“and”) ,|(“or”) ,^(“异或两个不相同的为1”),~(“not)”
13.&和|运算符也会得到一个布尔值,但是没有进行“短路运算”。
14.<<左移运算符右边空位补0,M< 15.>>右移运算符负数补1,正数补0 M>>n=M/2的n次方
16.>>>运算符会用0填充最高位
17.移位运算符的右操作要完成32位的运算(除非左操作数为long类型,在这种情况下需要对右操作数模64)例如1<<35的值等于1<<3或8

括号与运算符级别
浮点类型

运算符 综合性
[] .()方法调用 从左到右
! ~ ++ +(一元运算)+(一元运算) ()强制转换 new 从左到右
* / % 从左到右
+ - 从左到右
>>> >> << 从左到右
< <= > >= instance of 从左到右
== != 从左到右
& 从左到右
^ 从左到右
| 从左到右
&& 从左到右
|| 从左到右
?: 从右到左
= += -= *= /= %= &= |= ^= <<<= <<= >>= 从右到左

字符串

子串
18.用substring方法可以从一个字符串中提取子串,substring第一个参数为开始提取的位置,第二个参数为第一个不想提取的位置

字符串拼接
19.当一个字符串与一个非字符串进行拼接时,后者会转换成字符串。

不可变字符串
20.由于不能修改Java字符串的单个字符,所以Java文档中将String类对象称为是不可变的

检测字符串是否相等
21.用equals方法检测字符串是否相等,==用于检测字符串是否放在同一个位置上,只有字符串字面量是共享的,而+或substring等操作得到的字符串并不共享。

空串与null串
检测空串的方法为String.length==0
检测既不是空串也不是null串的方法为String.length!=0&&String!=null

码点与代码单元
length方法返回采用UTF-16编码表示给定的字符串所需要的代码单元的数量
charAt(n)将返回位置n的代码单元,如果某个字符需要两个代码单元则需要先用offsetByCodePoint(0,i),然后用codePointAt(码点)获取字符。

构建字符串
有些时候需要由较短的字符串构建字符串,如果用String拼接,效率会很低,这是可以用StringBuilder,每次添加内容时用append,搭建完后用toString方法变为字符串。StringBuilder有一个前世叫StringBuffer,它的效率StringBiilder低,但是允许多线程的方式添加或者删除字符。

输入与输出

1.首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串;而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题。解决办法在每一个 next()、nextDouble() 、 www.gzlij.com()、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉
2.如果想读取密码,则用console类,这个类会把密码放在一个数组中,但是不能像Scanner方便,必须每次读写一行。

格式化输出
1.System.out.println(x)将以x类型所允许的最大非0数位打印输出x
printf
1.每一个以%开始的格式说明符都用相应的参数替换,格式为%argumentindex $ flag width .conversioncharacter或者转换时间类%argumentindex $ flag width t conversioncharacter
2.可以使用String.format创建一个格式化的字符串
3.可以使用<标志,它只是前面格式化的参数再次被使用

文件输入与输出
1.如果想读取一个文件则创建一个Scanner对象,如果文件名中包含反斜杠则加一个反斜杠转义
Scanner in=new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);
现在就可以进行读取了,要写入文件则需要用PrintWriter进行写文件
2.如果Scanner传入一个带字符串的参数,则Scanner是对字符串解析
3.可以用System.getProperty(“user.dir”)查看当前目录
4.若输入不对的文件名构建对象,会抛出异常。

控制流程

块作用域
用一个大括号括起来的叫块作用域,里面包含着若干的Java代码,块可以互相嵌套,但是不能拥有相同的变量名

条件语句
if elseif()结构中,只要满足一个,其他的就不会在执行

循环语句
while 循环和do while循环的区别,while循环先进行判断,do while循环先执行一次语句块,如果条件满足继续执行

for循环,第一部分通常是对计数器进行初始化,第二,给出循环条件,第三,指定如何更新计数器,for的三个语句应该对同一个计算器进行操作,不然会循环会晦涩难懂 先初始化计数器,然后判断是否符合条件,执行代码块,对计数器进行操作

1.写循环条件时,浮点数是否相等要格外小心,因为二进制无法表示1/10
2.for循环第一部分定义计算器之后,这个计数器的变量的作用域只能到for循环的结尾

switch语句
1.从开始匹配的case开始执行,直到遇到break语句,或者执行到switch语句结束为止,若没有相匹配的case标签,而有default子句,则就执行default
2.case 标签可以是char、byte、short、int的常量表达式、枚举常量、case标签还可以是字符串字面量

break语句
1.执行带标签的break会跳到带标签的语句块句尾,标签必须放在希望跳出的最外层循环前,并且紧跟一个冒号。

continue语句
continue语句将控制转移到内层循环的首部,若带标签的continue则跳到带标签匹配的循环的首部

大数

如果基本的整数和浮点数不能满足要求,那么可以使用BigInteger和BigDecimal可以处理任何长度数字序列的数值
可以用valueOf()将普通的数字转化为大数,对于更大的数字可以用一个带参数的字符串

数组

1.数组是用来储存同一类型的集合
2.一旦创建数组,就不能更改他的长度
3.有两种初始化数组的方式int[]a=new int[100],int[]a={1,2,3,4,5}
4.匿名创建数组,这样无须创建变量,new int[]{1,2,3,4,5}
5.动态创建数组时,所有元素初始化为0,boolean初始化为false,对象类型初始化为null

foreach循环
for(variable:collection)statement用于遍历集合中的每个元素,collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象,但是需要下标值时没有for循环方便

命令行参数
运行java程序时后面可以带参数如 java Message -g cruel world,这些参数可以在main方法的 args数组中得到

多维数组
实际上java没有多维数组,多维数组可以理解为数组的数组初始化方式为int [][] magicSquare={{1,2,3,4,5},{6,7,8}};也可以用int [][]magicSquare=new int[2][3];

你可能感兴趣的:(java核心技术第二第三章笔记)