java基础:
JDK:java开发环境,包含了java运行环境JRE,java工具以及基础类库。
JRE:java运行环境,大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
添加环境变量
JVM:.class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
cavaj java decompiler https://cavaj-java-decompiler.en.softonic.com/ java 反编译工具 如果java字节码 进行了加密,就没有用了
javac hellow.java[文件] // 编译代码 为.class java字节码
java hellow //运行代码
javadoc Hellowold.java //生成文档
Helloword 代码
/**
文档注释
*/
public class Hellowold{
/*
多行注释
Sting[] 为字符串数组
args 字符串数组的名字
*/
// 单行注释
public static void main(String[] args){
System.out.println("hello word!");
}
}
java中八种数据基本类型
占字节 默认值
int Integer 4 0
short Short 2 0
long Long 8 0l或0L
byte Byte 1 0
float Float 4 0.0F或0.0f
double Double 8 0.0
char Character 2 u0000
boolean Boolean 不确定 false
基本数据类型转换 (自动转换):
public class Demo {
public static void main(String[] args) {
byte a = 10;
short b = a;
int c = b;
long d = c;
float y = 11;
double z = y;
//float double 属于近似值
//byte short int 属于精确值
//精确值转换近似值 ,不需要强制转换,可能会丢失精度
int num1 = 21323123;
float num2 = num1; //赋值表示将 整数 21323123 赋值给了num2,类似num3
float num3 = 21323123;
System.out.println(num2); //2.1323124E7
System.out.println(num3); //2.1323124E7
}
}
注意:byte short int 计算时,自动转换 int 类型来比较大小
报错
short t1 = 10;
t1 = t1 + 1; // 1 为 int 类型; t1为 short 类型 不能接受 int 类型 ,改为int t2 = t1 + 1 即可
System.out.println(t1);
即使,两个 short 类型相加,同样会报错
short t2 = 1;
short t1 = 10;
t1 = t1+ t2; //自动转换为 int 类型
没有报错
short t1 = 10;
t1 += 1;
System.out.println(t1);
没有报错
int t1 = 10;
t1 = t1 + 1;
System.out.println(t1);
解决:强制转换
short t2 = 1;
short t1 = 10;
t1 = (short)(t1 + t2); // t1为 short类型接受,将t1+t2,强制转变为short类型 int t3 = (short)(t1+t2),可以,int 本身就可以接受 short 类型的数据
System.out.println(t1);
补充
String 不是基本数据类型 是引用类型变量,32位系统占4个字节,64位占8个字节,对于h = new Horse(); h也是引用类型变量,站的空间是所有属性占的空间之和
String x = "sdfdsf"; //接受一个字符串
char x = 'd'; //接受一个字符
注意:不能使用同一个局部变量,否则会自动转换,如果遇到不能转换的就会报错
java运算:
public class Demo {
public static void main(String[] args) {
int x=1;
int y=2;
y = x+y-(++y); //从前往后执行,并不是先 执行括号里面的
System.out.println(x); //1
System.out.println(y); //0;如果(y++)-->1
}
}
总结
public class Test {
public static void main(String[] args) {
//数据比较注意问题
int a =111111;
Integer b =111111;
System.out.println(a==b); //true Integer和int比较的时候,会将Integer拆成int类型
Integer c =111111;
System.out.println(b==c); //false b和c两个对象不一样
b = 127;
c = 127;
System.out.println(b==c); //true 此时b和c两个对象一样,Integer在-128<= x<=127的整数,将会直接缓存在IntegerCache中。
b = new Integer(127);
c = new Integer(127);
System.out.println(b==c); //false 此时b和c两个对象都是两个新的对象
b = new Integer(127);
Integer d = 127;
System.out.println(b==d); //false b创建的对象是存放在堆中,和IntegerCache缓存中的d不一样
b = 128;
d = 128;
System.out.println(b==d); //false IntegerCache不能存放128,所以b和d都相当于new Integer(128)
//总结:凡是new Integer(xx),则这两个数肯定是不一样的;
//如果使用int=xx,那这两个数肯定是一样的
//如果使用Integer=xx,如果-128<=xx<=127,则这两个数是一样;
float x = 11111f;
float y = 11111f;
System.out.println(x==y); //true
Float z = 1f;
Float w = 1f;
System.out.println(z==w);//false,浮点数不像Integer一样了
//基本数据类型转换注意问题;
long aa = 11L;
int bb = (int)(aa);
Long cc = 11L;
//int bb = (int)(cc) 不能转换,cc此时是Long对象了
//基本数据类型相加
int s1=1;
int s2=2;
int s3 = s1+s2-(s2+++1+s2++);
System.out.println(s1); //1
System.out.println(s2); //4
System.out.println(s3); //-3
int a1=1;
int a2=2;
int a3 = a1+a2-(a2+++1);
System.out.println(a1); //1
System.out.println(a2); //3
System.out.println(a3); //0
int b1=1;
int b2=2;
int b3 = b1+b2-(b2+++1+b2);
System.out.println(b1); //1
System.out.println(b2); //3
System.out.println(b3); //-3
int c1=1;
int c2=2;
int c3 = c1+c2-((c2++)+1+c2++)+c2+c2++;
System.out.println(c3);//5
int t = c2++;
System.out.println(t);//5
}
}
java运算符
位运算
>> 带符号右移位
正数移位:右边(低位)移出部分,直接舍弃,左边(高位)移入部分全部补0。(正数的符号为是0)
负数移位:右边(低位)移出部分,直接舍弃,左边(高位)移入部分全部补1。(负数的符号为是1)
<< 带符号左移位
左边(高位)移出部分,直接舍弃;右边(低位)移入部分全部补0。
>>> 无符号右移位
对于正数和0,无符号右移位>>>和带符号右移位>>,结果是一样的
负数移位:右边(低位)移出部分,直接舍弃,左边(高位)移入部分全部补0。(符号为由1变成0,所以负数变正数)
注:java没有 <<< 因为 <<< 就等于 <<
import java.util.Scanner;;
public class Demo {
public static void main(String[] args) {
//以最快的速度进行 64 乘 *8 //64*8=512 速度不够快,位移运算速度最快
short x = 64;
System.out.println(x<<3); //512 左移运算 6<<x -->6*2(进制)的x次方 速度最快
System.out.println(-x<<3); //-512 -6<<x -6*2**n
System.out.println(x>>3); //8 右移运算 6>>x -->6/ 2(进制)的x次方
System.out.println(-x>>3); //-8 右移运算 -6>>x -->-6/ 2(进制)的x次方
System.out.println(x>>>3); //8 右移运算 6>>>x -->6/ 2(进制)的x次方(正数>>>相当>> 负数>>> 会变成正数且不等于>>)
System.out.println(-x>>>3);//536870904左移运算 没有公式
//结果 short int byte 都是 以 int 4个字节运算
}
}
注意,如果移动的位数足够大,上面的公式就不管用了,如15<<27= 2013265920 ,15 <<28 = -268435456
15<<32 = 15, 15 << 33 = 30
&做位运算时
A = 0011 1100 == 60
B = 0000 1101
-----------------
A&b=0000 1100
A|B=0011 1101
A^B=0011 0001 异或,相同的为false,不相同的为true
~A= 1100 0011 == -61的补码; ~x=-x
&做逻辑运算时
import java.util.Scanner;;
public class Demo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean x = true;
boolean y = false;
boolean z = x&y;
System.out.println(z);
}
}
&的一个重要的用法就是(2x-1)&任何数都是小于(2x-1),比如15--->00000.....1111(二进制)
000000......1111
101001......1011
---------------------------------------
000000......1011 <1111
逻辑运算符
注意
&分别需要计算两边的值;在做判断,效率低;
&& 先计算左边的值,如果为false,直接返回false,效率高
| 和 || 同理;
if分支语句:
if(){
}else if(){
}else{
}
if(x==10)--->最好写成if(10==x) //用一个确定的值和不确定的值进行对比, 原因x可能为空,出现空指针的异常
switch分支语句:
//进行两个数据的调换位置
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
switch(n){
case 1:{
System.out.println("星期一");
break;
}
case 2:{
break;
}
default:{
System.out.println("没有");
break;
}
};
System.out.println("结束");
}
}
注意jdk 1.7之前不支持 String 即case “sdf”,在1,7之后,支持,原理是编译器在编译的时候将字符串转变成哈希值,int数 case是可以匹配的
注意:如果一旦case相应的值成功,但内部没有break语句,那么将会无条件(不再进行case匹配)的继续向下执行其它case中的语句,直到遇到break;语句或者到达switch语句结束
循环语句:
while(){
}
==================
int i=1;
do{
System.out.println("先执行一遍");
i++;
}while(i<=10);
=================
for(;;){
System.out.println("111"); //死循环
}
for(int i=0;;i++){ //只要中间没有判断,即为死循环
System.out.println("111");
}
例题:
//进行两个数据的调换位置
public class Demo {
public static void main(String[] args) {
int a=2;
int b=3;
//方法一
// int t = a;
// a = b;
// b = t;
//方法二:
// a = a+b;
// b = a-b;
// a = a-b;
//方法三:
// a = a+b-(b=a);
//方法四 速度最快 注意,a 和 b 不能为 同一个 值 否则 a^b =0
a = a^b;
b = a^b;
a = a^b;
System.out.println("a="+a+",b="+b);
}
}