编程基础

DBC 2K 0

1.编程语言面试题之新版javase基础语法篇之运算符

你知道 运算符 &和&&、|和||的区别吗?

& 按位与操作
    只有对应的两个二进制数为1时,结果位才为1
    1&1 = 1
    1&0 = 0
    0&1 = 0
    0&0 = 0
| 按位或操作
    有一个为1的时候,结果位就为1
    1|1 = 1
    1|0 = 1
    0|1 = 1
    0|0 = 0
& 和 && 都可以实现 和 这个功能
区别:& 两边都运算,而 && 先算 && 左侧,若左侧为false 那么右侧就不运算,判断语句中推荐使用 &&,效率更高
​
| 和 || 和上面类似
区别:||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断
​
把&&和||称之为短路运算符

用最有效率的方法计算2乘以8

原理:将一个数左移n位,相当于乘以2的n次方,位运算是CPU直接支持的,所以效率高
答案:2<<3
​
常见的JDK源码里面HashMap的默认容量16
int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
​
直接是二进制操作了,表示1左移4位,变成10000,转为10进制也就是16, 直接以二进制形式去运行,效率更高

编程基础插图

温馨提示

不要自作聪明,这样是报错的!

2.异或运算在面试中的考查点和分析

写个方法,传递两个非0的int数值进去,实现变量交换的方式,有几种方式?

方式一

    public static void swap(int a, int b){
        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);
    }

方式二

    public static void swap2(int a, int b){

        System.out.printf("\na=%d, b=%d",a,b);

        a = a^b;   // a1 = a^b
        b = b^a;   // b = b^a^b
        a = a^b;   // a = a1^b = a^b^a

        System.out.printf("\na=%d, b=%d",a,b);
    }

编程基础插图2

温馨提示

a1=a^b
b=b^a1=b^a^b=a
//此时a1=a^b b=a
a=a1^b=a^b^a=b

3.编程语言面试题之新版javase基础语法篇之类型

说下java数据类型分类

  • 基础数据类型:byte、short、int、long、float、double、char、boolean
  • 引用数据类型:其他都是引用类型
  • String和Enum分别是什么类型:引用类型

运算

定义变量 int i = 5;
return i++; 和 return ++i; 返回结果是什么

编程基础插图4

温馨提示

++在前面是先操作然后再返回,反之亦然

== 和equals的区别

  • 基本数据类型比较 要用==判断是否相等
  • 引用数据类型: ==比较的是内存地址是否一样,不同对象的内存地址不一样,equals比较的是具体的内容, 也可以让开发者去定义什么条件去判断两个对象是否一样

4.编程语言面试题之新版javase基础语法篇 try-catch-finally

下面代码 的try-catch-finally语句,try里面有个return, finally里面也有个return,结果会返回什么?为什么

public class test {
    public static void main(String[] args) {
       System.out.println(test1());
        System.out.println(test2());
    }

    public static int test1() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;//确定了返回值是3,再执行finally,虽然finally里面a=4,但是其那面已经确定是3了,所以返回3

        } finally {
            a = 4;
        }
        return a;

    }

    public static int test2() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;

        } finally {
            a = 4;//catch确定了返回值是3,再执行finally,finally里面a=4,但是有心得return,重新确定了返回值,所以是4
            return a;
        }


    }



}

控制台输出

编程基础插图6

温馨提示

答案:
在执行try、catch中的return之前一定会执行finally中的代码(如果finally存在),如果finally中有return语句,就会直接执行finally中的return方法,所以finally中的return语句一定会被执行的

执行流程:finally执行前的代码里面有包含return,则会先确定return返回值,然后再执行finally的代码,最后再执行return

温馨提示

PS: 工作中项目如果这样写,猜会不会被打,不要这样写!!!

5.编程语言面试题之新版JDK9基础语法篇 try-with-resource

有了解新版的JDK处理IO流吗?编写下基础代码, 从一个txt文本里面,拷贝里面的内容到另外一个txt文本里面

