(一)常问基础小点

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的变量;

posted on 2021-04-15 17:05  奇天异下  阅读(79)  评论(0编辑  收藏  举报

导航