Java复习,Java知识点以及Java面试题(一)

J2SE(Java 2 Platform Standard Edition)

J2ME(Java 2 Platform Micro Edtion)

J2EE(Java 2 Platform Enterprise Edition)

 

Java语言特点:开源 跨平台(JVM) 面向对象等

 

JRE与JDK

JRE(JVM和jJava类库) 

JDK包含JDK,以及其他开发工具

 

Java源代码----->javac编译------>Java字节码文件------->java执行----->运行结果

 

path环境变量里面记录的是可执行性文件,如exe,对可执行文件先在当前路径去找,如果没有找到就去path环境变量中配置的路径去找

classpath环境变量里记录的是java类的运行文件所在的目录

------------------------------------------------------------------------------------------------------------------------------------------------------------

Java语言基础

关键字:全小写 在IDE中以不同颜色显示,goto和const作为保留字存在

标识符:就是给变量,类,接口,方法等起名字 (英文大小写,数字,$ 和 _)以及命名法

  类或接口:首字母大写

  方法或变量:首字母小写

  常量:全大写,单词之间用“_”隔开

注释://     /* */      /** */

常量:字面值常量:1.字符串常量 2.整数常量 3.小数常量 4.字符常量 5.布尔常量 6. 空常量

进制相关:

  1byte = 8bit;1k = 1024byte; 1m = 1024k; 1g = 1024m;1t = 1024g

  二进制(以0b开头),八进制(以0开头),十进制,十六进制(以0x开头)的相互转换

  8421BCD码四位表示一个十进制码,十进制157 = 0001 0101 0111

  原码,反码,补码(计算机都是使用补码来计算的)

    原码:最高位符号位0正1负,其余为数值位

    反码:正数反码与原码相同,负数反码与符号位相同,数值位取反

    补码:正数补码与原码相同,负数补码为反码末位加一

变量:数据类型 变量名 = 初始化值

数据类型:

  八种基本数据类型:

  byte:八位,一个字节,有符号,以二进制补码表示的整数,最小值:-128(-2^7)最大值:127(2^7-1)

  short:16位,两个字节,有符号,以二进制补码表示的整数,最小值:-32768(-2^15)最大值:32767(2^15-1)

  int:  32位,四个字节,有符号,以二进制补码表示的整数,最小值:-2^31  最大值:2^31-1

  long:  64位,八个字节,有符号,以二进制补码表示的整数,最小值:-2^63  最大值: 2^63-1 默认值:0L

  float:单精度 32位 四个字节 浮点数 默认值:0.0f

  double: 双精度 64位 八个字节 浮点数  默认值0.0d 浮点数的默认类型位double类型

  boolean:true/false 一个字节

  char:单一的 16 位 Unicode 字符,占两个字节,最小值是 \u0000(即为0);最大值是 \uffff(即为65,535),char 数据类型可以储存任何字符;(可以储存汉字)

  整数默认int类型,浮点数默认double类型

  级别从低到高为:byte,char,short(这三个平级)–>int–>float–>long–>double

  自动类型转换(默认转换):从低级别到高级别,系统自动转的;

  强制类型转换:什么情况下使用?把一个高级别的数赋给一个比该数的级别低的变量;目标数据类型 变量 = (目标数据类型)(被转换的数据)

  float虽然占4个字节,long占八个字节,但是float表示范围比long大(原因:略,可自行Google)

//面试题:以下语句会报错吗s's's's
byte a = 1 , b;fo
b = a + a;     //会报错,无法编译,因为默认转换a为int,再从int到byte需要强制转换
//面试题,下列输出是多少:
byte a = (byte) 214;
System.out.println(a);
//因为强制转换,只截最后一个字节,并且这个字节为补码,所要做的就是把补码转为原码即可
System.out.println('a'+1);
//输出98,因为‘a’为char类型,根据ACSII表转为int 97
System.out.println('a'+1);   // 98
System.out.println("a"+1);  // a1
System.out.println('a'+1+"a"); //98a
//字符串后的+为字符串拼接操作

运算符:

  算数运算符:“/”为除法,整数相除只能得到整数,如果想要小数,需要加小数点.0

        "%"为取余

        ++和--,放在变量前后效果不同,前面是先自增或自减再参与运算,后面是先参运算再自增或自减

        注意:算数运算符的优先级

  赋值运算符:= += -= *= /= %=

