0 前言
接下来的两个月内,将会review下Java的核心技术,虽然大概的东西都已经学习过了,但是做过一遍加深下印像也是不错的,参照的书籍为《Java核心卷》
一、一个简单的Java应用程序
public class hello {
public static void main(String[] args) {
System.out.println("hello lei");
}
}
这段程序是入门java敲的第一行代码。
包括修饰符public,类型class,类名hello。
标准的类名为:以大写字母开头的名词,并且驼峰。
为什么是String数组? String作为java中最万能的包装类具有普遍性。天地万物都可以解释成String,String也可以解析成天地万物,所以用String来存放参数自然是最优选择。
二、注释
注释信息,在编译过程中会被干掉,不会被JVM解释执行
分类:
- 单行注释: //注释文字
- 多行注释: /* 注释文字 */
- 文档注释: /** 注释文字 */
三、数据类型
java 是一种强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。一共有8中基本类型,其中4种整型、2种浮点型、1种字符类型char、1种boolean。
3.1 整型
整型用于表示没有小数部分的数值,它允许是负数。
| 类型 | 存储需求 | 取值范围 |
|---|---|---|
| byte | 1字节 | -128~127 |
| short | 2字节 | -2^15~2^15-1 |
| int | 4字节 | -2^31~2^31-1 |
| Long | 8字节 | -2^63~2^63-1 |
总结:
- 整型的范围与运行Java代码无关。,这就解决了软件的移植性问题。
- 整型可以用二进制、八进制、十进制、十六进制表示。
3.2 浮点类型
浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型。
| 类型 | 存储需求 | 取值范围 |
|---|---|---|
| float | 4字节 | -3.403E38~3.403E38 |
| double | 8字节 | -1.798E308~1.798E308 |
总结:
- double的数值精度是float类型的两倍,绝大部分应用程序采用double类型。
- 浮点数值不适用于无法接受舍入误差的金融计算中,因此,金融中表示不允许有任何舍入误差时,就应该使用BigDeciaml类。
3.3 char类型
char 类型原本用于表示单个字符,不过,现在unicode字符可以用一个char值描述。我们强烈建议不要在程序中使用char类型。
3.4 boolean 类型
boolean 类型有两个值:false 和true,用来判定逻辑条件。
四、变量
每个变量都有一个类型,在声明变量的时候,变量类型位于变量名之前。
4.1 变量初始化
声明一个变量之后,必须用赋值语句对变量进行显示初始化,千万不要使用未初始化的变量。
规范: 变量的声明尽可能的靠近变量第一次使用的地方,这是一种良好的书写形式。
4.2 常量
- java 中利用关键字 final 指示常量,保留字const不会使用。
- 关键字final表示这个变量只能被赋值一次,一旦被赋值之后就不能更改了。
- 习惯上,常量名使用全大写。
五、运算符
算数运算符 + - * % /
注意:整数除0 会产生一个异常,而浮点数除0 会得到无穷大
5.1 数学函数与常量
数学方法,使用Math类。例如Math.PI 、Math.sin
5.2 数值类型之间的转换
当两个数值进行二元操作时,先要将两个操作数转换为同一种类型,然后再进行计算。
- 如果两个操作数中有一个double类型,另一个操作数就会转换为double类型。
- 如果其中一个操作数是float类型,另一个操作数将会转为float类型
- 如果其中一个操作数是long类型,另一个操作数就会转为long
- 否则,两个操作数都会被转为int类型
面试题:
byte b1 =3, b2=4, b;
1. b= b1+ b2 ;
2. b = 3+4;
在上个面试题中,哪个会编译错误?
解析:b=b+1 会错误,byte变量运算先变成int,再计算,因为他们最终是要转向int类型,而int类型的值不能赋值给byte类型的b。而b=3+4;3和是是常量虽然是int类型,但是java有常量类型优化机制可以直接识别为byte;两个常量相加,编译器先计算常量数值,然后判断是否满足类型范围,再赋值。
5.3 强制类型转换
java 运行数值类型进行强制转换,例如:
double x=9.9;
int nx=(int)x ;
这样,变量nx的值为9,造成了信息丢失!!!
原理:强制类型转换通过截断小数部分将浮点值转换为整型。
如果想对浮点数进行舍入运算,以便取得最接近的证书,就可以使用下面这种方式:
double x=9.9;
int nx=(int)Math.round(x);
【注意】:如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会变成一个完全不同的值,例如 (byte) 300 的实际值为44
byte by = 300
十进制300的二进制为:1 0010 1100
300超出了byte的取值范围。
byte一个字节,占八位,取后八位 0010 1100
0010 1100符号位为0,正数。正数的原码反码补码都是它本身。
所以为 00101100=32+8+4=44
5.4 赋值与运算符
例如:
x+=4;
x*=2;
如果类型与左侧的操作数的类型不同,就会发生强制转换。
int x=3;
x+3.5; ==== 将把x设置为(int)(x+3.5)
5.5 自增与自减运算符
++ ,-- 是数值变量的操作,常量是不行的。
5.6 关系和boolean 运算符
Java 包含丰富的关系运算符。要检测相等性,可以使用两个等号== 或者 !=
5.7 位运算符
1.与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。
public class data13
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 与的结果是:"+(a&b));
}
}
运行结果 a 和b 与的结果是:128
下面分析这个程序:
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。
2.或运算符
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。
public class data14
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 或的结果是:"+(a|b));
}
}
运行结果 a 和b 或的结果是:129
下面分析这个程序段:
a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。
3.非运算符
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。
public class data15
{
public static void main(String[] args)
{
int a=2;
System.out.println("a 非的结果是:"+(~a));
}
}
4.异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个简单的例子。
public class data16
{
public static void main(String[] args)
{
int a=15;
int b=2;
System.out.println("a 与 b 异或的结果是:"+(a^b));
}
}
运行结果 a 与 b 异或的结果是:13
分析上面的程序段:a 的值是15,转换成二进制为1111,而b 的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即13。
六、字符串
Java 字符串就是Unicode字符序列
6.1 子串
String 类的substring 方法可以从一个和较大的字符串提取一个子串。
String greeting = “hello”;
String s =greeting.substring(0,3);
6.2 拼接
拼接可以通过 + 号了暗藏,对于多个字符串,用定界符分割:
String all = String.join("/","s","M","L");
all is "s/m/l"
6.3 不可变字符串
String类 没有提供用于修改字符串的方法。
6.4 检测字符串是否相等
可以使用equals 方法检测两个字符串是否相等。
一定不要使用== 运算符检测两个字符串是否相等。这个字符串只能够确定两个字符串是否放置在同一个位置上,当然,如果字符串防止在同一个位置上,它们必然相等,但是完全有可能将内容相同的多个字符串拷贝到不同的位置上。
6.5 空串和NUll 串
空串是“” 长度为0的字符串。可以调用以下代码检查一个字符串是否为空:
if(str.length()==0)
或
if(str.equals(""))
空串是一个Java对象,有自己的串长度 和内容。
要检查一个字符串是否为null,则
if(str==null)
要检查一个字符串既不是null也不是空串
if(str!=null && str.length()!=0)
6.6 构建字符串
有些时候,需要由较短的字符串构建字符串,采用字符串连接的方式达到此目的的效率比较低。都会构建一个String对象,即耗时又浪费时间。使用StringBuilder就可以避免这个问题。StringBuilder是线程安全的,效率低;StringBuffer是线程不安全的,效率高点。
7、输入输出
7.1 读取输入
通过控制台输入,首先要创建一个Scanner对象,并与“biaozhun ”
Scanner in = new Scanner(System.in);
String name = in.nextLine();
7.2 格式化输出
与c一样,有专门的格式化输出。
7.3 文件的输入与输出
Scanner in = new Scanner(Paths.get("myfile.txt"),"utf-8");
8、控制流程
控制语句,常见的有条件、循环、多重选择switch和中断。
switch 语句将从与选项值相匹配的case标签除开始执行直到遇到break语句,或者执行switch语句的结束处为止。如果没有匹配的case标签,而有default子句,就执行这个子句。
case 标签为char、byte、short、或int的常量表达式、枚举变量、字符串常量。
九、大数值
java.math 包中的两个很有用的类:BigInteger 和BigDecimal。 这两个类可以处理包含任意长度数字序列的数值,BigInteger 类实现了任意精度的整数运算、BigDecimal实现了任意精度的浮点数运算。
使用静态的valueof 方法可以将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOF(100);
//使用加减
BigInteger c =a.add(b);
BigInteger d =c.multiply(b.add(BigInteger.valueOf(2))) d=c*(b+2)
十、数组
数组是一种数据结构,用来存储同一类型值的集合。声明数组格式:
int [] a;
声明之后,还需要初始化才可以使用。
int a=new int[100];
10.1 forEach 循环
也就是增强for循环,能够遍历数组的每个元素,而不需要下标值
for(int element:a){
}
10.2 数组初始化以及匿名数组
在java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式
int [] a={1,2,3,4,5,6}
new int[] {1,2,3,4}
10.3 数组拷贝
java 允许将一个数组变量拷贝给另一个数组变量。也就两个变量将引用同一个数组:
int [] a=b;
如果希望所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法
int copya =Arrays.copyOf(a,a.length)