温馨提示

JDK7之后的写法,JDK9⼜进⾏了改良,但是变化不⼤,记住下⾯的写法即可
需要关闭的资源只要实现了java.lang.AutoCloseable,就可以⾃动被关闭
try()⾥⾯可以定义多个资源,它们的关闭顺序是最后在try()定义的资源先关闭

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class test {
    public static void main(String[] args) {
        try (
                FileInputStream fis = new FileInputStream("C:\\Users\\dbc\\Desktop\\123.txt");
                BufferedInputStream bis = new BufferedInputStream(fis);
                FileOutputStream fos = new FileOutputStream("C:\\Users\\dbc\\Desktop\\321.txt");
                BufferedOutputStream bos = new BufferedOutputStream(fos);) {
            int size;
            byte[] buf = new byte[1024];
            while ((size = bis.read(buf)) != -1) {
                bos.write(buf, 0, size);
            }
        } catch (
                Exception e) {
            e.printStackTrace();
        }


    }
}



6.编程语言面试题之文件API和递归考察

代码编写需求: 找出某目录下的所有子目录以及子文件并打印到控制台上

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class test {
    public static void main(String[] args) {
        //找出某目录下的所有子目录以及子文件并打印到控制台上
        List<String> paths = new ArrayList<>();

        getAllFilePaths(new File("C:\\Users\\dbc\\Desktop\\demoAll"),paths);

        for(String path : paths){
            System.out.println(path);
        }


    }

    private static void getAllFilePaths(File filePath, List<String> paths) {

        // filePath.listFiles()文件全部遍历出来
        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());
            }
        }


    }
}



7.编程语言面试题之新版javase字符串(重点)

问题1: String str = new String("xdclass.net"); 创建了几个对象?

温馨提示

答案:

创建一个对象:常量池存在,则直接new一个对象;

创建两个对象:常量池不存在,则在常量池创建一个对象,也在堆里面创建一个对象

问题2: 下面是比较什么?输出结果是什么?为什么是这样的结果

        String str1 = new String("xdclass.net");
        String str2 = "xdclass.net";
        String str3 = "xdclass.net";
        System.out.println(str1 == str2);
        System.out.println(str2 == str3);

编程基础插图8

温馨提示

答案:
比较引用的内存地址是否一样
第一个是false: new 创建新的对象会开辟新的空间,所以地址不一样
第二个是true:都是从常量池里面获取,"xdclass.net" 存在于常量池中