short f = 1;
f = f+1;
//会报错cannot convert from int to short,因为会先默认转成int类型
short f = 1;
f +=1//不会报错,因为扩展运算符包含强制类型转换,相当于f = (f的数据类型)(f+1)

  关系运算符:==  != > >= < <=

  逻辑运算符:&(与) |(或) ^(异或) !(非) &&(短路与) ||(短路或)

      & :无论左边结果是什么,右边都参与运算。 &&:短路与,如果左边为false,那么右边不参数与运算。

      |:两边都运算。 ||:短路或,如果左边为true,那么右边不参与运算。

  位运算符: &(与运算) |(或运算) ^(异或运算) ~(按位取反)  <<(左移) >>(右移) >>>(无符号右移)

int a =1,b =2;
//java实现两个整数变量的交换:
//  方式一:采用一个中间变量 优点:最简单最好理解的方式
//  方式二:可以用两个数求和然后相减的方式 缺点:如果 x 和 y 的数值过大的话,超出 int 的值会损失精度。
a = a + b;
b = a - b;
a = a - b;
//  方式三:利用位运算的方式进行数据的交换,思想原理是:一个数异或同一个数两次,结果还是那个数,而且不会超出int范围(最佳实现)
a = a^b;
b = a^b;
a = a^b;
//  方式四:利用反射 最为麻烦,切效率低。完全炫技使用
//最有效的方法算出2乘以8等于几?
//  2<<3; 表示 2向左移 3位:2 * 2^3(2的3次方) = 2 * 8;
//  因为一个数左移 n位,就相当于 2的 n次方,那么一个数乘以 8只要将其左移 3位即可,而为运算符的效率最高,所以 2乘以 8等于几的最有效方法是 2<<3。

  三目运算符:  比较表达式?表达式1:表达式2;

if语句:if(判断语句){执行语句}else if(判断语句){执行语句}else{执行语句}

switch语句: switch表达式支持的数据类型:基本数据类型:byte, short, char, int;包装数据类型:Byte, Short, Character, Integer;枚举类型:Enum;字符串类型:String(Jdk 7+ 开始支持)

      注意:case 里面必须跟 break,不然程序会一个个 case 执行下去,直到最后一个 break 的 case 或者 default 出现。

         case后面的值只能是常量,不能是变量,而且,多个case后面的值不能重复

for循环语句:for(初始化语句;判断语句;控制语句){执行语句;}

while循环语句:初始化语句 while(判断语句){执行语句;控制语句;}   

    能用for尽量用for,因为for中初始化语句中的变量可以尽早在内存中消失,使用while循环可以继续使用控制语句中的变量

do...while循环语句:初始化语句 do{执行 语句;控制语句;}while(判断语句); do...while循环至少执行一次循环体

控制跳转语句:break  跳出单层循环;跳出指定循环,使用标签名(不常用)

       continue 跳出一次循环,进入下一次

方法:格式: 修饰符 返回值类型 方法名 (参数类型 参数名,......){执行语句; return 返回值;}

      实际参数:实际参与运算的参数;形式参数:方法定义的,用于接收实际参数

   方法重载:方法名相同,参数个数以及参数类型不同;与返回值类型无关,只看方法名和参数列表;调用时虚拟机通过参数列表的不同来区分同方法名

数组:存储基本数据类型,也可以存储引用数据类型。

   格式:数据类型[] 数组名;

      数组类型[][] 数组名 = new 数据类型[m][n]; 数据类型[][] 变量名 = new 数据类型[m][]; 数据类型[][] 变量名 = {{1,2,3},{1},{1,2}};

   初始化:动态初始化:指定数组长度,由系统分配初始值:数据类型[] 数组名 = new 数据类型][数组长度]

       静态初始化:指定每个元素的初始值,由系统判断数组长度:数组类型[] 数组名 = {1,2,3}、

   遍历数组:

   获取最值:

   数组逆序:

   查找元素:

Java中的参数传递问题:

  基本类型:形式参数的改变对实际参数没有影响。

  引用类型:形式参数的改变直接影响实际参数。因为引用类型做形参,调用的是地址值,对同一块内存进行修改。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Java中的内存分配:

栈:存储局部变量;用完就释放;栈内存的两个引用指向同一个堆内存空间,无论哪个栈内存中的变量的操作都是针对堆内的同一个地方

堆:new出来的东西;每个new出来的东西都有地址值;每个变量都有默认值byte,short, int,long 0;float,double 0.0; char '\u0000'; boolean false; 引用类型 null; 使用完毕就成了垃圾,没有立即回收,等GC空闲时回收

方法区:

本地方法区:

寄存器:

posted @ 2020-05-31 17:00  生于思考  阅读(296)  评论(0编辑  收藏  举报