【方向盘】JavaSE/EE基础面试题、基础知识记录---大杂烩(上)

简介: 【方向盘】JavaSE/EE基础面试题、基础知识记录---大杂烩(上)

案例


++i和i++有什么区别?volatile关键字?能保证这个操作的原子性吗?


1、请补全下面代码,达到所需输出的效果


 public static void main(String[] args) throws Exception {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        //请在此处补全代码
        System.out.println(list); //期望输出为:[1, a, 2, b]
    }


2、判断下面输出什么内容?


输出内容eg:

java.lang.Number

java.lang.Integer

等类似的

public static void main(String[] args) throws NoSuchFieldException {
        Field id = Son.class.getField("id");
        System.out.println(id.getType()); 
    }
    class Son extends BaseEntity<Integer> {
        public String name;
    }
    class BaseEntity<PK extends Number> {
        public PK id;
    }


 public static void main(String[] args) throws NoSuchFieldException {
        Field id = Son.class.getField("id");
        System.out.println(id.getType()); 
    }
    class Son extends BaseEntity<Integer> {
        public String id;
        public String name;
    }
    class BaseEntity<PK extends Number> {
        public PK id;
    }


说说给String直接赋值,和采用new赋值有什么异同?



注解的属性们,都必须有默认值吗?属性们能够哪些类型?


答:属性的default默认值都不是必须的。若不指定默认值,使用该注解时每个属性都必填,所以一般建议给默认值


**只有你的属性叫“value()”,并且使用时只给他一个赋值的时候是可以省略的~~~**,其余情况均不能省略


它支持的类型;


所有基本类型(int,float,boolean,byte,double,char,long,short)

    String

    Class

    enum

    Annotation

   上述类型的数


方法内部可以书写代码块吗?可以书写多个吗?若能说说它有什么好处


可以的。

    // 代码方法内部定义的变量互不干扰,有很好的隔离效果
    public void fun1() {
        {
            String s = "demo";
            // 代码块一
        }
        {
            //System.out.println(s); // 此处不能引入变量s
            // 代码块二
        }
    }

阐述你对Java中eq方法和==的区别?说得越详细越好?举例说明

要点:答出重写HashCode不能改变==是至少的要求


说说你对Map中put方法和putIfAbsent的理解?


下面编译报错吗?不抱错会输出什么呢?


 public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        System.out.println(map.put("a","a")); 
        System.out.println(map.putIfAbsent("b","b")); 
        System.out.println(map.putIfAbsent("b","b")); 
    }



面试题:Map的put方法,相同的key会被覆盖,请解释相同二字



System.out.print的输出、输出流为什么不用手动关闭呢?


  public static void main(String[] args) {
        PrintStream out = System.out;
        out.println("我");
        out.close();
        out.println("爱");
        out.println("中");
        out.println("国");
    }


请问上述会输出什么?


那为什么我们平时不需要自己手动去关闭呢?请回答


针对Map的put方法,请输出下面的打印结果?并解释为什么?


 public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        System.out.println(map.put("a","a")); 
        System.out.println(map.putIfAbsent("b","b")); 
        System.out.println(map.putIfAbsent("b","c"));
        //put的用法  
        System.out.println(map.put("c","c")); 
        System.out.println(map.put("d","d")); 
        System.out.println(map.put("c","d")); 
    }


void.class == Void.class是true还是false


答案:false


public static void main(String[] args) {
    System.out.println(void.class); // void
    System.out.println(Void.class); // class java.lang.Void
}


同样的int.class == Integer.class都是false的~


当我们比较Boolean包装类型时,可能遇到的坑


public static void main(String[] args) {
         Boolean b = null;
         System.out.println(b == Boolean.TRUE); //false  此处不报错
         System.out.println(b == true); //java.lang.NullPointerException
    }
   public static void main(String[] args) {
        Boolean b = new Boolean(true);
        System.out.println(b == new Boolean(true)); //false
        System.out.println(b == Boolean.TRUE); //false
        System.out.println(b == Boolean.TRUE.booleanValue()); //true
        System.out.println(b == true); //true
    }


比如上面的例子。如果是包装类型,千万不要简单的用if(b == true)来判断


说说i++和++i的区别?


说出下面两题的答案:


    public static void main(String[] args) throws InterruptedException {
        int i = 1;
        System.out.println((i++) - (++i)); 
        i=5;
        System.out.println((++i)+(++i)+(++i));
    }


答案:-2 21


原因(第一题为例):第一个i++是先用i的值,所以表达式取值1,最后i的值变为了2。到第二个++i时,表达式取值为3了。所以最终为1-3 = -2


使用javap -c -l Main.class可以查看字节码最终执行的指令,一目了然


image.png


maven相关的面试:


maven有哪些优点?


(1)依赖管理,节省空间

(2)一键构建 编码 编译 测试(junit) 运行 打包 部署

(3)应用于大型项目 可以提高开发效率


Maven常见的依赖范围有哪些?


         编译 测试 运行 打包


compile(struts2-core) 要 要 要 要

provided(jsp-api.jar) 要 要 不要 不要

runtime(数据库驱动包) 不要 要 要 要

test(junit.jar) 不要 要 不要 不要


maven中怎么排除依赖?Optional和Exclusions的使用的异同?


在maven的依赖管理中,有两种方式可以对依赖关系进行,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)


maven的常用命令


Clean 清理编译的文件

Compile 编译了主目录的文件

Test 编译并运行了test目录的代码

Package 打包

Install 就是把项目发布到本地仓库

deploy 发布到私服

Tomcat:run 一键启动


坐标的组成 (GAV)


Gruop Id

Artifact Id

Version


Maven版本冲突出现的原因?maven是如何自动解决冲突的依赖的?


1、路径最短原则

2、**优先声明原则:**当出现路径长短相同的时候,谁先声明就用谁。如F1和F2的路径距离相同,但是由于F1比F2先声明(B比C先声明),所以最终使用F1。


优先声明的解释:如果你是在自己的pom里书写(并不是间接依赖进来的),那么下面的版本号是会覆盖上面的


说说Maven的包的依赖关系怎么决定的?

自定义maben骨架模版、自定义maven插件的步骤?使用场景呢?

mvn deploy之前需要先执行clean吗?有必要吗?如果不执行会不会有问题?


怎么解释最近依赖原则?怎么解释同路径长度的依赖呢?

maven打包src/main/java的xml、properties等文件


这里面我推荐这篇文章来解答:maven资源文件的相关配置


        <!--
            directory:属性指定资源文件放置的目录。
            includes:包含哪些配置文件(.class文件不用写)
            filtering:如果设置为false的话,则表示上文的filters配置失效;如果设置为true,则会根据${env}.properties里面的键值对来
                       填充includes指定文件里的${xxxx}占位符(若不做环境区分,一般就是false即可)
        -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                    <include>**/*.tld</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                    <include>**/*.tld</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>


maven中的scope和optional的区别???


maven的scope决定依赖的包是否加入本工程的classpath下,下面一幅图就能看懂

image.png


optional与scope区别在于:仅限制依赖包的传递性,不影响依赖包的classpath


比如如下例子:A->B, B->C(scope:compile, optional:true)

B的编译/运行/测试classpath都有C,所以非常良好木有问题

但是,A因为是间接依赖的C,但是因为c上有optional:true,所以A中的编译/运行/测试classpath都是不会有C的。(尽管C是compile),可见optional的优先级比scope高


optional:true的功能特别像scope:provided,所以姑且可以认为他俩没有太大的区别~


相关文章
|
6月前
|
存储 安全 Java
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day03】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day03】——JavaSE
66 0
|
6月前
|
安全 Java 大数据
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day01】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day01】——JavaSE
73 0
|
开发框架 分布式计算 Java
【面试题精讲】JavaSe和JavaEE的区别
【面试题精讲】JavaSe和JavaEE的区别
|
6月前
|
缓存 NoSQL Java
JavaSE面试题(一)
JavaSE面试题(一)
JavaSE面试题(一)
|
6月前
|
存储 前端开发 算法
毕业季--JavaSE高级面试题
毕业季--JavaSE高级面试题
|
6月前
|
Java 大数据
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day04】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day04】——JavaSE
59 0
|
6月前
|
存储 安全 Java
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day02】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day02】——JavaSE
54 0
|
6月前
|
安全 JavaScript Java
JavaSE面试题(二)
JavaSE面试题(二)
|
XML 安全 Java
JavaSE基础面试题(精简版)
把CPU处理器与操作系统的整体叫平台
41 0
|
Java 大数据
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day04】——JavaSE
线程的生命周期:线程要经历新建、就绪、运行(活动)、阻塞和死亡五种不同的状态。这五种状态都可以通过Thread类中的方法进行控制。
102 0