问题3: 写出下面代码的各个结果?如果需要两个都为true,应该怎么修改`

public class test {
    public static void main(String[] args) {
        String s1 = "xdclass";

        String s2 = s1 + ".net";  //变量 + 常量 = 来自堆

        String s3 = "xdclass" + ".net";  //常量 + 常量 = 来自常量池

        System.out.println(s2 == "xdclass.net");

        System.out.println(s3 == "xdclass.net");




    }

}

编程基础插图10

温馨提示

答案
第一条语句打印的结果为false, s2 = s1 + ".net", //变量+常量=堆
构建了一个新的string对象,并将对象引用赋予s2变量,常量池中的地址不一样,但是值一样。


第二条语句打印的结果为true,javac编译可以对【字符串常量】直接相加的表达式进行优化,不用等到运行期再去进行加法运算处理,而是直接将其编译成一个这些常量相连的结果.

如果需要第一个输出为true,只需要把变量改为常量即可 fianl String s1 = "xdclass";
不管是new String("XXX")和直接常量赋值, 都会在字符串常量池创建.只是new String("XXX")方式会在堆中创建一个对象去指向常量池的对象, 普通的常量赋值是直接赋值给变量

如下图修改
public class test {
    public static void main(String[] args) {
        final String s1 = "xdclass";

        String s2 = s1 + ".net";  //变量 + 常量 = 来自堆

        String s3 = "xdclass" + ".net";  //常量 + 常量 = 来自常量池

        System.out.println(s2 == "xdclass.net");

        System.out.println(s3 == "xdclass.net");


    }

}

编程基础插图12

8.编程语言面试题之新版javase字符串相关构建类

StringStringBufferStringBuilder的区别?分别在哪些场景下使用

温馨提示

三者都是final, 不允许被继承
在本质都是char[]字符数组实现
StringStringBufferStringBuilder中,String是不可变对象,另外两个是可变的
StringBuilder 效率更快,因为它不需要加锁,不具备多线程安全

StringBuffer里面操作方法用synchronized ,效率相对更低,是线程安全的;

使用场景:
操作少量的数据用String,但是常改变内容且操作数据多情况下最好不要用 String,因为每次生成中间对象性能会降低

单线程下操作大量的字符串用StringBuilder,虽然线程不安全但是不影响

多线程下操作大量的字符串,且需要保证线程安全 则用StringBuffer

9.编程语言面试题之新版javase面向对象篇

面向对象的四大特性是?分别解释下

抽象

关键词abstract声明的类叫作抽象类,abstract声明的⽅法叫抽象⽅法
⼀个类⾥包含了⼀个或多个抽象⽅法,类就必须指定成抽象类
抽象⽅法属于⼀种特殊⽅法,只含有⼀个声明,没有⽅法体
抽象支付
pay(金额,订单号),默认实现是本地支付,微信支付,支付宝支付,银行卡支付

封装

封装是把过程和数据包围起来,对数据的访问只能通过已定义的接⼝即⽅法
在java中通过关键字private,protected和public实现封装。
封装把对象的所有组成部分组合在⼀起,封装定义程序如何引⽤对象的数据,
封装实际上使⽤⽅法将类的数据隐藏起来,控制⽤户对类的修改和访问数据的程度。 适当的
封装可以让代码更容易理解和维护,也加强了代码的安全性
类封装
⽅法封装

继承

⼦类继承⽗类的特征和⾏为,使得⼦类对象具有⽗类的⽅法和属性,⽗类也叫基类,具有公共的⽅法和属性
动物<-猫
动物<-狗
abstract class AbsPay{

}

WeixinPay extends AbsPay{

}

AliPay extends AbsPay{

}

多态

同⼀个⾏为具有多个不同表现形式的能⼒
优点:减少耦合、灵活可拓展
⼀般是继承类或者重写⽅法实现

10.编程语言面试题之新版javase接口篇

Overload和Override的区别?

温馨提示

重载Overload:表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同,参数个数或类型不同
重写Override:表示子类中的方法可以与父类中的某个方法的名称和参数完全相同

接口是否可以继承接口?接口是否支持多继承?类是否支持多继承?接口里面是否可以有方法实现

温馨提示
  • 接⼝⾥可以有静态⽅法和⽅法体
  • 接⼝中所有的⽅法必须是抽象⽅法(JDK8之后就不是)
  • 接⼝不是被类继承了,⽽是要被类实现
  • 接⼝⽀持多继承, 类不⽀持多个类继承

⼀个类只能继承⼀个类,但是能实现多个接⼝,接⼝能继承另⼀个接⼝,接⼝的继承使⽤extends关键字,和类继承⼀样

是否了解JDK8里面接口新特性

温馨提示
  • interface中可以有static⽅法,但必须有⽅法实现体,该⽅法只属于该接⼝,接⼝名直接调⽤ 该⽅法
  • 接⼝中新增default关键字修饰的⽅法,default⽅法只能定义在接⼝中,可以在⼦类或⼦接⼝ 中被重写default定义的⽅法必须有⽅法体
  • ⽗接⼝的default⽅法如果在⼦接⼝或⼦类被重写,那么⼦接⼝实现对象、⼦类对象,调⽤该 ⽅法,以重写为准
  • 本类、接⼝如果没有重写⽗类(即接⼝)的default⽅法,则在调⽤default⽅法时,使⽤⽗类(接口) 定义的default⽅法逻辑

发表评论 取消回复
表情 图片 链接 代码

分享