public class HelloWorld{ public static void main(String args[]){ System.out.println("hello world!"); } }
这是java程序的模式,程序实现就是System.out.println("hello world!");这里不对其余做详细解释,只需记住类名首字母大写;
储存这段代码的文件名应该同类名相同后缀为.java文件,即HelloWorld.java;java中所有的函数都属于一个类的方法,因此main方法必须包含在一个类*虚拟机执行;java注释可以//(单行)或者/* */(多行且不能嵌套);
java数据类型(int(常用) 4字节、short 2字节、long 8字节、byte 1字节、float 4字节、double(常用) 八字节)
java数据类型所占字节数不因为处理器不同而不同,二进制前缀0b、八进制前缀0、十六进制0x。float后缀F,double后缀D或者没有后缀。
Double.POSITIVE_INFINITY 正无穷 Double.NEGATIVE_INFINITY 负无穷 NaN 不是数字,Double.isNaN(x)可以判是否是一个数字的方法。计算数值的时候不想包含误差用BigDecimal类,因浮点类型(float/double)采用二进制表示,无法精确表示1/10,就好比十进制无法精确表示1/3。
Unicode编码方案为了解决不同的编码值对应不同的字母的问题。
C++数值可以代替布尔,比如0==false,非0==true,java不存在这个问题,boolean只有true和false两个值。
变量(由字母开头不要用$、大小写敏感)
变量必须用赋值语句显示的声明,最好放在第一次使用前声明。
final 修饰常量,表示这个变量不能再背更改,习惯全大写。
运算符
许多intel计算浮点型的时候,会将中间结果放在80位寄存器中,计算完成后再截断为64位,增加计算精度。但是这样与一直在64位的机器上的结果不一样。虚拟机默认允许中间拓展精度,也可以添加strictfp关键字来进行严格计算。
数值类型之间的转换:double转换成int截取整数部分,去掉小数部分,精度丢失。最好用Math.round方法四舍五入。数值计算转换规则double>float>long>int,例:3D+3->3D+3D。int变成float也会损失精度 int a=123456789;float t=n;//t=1.23456792e8
数据类型转换原理?
二元运算符++等在表达式中作为前缀和后缀的区别:前缀会先执行运算,后缀会先取数值。例
int m=7;int n=7; int a=2*++m; int b=2*n++; a is 16 m is 8 b is 14 n is 8
位运算
上面-1 >>2看着没什么变化可以换成-5 试试:
int a=-5; System.out.println(Integer.toBinaryString(a)); System.out.println(Integer.toBinaryString(a>>2)); System.out.println(a>>2);
二进制负数:全部为1==-1;例如单字节 11111111==-1 11111111-1==11111110==-1-1==-2
求补码方法
运算符优先级:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
字符串
java字符串更像char* 而不是char[],每个“”里面的都是一个String 实例;
string a="hello"; a="world" ; a先指向hello 又指向world 这不会内存遗漏,java提供垃圾回收机制。
字符串不能用==判断相等,因为==只能判断两个字符串是否放在同一个位置。可能会将内容相同的多个字符串拷贝放在不同位置。比如string a="hello",a=="hello" 可能正确;a.substring(0,3)==“hel”可能错误。
stringbuilder:如果需要有许多个小字符串拼接成一个大就用stringbuilder的append方法,最后.tostring方法转换成string处对象,不用string的原因是因为string拼接的时候每次都会新建一个对象。
输入输出
控制台输入:
Scanner in =new Scanner(System.in); String name=in.nextLine();//包含空格 String name=in.next();//不包含空格 Int number = in.nextInt();//输入int
逻辑控制
循环,条件语句同c++;
switch语句case变量类型:char、byte、short、int、枚举常量、字符串字面量。
数组
API常用方法:static String toString(type[] a)将数组放在括号内用逗号分隔输出。
static type copyOf(type a,int length)/static type copyOf(type a,int start,int end) 拷贝数组到一个新数组,end/length越界返回0或者false
static void sort(type[] a) 优化的快速排序数组
static int binarySearch(type[] a,type v)/static int binarySearch(type[] a,int start,int end,type v) 才用二分法在数组a中查找v,找到返回下标。否则返回一个负值。
static void fill(type[] a,type v)将数组a的所有元素置为 v
static boolean equals(type[] a,type[] b)如果两个数组大小相同,并且下表相同的元素对应相等,返回true,否则false.
数组没有初始化以前不能使用,可以直接初始化,int [] a={1,2,3,4} 或者new一个对象new int[]/new int[100]
不规则数组:如下为一个max行的三角形数组,注意需要单独的创建行数组,
int[][] odds=new int[MAX][]; for(int n=0;n<MAX-1;n++){ odds[n]=new int[n+1]; } for(int n=0;n<odds.length;n++){ for(int k=0;k<odds[n].length;k++){ system.out.println(odds[n][k]); } }
double[][] a=new double[10][6];相当于c++的double** a=new double*[10];分配了包含10个指针的数组,每个数组包含6个元素,
for(int i=0;i<10;i++){ a[i]=new double[6]; }
这个过程在new double[10][6]时候自动执行。