1.1 基本类型
整型(int 4, long 8, short 2, byte 1)、浮点(float 4, double 8)、布尔(boolean 1)、char型(char 1)
- int整形最大/小数:Integer.MAX_VALUE 和 Integer.MIN_VALUE,其他几个整形类似。
- Double.POSITIVE_INFINITY 代表正无穷(1.0 / 0.0), Double.NEGATIVE_INFINITY 代表负无穷,Double.NaN 代表非数值(0.0 / 0.0 或者负数的平方根)
所有的非数值都认为是彼此不相同的,因此无法使用 if( x == Double.NaN) 来检查 x 是否为非数值,正确的方法为:Double.isNaN(x)。同理还有检测是否为正无穷的。
由于舍入误差(计算机以2进制存储数字),浮点数不适用于做金融计算,需要使用 BigDecimal 类 - char 型描述了java使用的UTF-16编码中的编码单元,转义"’" --> “’”,转义 “” --> “\”
- java 中布尔型和数字没有任何关系!
1.2 变量 - 变量名由数字、字母、_、$组成,需要注意的是,字母和数字指的是任何字母表上的任何字母,不仅仅只是拉丁字母,因此 π 也是合法名称。
- final 一旦被赋值就无法改变(需要说明的是,当final修饰对象的引用时,只是声明改引用永不改变,但改变对象自身完全是合法的)。看下面的代码:
/**
- 这是合法的,它只是在首次被使用之前被初始化了一次
*/
public static void main(String[] args) {
final int a;
if (args.length > 0){
a = 10;
} else {
a = 11;
}
}
- java 不允许 int a=b=1; 这样的初始化,报变量b不存在异常。
1.3 算数操作 -
-
- × / % = == != () [] . ++ – 等
-
- 少数右结合性操作符:~ ! ++ – +(一元操作符) -(一元操作符) ()(case转换) new = 以及所有的 /= */ 同类型的。[ (j -= i += k) --> j -= (i += k) ]
- 数学方法
public void func_math(){
Math.pow(2,3); // 2 的 3 次方
Math.random(); // 产生 [0,1)之间的随机数
Math.min(2,4); // 返回2 – 返回两数之间最小的
Math.max(3,4); // 返回两数之间最大的
double x = Math.PI; // x = 圆周率
Math.multiplyExact(1000000000, 3); // 严格计算,当溢出时抛出异常,同样还有其他Exact结尾的方法,只能用于int或者long计算
System.out.println(1000000000*4); // 将产生溢出,产生我们并不需要的值
} - 类型之间的转换
强转换会导致结尾,要想取得四舍五入的效果,需要使用 Math.round() 方法
数字类型的转换,当类型不同时,会将其中较小类型的转换为较大类型 - 关系和逻辑操作符
- 短路现象 && 与 ||:只要得出总的表达式为真,后面那个表达式就不会在被执行
- 位操作符:(0xF:0000 0000 0000 1111)
& 按位与 -> n & 0xF:只取 n 最后4位
| 按位或 -> n | 0xF:将 n 最后4位置1
~ 取反 -> 相当于!,按位取反
^
<< 左移,多出的位数用0补全右移
- 大数:BigInteger 对象代表了任意长度的整数,封装任意进度的整数运算,BigDicimal 是对浮点型的同样实现
public void func_big(){
BigInteger big1 = BigInteger.valueOf(1111111111111111111L);// BigInteger.valueof()将long型转换为BigInteger
BigInteger big2 = new BigInteger(“11111111111111111111111111111”); // 使用字符串初始化
// java 不允许对象使用操作符,因此操作大数时必须调用方法
BigInteger n = null;
n = big1.multiply(BigInteger.valueOf(12)); // n = 1…1 * 12
BigDecimal big02 = BigDecimal.valueOf(2, 0); // 2 * 10^0
}
1.4 字符串
public void func_string(){
String names = String.join(",",“张三”,“李四”,“王五”);// names = “张三,李四,王五”
// 当要多次进行字符串拼接操作时,使用StringBuilder以节省资源(因为String的’+'操作会创建一个新的String对象)
StringBuilder sb = new StringBuilder();
sb.append(names);
// 字符串分割
String word = “hello world”;
String str01 = word.substring(6, 11);
System.out.println(“分割后的字符串:” + str01);// substring(x,y) 取的是原字符串的[x,y),由于String又是从0开始计算的,所以新字符串的长度刚好是 y-x
// 测试是否相等
String str02 = null;
if ("".equals(str02) && “”.equalsIgnoreCase(str02)){
System.out.println(“相等”);
} else {
// == 和 != 比较的是对象在内存中的位置,位置相同(即哈希码相同),那么结果为true,因此要比较String是否相同应当使用equals(),
// 值得说明的是,将要比较的字符串写在前面,防止字符串为空时抛出异常
System.out.println(“不相等”);
}
String first = “abc”;
String second = “efg”;
first.compareTo(second);// 当first在字典中排在secound前面时将返回负数(理解为 first-secound < 0),相等返回0
// 其他 API
first.startsWith("a"); // 是否以某个字符串开头,类似的:endWith(String str),contains(CharSequence str);
first.indexOf("a"); // a 第一次出现的下标,类似的:lastIndexOf(String str),indexOf(String str, int fromIndex),lastIndexOf(String str, int fromIndex)
first.replace("abc","efg"); // replace(CharSequence oldStr, CharSequence newStr) 将所有的oldStr换为newStr
first.trim(); // 删掉前后空白
}
1.5 输入输出
System.in 只有一个读取单个字节的方法,因此要读取字符串和数字,必须构造一个依赖于System.in的Scanner对象
public void func_io(){
Scanner in = new Scanner(System.in);
while (in.hasNextLine()){ // hasNextLine() 判断当前光标后时候还有行,且此时会进入输入状态
String newLine = in.nextLine(); // 键盘中以回车作为一行的结束,nextLine会将回车前的输入作为一行
if ("".equals(newLine)){
System.out.println(“输入结束”);
break;
}
String word = in.next(); // 读取一个单词,单词以空格分开
int i1 = in.nextInt(); // 读取一个单词,并转换为 int,此外还有转换为 double。
}
// 读取密码时
Console console = System.console();
String username = console.readLine(“请输入用户名”);
char[] password = console.readPassword(“密码:”);
}
1.6 循环与分支
- 执行for循环,先执行初始化操作,在进行判断,判断为TRUE则执行。
- switch
- default 可以放在任何位置,当没有匹配的时候执行
- 遇到break或者到达末尾结束
- 遇到匹配值开始执行
1.7 数组和列表
public void func_array(){
// 1. 数组的创建[以下都带上列表]
int[] arr01 = new int[5]; // 使用new创建的数组,int默认填充0,boolean默认填充false,对象默认填充null
int[] arr02 = new int[]{1,2,3}; // 在创建的同时初始化,此时[]中不能填写数组的长度
int[] arr03 = {1,2,3}; // 上述形式的简写
ArrayList list01 = new ArrayList<>();
// 2. 复制
int[] arr11 = Arrays.copyOf(arr01, arr01.length); // 使用copyof()复制数组,
ArrayList list02 = new ArrayList(list01); // 用另一个列表初始化一个列表,相当于复制
/**
-
- Array 和 ArrayList 的转换:
- 基本类型数组与ArrayList的转换:不能直接转换,必须借助显示循环或者流
- 对象类型数组与ArrayList的转换:使用 toArray(T[] t)
*/
ArrayList list11 = new ArrayList(Arrays.asList(“张三”,“李四”)); // asList()中参数也可以填数组
String[] arr12 = new String[list11.size()];
list11.toArray(arr12);
}