0. 前言说明
- 关于Java程序设计环境配置主要包括:
(1)Oracle官网下载JDK;
(2)下载好之后点击安装;
(3)安装好之后配置环境变量;
(4)在终端输入 java -version确认是否安装成功;
(5)jetbrains下载IDEA集成开发环境,使用学生邮箱获取注册码或者其他破解手段;
(6)愉快的coding,compiling,debugging! - 关于Java程序基础语法的学习建议
(1)首先熟悉所有基本的语法结构;
(2)熟悉Java中常用的一些封装类,如集合类、IO类等;
(3)Leetcode上进行编程练习,不仅仅追求AC,还要学习讨论区里面高效简洁的写法,然后不断重构自己的代码或优化算法,目标是让自己的程序超越100%的提交用户。刷题网站有很多推荐LeetCode是因为在你刷题的过程中一遍掌握了Java语言的基础用法,另外一方面也为找工作时的算法面试部分做准备,面试基本所有的题目都是上面的原题或者变形。(算法在面试中真的很重要,面试官不仅看你思考解题的过程,还要看你的程序是否正确,还要看你的代码是否简洁易于维护,规范等等)
(4)如果你能按照每次的代码都优化到超越100%用户的话,慢慢积累,面试肯定小菜一碟。另外在刷题的过程中可以把自己解题的过程写成博客进行分享。一方面让学习留下印记,以便后期复习;另外一方面写博客的过程也是加深印象和思考的过程;如果博客质量比较高到时候写在简历上也会是不错的加分项。
(5)如果要学习一门语言越早越好,大一就可以着手,推荐先从C语言学起,因为C很纯净,很多功能(例如:队列,栈等)都需要自己手动去实现对自己的代码能力会有帮助。目前市场最认可的语言分别是服务端的C++/Java/Shell,算法的Python,高并发的Go。
(6)当掌握了基础语法之后,就可以在GitHub上找一些相关的开源项目进行高级用法的学习,项目选择由简单到难。 - 本文主要内容
- 简单的Java应用程序
- 注释
- 数据类型
- 变量
- 运算符
- 字符串
- 输入输出
- 控制流程
- 大数值
- 数组
1. 简单的Java应用程序
import java.util.*;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
这段代码在控制台将会输出 Hello World!,虽然简单但是有很多需要注意的地方,下面一一阐述。
- 编程规范:类型首字母大写,方法名首字母小写,采用驼峰(除第一个单词外后面单词首字母大写)方式进行变量命名,大括号风格这个可以按照相应的规范;
- Java是区分大小写的,所以main和Main是不一样的;
- 一个Java文件中保留一个公共类;
- 程序要有main函数入口,并且需要用public和static修饰;(关于权限和关键字将在后面讲解,本章只关注基础语法);
- 可以使用javac file.java 生产对应的字节码文件,然后执行java file即可获得结果;
- (.)号用来调用方法,println输出后面会加换行,print不加换行;
2. 注释
/**
*这是文档注释,一般用于对一个类或方法进行功能参数等描述,可以生成文档
*建议对于自己定义的类或者方法都先用文档注释说明其功能、参数、创建人、时间等
*可以参考java源码的注释,非常清晰
*@author sky
*/
class A {
//这是行注释,用于对某个变量或者语句进行说明
//记录出现次数
int count = 0;
/*
这是多行注释,在这个里面的所有内容都会被编译器视为注释
*/
}
- 行注释用 //
- 多行注释用/* 注释内容 */,注意多行注释不支持嵌套
- /** 文档注释 */
3. 数据类型
- java中整形的范围与运行Java代码的机器无关,可以很好的进行平台移植。C++中整形的范围与平台相关;
- 长整形有后缀L或l,十六进制有前缀0x或0X,二进制有前缀0B或者0b;
- Java7之后可以为数字加下划线方便阅读如100_000;
- Java没有无符号类型;
- 三个特殊的浮点值:正无穷大,负无穷大,NaN(不是一个数字);
- 注意:浮点数不适合用于无法接受舍入误差的金融计算,例如:2.0 -1.1 结果为;0.8999999999999,对于金融计算一定要使用BigDecimal;
- \ 是转义符号,例如\n表示换行;\r表示回车;但是\u用于解析字符;
- \u2122 表示注册符号(TM)
类型 | 存储需求 | 取值范围 | 最大值 | 最小值 | 备注 |
---|---|---|---|---|---|
int | 4字节 | -2147483648 ~ 2147493647 | 2^31 - 1 | -2^31 | 用的较多 |
short | 2字节 | -32768 ~32767 | 2^15 - 1 | -2^15 | 特定数组 |
long | 8字节 | 2^63 - 1 | 2^63 - 1 | -2^63 | 表示较大范围值 |
byte | 1字节 | -128~127 | 2^7 - 1 | -2^7 | 特殊用途 |
float | 4字节 | 大约±3后面38个0 | 3.4028235E38 | 1.4E - 45 | 有效位6~7位 |
double | 8字节 | 大约±1后面308个0 | 1.7976931348623157E308 | 4.9E - 324 | 有效位15位 |
char | 2字节 | 2^16 - 1 | 2^16 - 1 | 0 | ‘A’表示字符;“A”表示字符串 |
boolean | 1字节 | true,false | 用于是非判断 |
4.变量
- 变量名由字母开头并由字母或数字构成的序列,变量名长度 没有限制,不要在自己的代码中使用$;
- 生命变量后要显式进行初始化,声明尽可能靠近第一次使用的地方;
- final修饰的变量只能被赋值一次,如果是基本数据类型则值不能改变,如果是引用类型则其所指的对象不能改变,但是对象本身可以改变;
- 如果希望某个变量在类中的所有方法都可用,则可以用static修饰,表示其是一个类变量;
5. 运算符
- 基本运算包括:加减乘除、取模运算;
- strictfp关键字表示必须使用严格的浮点计算来生成可再生的结果;
- 隐式类型转换:不会产生精度损失:byte->short->int->long,char->int,int->double,float->double;会产生精度损失:int->float;long->float;long->double;
- 强制类型转换:是上面隐式类型转换的逆过程,注意如果强制类型转换超出了目标类型的范围将会得到一个完全不同的值。
// 直接截断式强制类型转换
double x = 9.9;
int n = (int)x; // n = 9;
// 舍入式转换
double x = 9.9;
int n = (int)Math.round(x); //n=10
- 一些运算符使用
// 二元运算符
x += 4;
// 自增自减运算,合理利用前缀和后缀方式可以简化代码
++n; //先加一再运算
n++; // 先取值再加一
// 逻辑运算
&& || //“短路”方式求值,如果第一个结果就可以确定值,第二个将不会计算
x < y ? x : y // 多元运算符简化代码
& | ^ ~ //与,或,异或,非,与和或也可以作为逻辑运算,但是不采用短路方式
>> >>> << // 移位运算,>>用符号位填充高位;>>>用0填充高位
//运算符优先级,在不确定优先级时尽量通过多加括号防止出错
//例如二分查找中求中间数的写法
mid = left + (right - left) >> 1; //错误,因为+优先级高于>>
// 正确写法
mid = left + ((right - left) >> 1);
//枚举类型,可以将变量的取值限制在一定范围,如状态机的使用就大量使用了枚举类型
enum Size {SMALL, MEDIUM};
6. 字符串
- Java中提供了String类来专门进行字符串处理,可以进行子串提取、拼接等操作;
- String类没有提供修改字符串的方法所以是不可变字符串,优点是编译器可以让字符串共享;
- ==对于一般数据类型比较的是值,对于引用类型比较的是内存地址,一定要注意;
- 字符串分为空串和null两种,空串表示字符个数为0,null表示是一个空引用;
- 可以使用StringBuilder来构建字符串效率高但是非线程安全,StringBuffer是线程安全的;
- String提供了很多接口,可以参考其文档说明进行调用;
7. 输入输出
// 输入
Scanner in = new Scanner(System.in);
String s = in.next(); //以空格结束
String s = in.nextLine();//以换行结束
int n = in.nextInt();
// 用于密码读取
Console cons = System.console();
char[] passwd = cons.readPassword("Password: ");
// 格式化输出
System.out.printf("%8.2f", x); // 8个字符宽度和小数点后两个字符精度进行打印
//也可以使用String.format进行格式化
// 文件输入输出
Scanner in = new Scanner(Path.get("my.txt"), "UTP-8");
PrintWriter out = new PrintWriter("my.txt", "UTF-8");
8. 控制流程
- 块作用域,块确定了变量的作用域;
- 条件语句
- 循环语句:while(){}; do{}while();循环体至少执行一次;for()事先可以确定执行次数;
- switch:如果在分支中没有调用break,将会接着执行下一个分支;
- break跳出本次循环;continue执行下一轮循环;
9. 大数值
- BigInteger 和 BigDecimal可以进行整数和浮点数的高精度运算;
10. 数组
// 数组定义
int[] a = new int[10];
for(int x : a) //进行数组遍历,通过指针的方式进行遍历
int[] a = {2, 3, 4}; // 进行初始化
Arrays.sort(a); //对数组进行排序
Arrays.fill(a, 0); //将数组所有元素设置为0
// 不规则数据定义,例如存储三角矩阵
int[][] odds = new int[MAX+1][];
for(int n = 0; n <= MAX; n++){
odds[n] = new int[n+1];
}