(一)常问基础小点
1、&与&&,|与||
&与&&:只有两边都是true时,结果才是true;
不同之处:&两边都要运算,&&先算左侧,左侧false则右侧不计算;
|与||与上述类似,当两边计算结果至少有一个是true时,结果才是true;
不同之处:|两边都要运算,||先算左侧,左侧true则右侧不计算;
2、最有效计算2乘以8
原理:位运算时CPU直接支持的,效率高
8是2的3次方,2*8 == 2<<3
1 //常见的JDK源码⾥⾯HashMap的默认容量16 2 //1<<4,就相当于 1 * 2的4次方,1*16 3 int DEFAULT_INITIAL_CAPACITY = 1 << 4;
3、两个int值互换
面试官考察:+-和异或
方法一:加减法,求和后相互做差;
System.out.printf("a=%d, b=%d",a,b); a = a + b; b = a - b ; a = a - b; System.out.printf("\na=%d, b=%d",a,b); }
方法二:异或,⼀个数 与另一数 异或两次 是本身,与本身异或是0;
System.out.printf("a=%d, b=%d",a,b); a = a^b; //a1 = a^b b = b^a; //b = b^a^b 是a a = a^b; //a = a1^b = a^b^a System.out.printf("\na=%d, b=%d",a,b); }
4、java语言的基础类型(1 个字节 8 位)
基础数据类型:byte、short、int、long、float、double、char、boolean
除上述,其他均是引用类型(String,Enum)
数据类型 | 名称 | 字节 | 默认值 | 位数 | 取值范围 |
byte | 位 | 1 | 0 | 8 | -2^7 - 2^7-1 |
short | 短整型 | 2 | 0 | 16 | -2^15 - 2^15-1 |
int | 整型 | 4 | 0 | 32 | -2^31 - 2^31-1 |
long | 长整型 | 8 | 0 | 64 | -2^63 - 2^63-1 |
float | 单精度 | 4 | 0.0 | 32 | -2^31 - 2^31-1 |
double | 双精度 | 8 | 0.0 | 64 | -2^63 - 2^63-1 |
char | 字符 | 2 | 空 | 16 | -2^15 - 2^15-1 |
boolean | 布尔 | 1 | false | 8 | true/false |
5、自增/自减运算符
int i = 5; return i++; // 先返回,再操作 5 return ++i; // 先操作,再返回 6
6、try-catch-finally
try { //... } catch (ArithmeticException e) { a = 3; return a; } finally { a = 4; } //返回结果是3 try { //... } catch (ArithmeticException e) { a = 3; return a; } finally { a = 4; return a; } //返回结果是4
如果存在finally代码,先执行finally中的代码 后执行catch中代码;
如果finally有return,则会执行finally中的return,如果finally中无但之前有,则会先确定返回值,而后再执行finally中的代码;
即:finally代码是必执行,finally语句比catch语句先执行,finally的return优先级更高,但若执行catch中的return则会先确定返回值;
7、try-witch-resource
try()中定义的资源,在try-catch结束后会自动关闭,JDK1.7后实现了java.lang.AutoCloseable;
1 // txt文件拷贝代码 2 try ( 3 FileInputStream fis = new FileInputStream("/Users/xdclass/Desktop/test.txt"); 4 BufferedInputStream bis = new BufferedInputStream(fis); 5 FileOutputStream fos = new FileOutputStream("/Users/xdclass/Desktop/copy.txt"); 7 BufferedOutputStream bos = new BufferedOutputStream(fos); 8 ) { 9 int size; 10 byte[] buf = new byte[1024]; 11 while ((size = bis.read(buf)) != -1) { 12 bos.write(buf, 0, size); 13 } 14 } catch (Exception e) { 15 e.printStackTrace(); 16 }
8、文件与目录
//找出某⽬录下的所有⼦⽬录以及⼦⽂件并打印到控制台上 public static void main(String[] args) { List<String> paths = new ArrayList<>(); getAllFilePaths(new File("/Users/xdclass/Desktop/demo"),paths); for(String path : paths){ System.out.println(path); } } private static void getAllFilePaths(File filePath, List<String> paths) { File[] files = filePath.listFiles(); if(files == null){ return; } for(File f : files){ if(f.isDirectory()){ paths.add(f.getPath()); getAllFilePaths(f,paths); }else{ paths.add(f.getPath()); } } }
非递归方式:把目录放到list中,while集合不是空时 是文件就打印删除,是目录就打印获取下级放入集合;但是就无序了;
9、字符串
String str = new String("test123"); 创建了1/2个对象
str保存在栈中;
如果常量池中存在字符串“test123”,则只在堆中创建一个对象;--1个
如果常量池中不存在字符串“test123”,则常量池和堆中会分别各创建一个对象;--2个
String s1 = "sclass";//常量,常量池地址 String s2 = s1 + ".net"; //变量 + 常量 = 来⾃堆地址 String s3 = "sclass" + ".net"; //常量 + 常量 = 来⾃常量池地址 final String s4 = "sclass";//常量,常量池地址 String s5 = s4 + ".net"; //常量 + 常量 = 来⾃常量池地址 System.out.println(s2 == "sclass.net");//false System.out.println(s3 == "sclass.net");//true System.out.println(s5 == "sclass.net");//true
常量地址 取自 常量池,变量地址 取自 堆;final修饰的变量也是常量;
String方法:
substring截取字符,start位置开始包含,end位置结束,不含end;0开始计数;
indexOf 字符出现第一个位置,0开始计数;从某位置开始第一次出现位置,包含这个位置,且从头计数;
10、字符串相关构建类
String、StringBuffer与StringBuilder
三者都是:char[]字符数组实现,都是final class 不允许被继承;
不同之处:String是定长,其他两个是可变长度;其中StringBuffer的append/length/setlength/charat方法等都加了synchronized,线程安全;
少量操作使用String;单线程下使用StringBuilder效率更快,因为它不需要加锁,不具备多线程安全;
11、面向对象的思想
⾯向对象思想OOP,⾯向对象的四⼤特性:抽象、封装、继承、多态
抽象:关键词abstract声明的类叫作抽象类;抽象类中至少有一个抽象方法;抽象方法只声明,无方法体;把一类事物的共同特征抽取出来,组装成一个类;
封装:把数据属性封装到一个类中,通过接口方法实现对属性的访问;隐藏数据属性,控制对数据的修改和访问;
继承:子类继承父类/基类的属性和方法;
多态:继承+重写
12、Overload和Override
重载Overload:同一个类中,有 多个方法 名称相同 但是 入参参数类型或者个数不同 的方法;
重写Override:子类中定义了和父类 名称相同且参数完全相同 的方法;
13、接口与类
一个类只能继承一个类 ⽤extends关键字,可以实行多个接口 用implements关键字;
接口可以继承多个接口 ⽤extends关键字,接口中只能有抽象方法;
JDK8新特性:
接口可以有static⽅法且必须有实现体,方法仅属于接口,且通过接口名.方法名 调用;新增加了default关键字修饰的⽅法,可以被子类继承和重写;
14、异常类
Error与Exception都是继承Throwable;异常可以处理 规避,错误无法处理必须修改或调整;
Error:编译错误或系统错误,虚拟机自身或虚拟机试图执行程序时;
runtime异常:无法预知,运行时发生的;NPE空指针;
IO异常:可以预测的,可以合理解决的;
15、int与Integer区别
int:基础数据类型; Integer:包装类;
int:不需要实例化,默认是0; Integer:需要实例化,默认是null;
取值范围相同 4字节32位 -(2^31) 2^31-1 :有一位是代表正负数,首位0剩余全1为(0111111* = 2^31-1 )故而如此,-128--127是已初始化好的常量,效率高;
16、==与equals区别
==:判断两个变量或实例是否是指向同一个内存空间,引用是否相同,对内存地址比较;
equals:判断两个变量或实例对应的内存空间的值是否相同,内容是否相同,对值比较;
17、静态代码块、构造函数、父类等加载执行顺序
无继承关系:静态代码块 > 普通构造代码块 > 构造函数 > 方法代码块,且多次创建对象 静态代码块仅执行一次
存在继承关系:父类静态块 > 子类静态块 > 父类普通构造代码块 > 父类构造函数 > 子类普通构造代码块 > 子类构造函数 > 正常方法代码块
18、内部类
内部类好处:封装隐藏内部类,外部类提供获取内部类对象接口;封装内部类,相当于外部类实现了多继承;
内部类:需使用外部类对象来实现实例化;
静态内部类:无指向外部对象的引用,仅外部类类名来实现实例化;
匿名内部类:仅使用一次,无法使用外部除final的变量;