今天开始看CoreJava Vol.1学Java啦 嘤嘤嘤 ^O^
我的环境是macOS High Sierra Version 10.13.5(17F77) Java的版本是 10.0.2
java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
资料:JDK 1.6 在线中文手册
目录:
一.编译运行Java程序
二.基本结构流程
A.数据类型
1.注释
2.数据类型
3.运算符
4.强制类型转换
5.逻辑关系运算符
6.位运算
7.优先级
8.枚举类型
9.字符串B.输入输出
1.流读入
2.格式化输出
3.文件读写C.控制流程
D.大数运算
E.数组
1.数组声明两种方式
2.初始化数组
3.数组拷贝
4.命令行参数
5.数组排序
6.多维数组
一.编译运行java程序
编写好java程序后保存为code.java,当前目录下终端里使用javac code.java 这会在当前目录生成一个code.class 然后终端中使用java code就可以执行这个java代码;
二.基本结构流程
1.数据类型
1.注释
可以用// 或者/* */来注释 可以用/** */来生成文档;
2.数据类型
1.整型
java中没有unsigned的形式的整型;
java的可移植性体现在 变量在不同机器上的内存占用是相同的;
2.浮点型
3.字符型char
java中不建议使用char类型;
4.boolean型
java中不可以用0表示false 1表示true; 注意不是bool,是boolean型!!
5.常量
使用final int INFINITY=0x7fffffff;
来定义,表示只可以定义一次,不可以多次修改;
常量定义常用大写字母;
全局下常量可以这样定义 public static int INFINITY=0x7fffffff;
6.java中所有数据定义后必须要进行赋值初始化才能操作;
3.运算符
java提供了 + - * / 四种算术运算符; 还有取余运算%;
注意的是java默认在浮点运算过程中会进行截断,如果想要进行精确浮点运算可以在主函数中加入strictfp标记 public static strictfp void main(String[] args)
在Math类中提供了其他的一些常用运算;
如
Math.sqrt()
Math.pow()
Math.sin() Math.cos() Math.tan()
Math.exp()
Math.log()
还有一个Math.floorMod()修正了直接使用%运算符 对被除数是负数情况的修正;
还有一些常量 Math.E表示自然对数的底数e Math.PI表示π
在代码开头加入import static java.1ang.Math.*;
就可以不用每次都写Math.了;
java还提供了赋值和运算符的结合写法,如x+=1;x%=2;
这种语法;
也可以使用x++;--x;
这种自增自减的写法;
4.强制类型转换
可以使用(int)x这样的方法进行强制类型转化;
可以使用下面这种方法进行四舍五入的浮点数取整,注意的是Math.round()返回的是long型,需要强制转换为int 默认的直接转换是向下取整的;
double x=9.5;
System.out.println((int)Math.round(x));
尽量不要把bool型和其他类型的变量进行转换,如果实在需要可以用 a?1:0
来转换bool成int;
5.逻辑关系运算符
相等== 不等!= 还有< > 之类的;
与&& 或||;
还有x<y ? x : y ;
这样的语法;
6.位运算
与(and) &
或(or) |
非(not) ~
异或(xor) ^
左移位<<
右移位>>
还有一个>>>运算符,与>>的区别在于>>>会用0填充高位,而>>会用符号位填充高位(负数的情况);
7.优先级
以后再说吧,脑阔疼;
8.枚举类型
转一篇blog吧 Java 枚举(enum) 详解7种常见的用法
9.字符串
Java 字符串就是 Unicode 字符序列;
Java 没有内置的字符串类型,但是可以使用标准库里的String;
所有双引号括起来的都是String的一个实例;
1.子串substring
子串substring 例如 s.substring(a,b) 截取了s字符串的[a,b)位的字符串;
2.拼接
可以使用+来拼接,比如
String s="Hello";
s+="World";//s="HelloWorld"
字符串也可以和其他类型拼接 比如
int ans=1;
String s="The answer is "+ans;//s="The answer is 1"
+进行拼接可以连续用多次;
也可以使用String的join方法,比如String s=String.join("-","T","P","N","B");
要注意,这样做得到的s串是"T-P-N-B"
join函数会把第一个接收到的字符串作为分隔符;
3.修改元素
要注意的是java里的字符串是不可变的,比如我定义了String s="Hello"
那么我不可以直接s[0]=”F”来把它变成”Fello”,而需要s="F"+s.substring(1,s.length());
来修改其中的元素;
4.检查字符串是否相等
可以用s.equals(t);
来检查s和t是否相等;equals函数等价于compareTo函数,类似于C中的strcmp;
也可以用s.equalsIgnoreCase(t)
来检查不区分大小写是否相等;
5.获取字符串中的单个字符
可以用char a=s.charAt(1);
来获取s字符串的第2个字符;
当然如果不介意使用String的话也可以String b=s.substring(1,2);
还有一些常用的函数在这里可以找到
6.构建字符串
2.输入输出
1.流读入
在程序开头加上import java.util.*;
Scanner in = new Scanner(System.in);
String name = in.nextLine();
这是读入一行的办法;
还可以直接in.next()读取一个字符串,以空格为结束标志;
还有nextInt() nextDouble()等方法;
因为Scanner的读入会让输入保留在屏幕上,如果想输入密码,使得输入不保留在屏幕上可以:
Console cons = System.console();
String username = cons.readLine("Username: ");
char[] passwd = cons.readPassword("Password: ");
记得要import java.io.Console;
2.格式化输出
java支持和C一样的prinf方法,System.out.printf()即可;
string可以格式化字符串
String message = String.format("Hello, %s. Next year, you'll be %d", name, age);
3.文件读写
可以这样来用 File 对象构造一个 Scanner 对象
Scanner in = new Scanner(Paths.get("/Users/zhangpeiwen/Downloads/list"),"UTF-8");
然后可以使用in.nextline()等方法从文件里读内容了;
然后写文件:
PrintWriter out = new PrintWriter("dt.txt","UTF-8");
out.println("Recluse");
out.close();
注意的是写文件时要关闭文件才会保存;
3.控制流程
java支持和C++一样:
判断语句 if else;
循环语句while 和do while;
选择switch语句 ;
java里的break和continue有和C++一样的功能;
而且还提供了带标签的break;
L1://程序输入2后会结束这个循环
while(true){
Scanner cin = new Scanner(System.in);
int a = cin.nextInt();
if(a==2) break L1;
}
System.out.println("End of this program\nThanks!");
要注意的是标签只能用于循环结构前面,不能完全当做goto来用;
Java中没有goto语法;
Java还提供了for each语句;
比如可以用这个代码来打印数组
for(int i:a){
System.out.println(i);
}
也有更简单的方法打印数组:
System.out.println(Arrays.toString(a));
//结果形如[1, 2, 3, 4]
4.大数运算
java提供了很方便的库BigInteger和BigDecimal可以进行任意精度的整数和浮点数运算;
不过并没有重载运算符,所以加减乘除幂乘之类的操作都要用方法来实现;
比如有些常用的:
valueOf(BigInteger val)//将参数转换为大整数类型
abs()//求绝对值
add(BigInteger val)//加法
subtract(BigInteger val)//减法(this - val)
multiply(BigInteger val) //乘法
divide(BigInteger val)//除法(this / val)
remainder(BigInteger val)//取模
mod(BigInteger val); //同上
gcd(BigInteger val)//求最大公约数
negate(BigInteger val); //求相反数
boolean equals(BigInteger val)//比较是否相等
compareTo(BigInteger val)//比较,返回值1、0、-1分别表示大于、等于、小于
pow(intexponent) //返回当前大数的exponent次幂
toString()//返回此BigInteger的十进制字符串表示形式
toString(intradix)//返回此BigInteger的给定基数(radix进制)的字符串表示形式
BigInteger(String val)//将字符串转换为大整数型十进制表示形式
BigInteger(String val,int radix)//将指定基数的字符串转换为BigInteger型
常用姿势:
BigInteger a = BigInteger.TEN;//BigInteger的基本常量有ONE TEN ZERO
BigInteger b = a.pow(31);//pow的输入是int 哈哈幂乘也要大数过分了 实在要可用二分幂模拟一哈
b=a.subtract(BigInteger.valueOf(20));
5.数组
1.数组声明两种方式
int[] a; (Recommend)
int a[];
2.初始化数组:
int[] a = new int [100];
//100这里也可以是一个变量n;
//int初始化为0,boolean为false;string初始化为null,注意不是空串
int[] a = {1,2,3,4};
//长度为4,不可更改
int[] a = new int[] {1, 2, 3};
//使用匿名数组来初始化数组
3.数组拷贝
可以直接对数组元素进行赋值 如 a[5]=12;
当需要拷贝数组的时候可以使用Arrays.copyOf()方法;
如
int[] b = Arrays.copyOf(a,2*a.length);
//(b为目标数组,a为待拷贝数组,2*a.length为目标数组的长度);
//这个方法常用于增加数组长度,当目标数组的长度小于待拷贝数组长度时会只拷贝前面的元素;
4.命令行参数
我们的主函数是这样写的 public static void main (string[] args){}
for(String i : args) System.out.println(i);
//编译时使用java test Tang Peng Niu Bi
//可以输出Tang Peng Niu Bi
5.数组排序
使用Arrays.sort(a)函数,用优化过的快排算法对a数组进行排序;
二分查找:返回[start,end)范围内查找成功的第一个元素的下标值,否则,返回一个负数值r,-r-1是为保持a有序v应插入的位置;
static int binarySearch(type[] a, int start, int end, type v)
6.多维数组
声明和初始化方法:
double[] a = new double[row][col];
double[] b = {
{1,2,3},
{4,5,6},
{7,8,9}
};
注意,如果想实现每一位数组不同的长度,可以先定义row,再循环定义col的长度,实现不规则长度的二维数组;