给大忙人看的Java核心技术笔记(1、基本的编程结构)
1、基本数据类型
整型:int(+-20亿),long,short,byte(-128~127)
Integer.MIN_VALUE,Integer.MAX_VALUE
如果long不够用可以用BigInteger
在Java中,整型的范围不依赖于程序所运行的机器。
可以给数字添加下划线使得阅读更容易,如:
int A = 100_000;
浮点类型:
现在浮点类型默认使用double,float类型有个F后缀(3.14F)。没有F后缀的浮点类型默认为double,可以使用D为后缀(3.14D)
Double.POSITIVE_INFINITY代表正无穷,Double.NEGATIVE_INFINITY代表负无穷,Double.NaN代表“非数值”。比如1.0/0.0,0.0/0.0,负数的平方根=NaN。
浮点数不适合做金融计算,会有舍入误差。
2.0-1.1 = 0.899999999999;1/10没有精确的二进制表示。应该使用BigDecimal!
char型
4A表示Unicode字符U+004A 拉丁字符J,可以写成\u004A(使用\u前缀)
\n,\r,\t,\b代表换行、回车、tab、退格。
在不同系统下换行符不同,window下是/r/n。Linux下是/n。可以使用
1 //从当前系统中获取换行符,默认是"\n" 2 String lineSeparator = System.getProperty("line.separator", "\n"); 3 4 String[] arr = fileContet.splite(lineSeparator );
布尔型
在Java中布尔型不是数字类型。布尔型与整数0和1没有关系。
2、变量
名称
变量名中符号$是专门用在自动产生的名称中,不应使用。大小写敏感,名称不能使用空格或者符号,也不能使用关键字。
尽量晚的声明变量
3、常量
关键字final表示一个值,一旦赋值就不能改变。根据习惯常量的名称使用大写字母。也可以在方法外,使用static关键字声明常量。
1 public static final int DAYS_PER_WEEK=7;//直接写在类中 2 3 final int DAYS_PER_WEEK=7;//写在类的方法里面
final变量可以延迟初始化。只要在首次使用前被初始化即可。
1 final int DAYS_IN_FEBRUARY; 2 if(leapYear){ 3 DAYS_IN_FEBRUARY = 29; 4 }else{ 5 DAYS_IN_FEBRUARY = 28; 6 }
基本运算:17/5 = 3 , 17.0/5 = 3.4.
整数除以0会抛异常,浮点数除以0返回无限值或NaN
在使用%运算的时候要注意负数的处理:
一般。避免负数用(((position+adjustment)%12)+12)%12保证结果为0~11之间的数。
【java有strictfp修饰符,保证所有浮点运算都是严格可移植的,现代处理器有的使用了超过64bit的浮点寄存器,增加速度,减少溢出风险。】
数学方法:p15
字符串比较:
用string.equals。
在java虚拟机中,每个文字串只有一个实例,因此“world” == “world”,若是字符串是计算的来的,一定不是一个对象。
比较字符串和文字串时,将文字串放在前面,防止空指针异常
if(“world”.equals(location)|| null == location)
String API:
在java中,String类是不可变的(immutable)。任何String方法都不能修改自己的字符串。会返回修改后的另一个对象!
编码点和编码单元(Unicode)
每个有效的Unicode值称为编码点。str.codePointAt(str.offsetByCodePoints(0,i));P26
读取输入
Scanner in = new Scanner(System.in); System.out.println("Input name :"); //读一行 String name = in.nextLine(); //读一个单词,空格分隔 String name = in.next(); //读整数 if(in.hasNextInt()){ int age = in.nextInt(); } //读取密码不用Scanner类,可以用Console类 Console terminal = System.console(); String userNm = terminal.readLine("User name: "); char[] pwd = terminal.readPassword(Password: ); //密码用char[]比String安全,用完后可以重写char[]!!!!!
//让System.in和System.out分别从input.txt读写入output.txt中 java mypackage.MainClass<input.txt>output.txt
格式化输出
System.out.printf()
%f,%s,%d分别为float,string,int. P29表1-5
String.formate P30表1-6 格式化输出的标记符
+ 为正数和负数打印符号
- 左对齐
, 进行分组999,999
# 加0x前缀
控制流
switch:
记得在选择分支末尾添加break,否则全部执行。
循环:
//跳出多层循环 outer: while(true){ ... while(true){ ... if(true){ break outer; ... } } } //outer是break的标签,可以是任何名字。
数组
当使用new构造数组时:
数字类型(包括char)的数组用0填充。
Boolean类型的数组用false填充。
对象数组用空引用填充。
※泛型类不能使用基本类型作为类型参数。ArrayList<int>是非法的!
每一种基本类型,都有对应的包装类:Integer、Byte、Short、Long、Character、Float、Double、Boolean。
自动装箱:基本类型和他们对应的包装类型之间的转换时自动的。
自动拆箱:
数组和数组列表的复制
将数组变量复制到另外一个数组变量,两个变量引用同一个数组。用静态方法Array.copyOf();
1 int[] copiedPrimes = Arrays.copyOf(primes,primes.length);
1 //复制数组列表 2 ArrayList<String> copiedFriends = new ArrayList<>(friends); 3 String[] names = ...; 4 ArrayList<String> friends = new ArrayList<>(Arrays.asList(names));
数组的排序
Array.sort(names);//数组排序
Collections.sort(friends);//数组列表排序
对于数组可以用parallelSort方法,分布到多个处理器进行处理。
※可变参数必须是方法的最后一个参数。
public static double max(double first,double... rest);