Java学习笔记
-
Java的工作方式
它的目标是让你写一个应用程序能够在任何设备上执行。
编写源代码文件 -> 用编译器运行源代码,编译器会检查错误,如果有错误就要改正才能产生正确的输出。 -> 编译器会生产出字节码。任何支持Java的装置都能够把它转译成可执行的内容。编译后的字节码与平台无关 -> Java虚拟机(JVM)可以读取和执行字节码。 -
语法
public class FirstSample { public static void main(String[] args) { System.out.println("we will not use 'hello world!'"); } }
public
成为访问修饰符,这些修饰符用于控制程序的其他部分对这段代码的访问级别。
java
中定义类名规则很宽松:名字必须以字母开头,后面可以跟字母和数字的任意组合。
类名为大驼峰
每个Java
应用程序都必须有一个main
方法:public class ClassName { public static void main(String[] args) { //program statements } }
Java
中的的所有函数都属于某个类的方法(标准术语将其称为方法,而不是成员函数)。
Java
中每个句子必须用分号结束。
Java
使用的调用方法的通用语法:object.method(parameters)
与大多数程序语言一样,Java
中的注释也不会出现在可执行的程序中。 -
数据类型
Java
是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中一共有8种基本类型(primitive type),其中有4中整型,2中浮点类型,1中用于表示unicode编码的字符单元的字符类型char
和一种用于表示真值的boolean
类型。
注释:Java
中有一个能够表示任意精度的算术包,通常称为“大数值”(big number)。虽然被称为大数值,但它并不是一种新的Java
类型,而是一个Java
对象。
(1)整型
整型用于表示没有小数部分的数值,它允许是负数。Java
提供了4中整型
类型 | 存储需求(大小) | 取值范围 |
---|---|---|
int | 4字节 | -2^31 ~ 2^31-1 |
short | 2字节 | -2^7 ~ 2^7-1 |
long | 8字节 | -2^64 ~ 2^63-1 |
byte | 1字节 | -2^7 ~ 2^7-1 |
在Java
中,整型的范围与运行Java
代码的平台无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中不同操作系统之间进行移植给程序带来的诸多问题。由于Java
程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。
注意:Java
没有任何无符号形式的int
、log
、short
、byte
类型。
(2)浮点型
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 有效位数为6~7位 |
double | 8字节 | 有效为15位 |
(3)char
类型
char
类型原本表示单个字符。不过,现在情况已经有所变化。有些Unicode
字符可以用一个char
值描述,另外一些Unicode
字符则需要两个char
值。
(4)boolean
类型
boolean
类型有两个值:false
和true
。整型值和布尔值之间不能相互转换。
-
变量
在Java
中,每个变量都有一个类型。在声明变量时,变量的类型位于变量名之前。double salary; int vacationDays; long earthPopulation; boolean done;
-
常量
在Java
中,利用关键字final
指示常量。例如:public class Constants { public static void main(String[] args) { final double CM_PER_INCH = 2.54; double paperWidth = 8.5; double paperHeight = 11; System.out.println("Paper size in centimeters:" + paperWidth * CM_PER_INCH + "by" + paperHeight * CM_PER_INCH); } }
关键字
final
表示这个变量只能被赋值一次。一旦被赋值之后,就不能再更改了。习惯上,常量名使用全大写。 -
数学函数与常量
在Math
类中,包含了各种各样的数学函数。在编写不同类别的程序时,可能需要的函数也不同。double x = 4; double y = Math.sqrt(x); System.out.println(y);
-
强制类型转换
double
->int
double x = 9.997; int nx = (int)x;//10
如果想对浮点进行舍入运算以便得到最接近的
整数
,那就需要使用Math.round
方法:double x = 9.997; int nx = (int)Math.round(x);
-
枚举类型
枚举类型的变量只能存储这个类型声明中给定的某个值或者
null
,null
表示这个变量没有设置任何值enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }; Size s = Size.MEDIUM;
-
字符串
从概念上讲,Java字符串就是Unicode字符串序列。每个用双引号括起来的字符串都是String类的一个实例:Stirng e = "";an empty string String greeting = "hello";
(1)子串
String greenting = "hello"; String s = greeting.substring(0, 3); s.equals("hel");//true s == "hel";//false
Java
中只有字符串常量是共享的,而+或者substring
等操作产生的结果并不是共享的。
个人观点:Java
中==
用于基本类型比较的时候,是进行值比较,用于引用类型比较时是内存地址比较(判断是否是同一个对象)
(2)码点和代码单元
代码单元
是指一个char
类型的字符,码点
是只一个实际的字符(该代码单元对应的编码)。例:a
对应的代码单元
是a
,对应的码点
是97
String s = "abc 🐂"; System.out.println(s.length);//6 System.out.println(s.codePointCount());//5
(3)构建字符串
有些时候,需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。采用字符串连接的方式效率比较低。每次连接字符串时,都会构建一个新的String对象,既耗时又浪费空间。使用StringBuilder
类就可以避免这个问题的发生。StringBuilder builder = new StringBuilder(); builder.append(ch);//追加字符 builder.append(str);//追加字符串 String finalString = builder.toString();
-
输入输出
(1)输入Scanner in = new Scanner(System.in); System.out.print("What is your name?"); String name = innextLine();//整行 String name = in.next();//单词(空格为分隔符) //nextInt() 读取一个整数 nextDouble() 读取一个浮点
(2)格式化输出
转换符 | 类型 | 举例 |
---|---|---|
d | 十进制整数 | 159 |
x | 十六进制整数 | 9f |
o | 八进制整数 | 237 |
f | 定点浮点数 | 15.9 |
e | 指数浮点数 | 1.59e+01 |
g | 通用浮点数 | – |
a | 十六进制浮点数 | 0x1.ffccdp3 |
s | 字符串 | Hello |
c | 字符 | H |
b | 布尔 | True |
h | 散列码 | 42628b2 |
tx或Tx | 日期时间(T强制大写) | 已经过世,应当改为使用java.time类 |
% | 百分号 | % |
n | 与平台有关的行分隔符 | – |
可以使用静态的String.format
方法创建一个格式化的字符串:String message = String.format("hello, %s. age:%d", name, age);
打印时间:
以t开头
System.out.printf("%tc", new Date());
(3)文件输入与输出
想要对文件进行读取,就需要一个用File对象构造一个Scanner对象
Scanner in = new Scanner(Path.get("myfile.txt"), "UTF-8");
(4)大数值
如果基本的整型和浮点数精度都不能够满足需求,那么可以使用java.math
包中的两个有用的类:BigInteger
和BigDecimal
。这个两个类可以处理包含任意长度数字序列的数值。BigInteger
类实现了任意精度的整数运算,BigDecimal
实现了任意精度的浮点数运算。
使用静态方法valueOf()
方法可以将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(100);
很遗憾的是,不能使用算数运算符处理大数值。而需要使用大数值类中的add
和multiply
方法
BigInteger c = a.add(b);//c = a + c;
BigInteger d = c.multiply(b.add(Biginteger.valueOf(2)));//d = c * (b + 2);
(5)数组
int[] a = new int[100];//创建长度为100的整型数组
创建一个数字数组时,所有元素都初始化为0.boolean
数组的元素会初始化为false
。对象数组的元素则初始化为一个特殊值null
,这表示这些元素(还)为存放任何对象。
String[] names = new String[10];
创建一个包含10个字符串的数组,所有字符串都是null
。如果希望这个数组包含空串,可以为元素指定空串:
for(int i = 0; i < 10; i ++) names[i] = "";
一旦创建了数组,就不能改变它的大小(尽管可以改变每一个数组元素)。如果在运行过程中拓展数组大小,就应该使用另一种数据结构–数组列表(array list)