java核心技术笔记——java基本程序设计结构

时间:2023-02-16 11:38:57
hello world代码
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

位运算 

java核心技术笔记——java基本程序设计结构

<< :左移运算符,n<<1相当于 n*2
>> :右移运算符,n>>1相等于n/2
 >>>:无符号右移,忽略
int a=-1;
-1的32进制位:
源码 :     0000 0000 0000 0000 0000 0000 0000 0001
反码 :     1111 1111 1111 1111 1111 1111 1111 1110
补码 :     1111 1111 1111 1111 1111 1111 1111 1111 (在反码基础上+1) 负数二进制表示形式
a<<2:    1111 1111 1111 1111 1111 1111 1111 1100
a>>2:    1111 1111 1111 1111 1111 1111 1111 1111  (右移两位,左边高位再补两个1,所以看着没什么变化)
a>>>2:  0011 1111 1111 1111 1111 1111 1111 1111  (无符号右移跟上个比起来就是高位不补1)
            
 
上面-1 >>2看着没什么变化可以换成-5 试试:
int a=-5; System.out.println(Integer.toBinaryString(a)); System.out.println(Integer.toBinaryString(a>>2)); System.out.println(a>>2);
11111111111111111111111111111011
11111111111111111111111111111110
-2
-------------------------------------------------------
int a=-5;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>>2));
System.out.println(a>>>2);
11111111111111111111111111111011
111111111111111111111111111110
1073741822

二进制负数:全部为1==-1;例如单字节 11111111==-1  11111111-1==11111110==-1-1==-2

求补码方法

java核心技术笔记——java基本程序设计结构

运算符优先级:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

字符串

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

java核心技术笔记——java基本程序设计结构java核心技术笔记——java基本程序设计结构

逻辑控制

循环,条件语句同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]时候自动执行。