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空闲时回收
方法区:
本地方法区:
寄存器: