欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面试题(持续更新中。。。)

程序员文章站 2022-04-18 08:25:48
...

一个".java"是否可以包含多个类(不是内部类)?有什么限制?

可以包含多个类,只能有一个public类

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

修饰基本类型值不变,修饰引用类型只是引用不可变,但是引用所指向的地址的内容可以改变。

String s = “Hello”;s = s + “world”;这两行代码执行后,原始的String对象中的内容到底变了没有?

没有,改变是的地址的引用

HashMap、HashTable的区别?

HashMap 允许 key 和 value 为 null,而 Hashtable 不允许。
线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。

初始容量不一样,hashmap为16 hashtable为11;hashmap线程不安全,效率高,hashtable线程安全,效率低,被currenthashmap代替;hashmap的resize为2倍,hashtable为2倍加1

StringBuilder和StringBuffer的区别?

StringBuffer 字符串变量(线程安全),使用synchroized修饰
StringBuilder 字符串变量(非线程安全),效率比StringBuffer高

LinkedList和ArrayList有什么区别?

ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。【查询快,增删慢】

LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比,这是两种截然不同的实现技术,这也决定了它们将适用于完全不同的工作场景。【查询慢,增删快】

char型变量中能不能存储一个中文汉字?为什么?

可以,char类型本身就是用来存储字符的,而一个中文是两个字节 的字符。英文是一个字节的字符。如果是存取英文字符,那么可以使用byte,以便节省空间。

varchar,char两种数据类型有什么区别?如果库表某字段输入“ABC”后存储,该字段数据类型varchar(10),char(10),存储字节长度以及内容有何区别?

首先明确的是,char的长度是不可变的,而varchar的长度是可变的,
定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,

char的存取速度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而636f70797a686964616f31333366303062varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

多线程中,wait()方法和sleep()方法有什么区别?

sleep() 不释放锁;
wait() 释放锁。
用法不同:sleep() 时间到会自动恢复;
         wait() 可以使用 notify(),notifyAll()直接唤醒

1.对于sleep()方法,该方法是属于Thread类中的。
而wait()方法,则是属于Object类中的。
2.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。获取对象锁进入运行状态。
3.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

Java面试题(持续更新中。。。)Java面试题(持续更新中。。。)
Java面试题(持续更新中。。。)
jsp和servlet有什么区别?

Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到来客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。

1、jsp经编译后就变成了Servlet。

2、jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

3、Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletResponse对象以及HttpServlet对象得到。

4、而Servlet则是自个完整的Java类,这个类的Service方法用于生成对客户端的响应。

Mybatis如何处理结果集?

mybatis如何处理结果集:反射

通过获取到所有的返回的列名字,反射获取目标对象中这个名字对应的属性,调用set方法,进行赋值

构造器(constructor)是否可被重写(override)?

构造器Constructor不能被继承,因此不能被重写(Override),但是可以被重载(Overload)

springboot核心配置文件是什么?

Spring Boot 有两种类型的配置文件,application 和 bootstrap 文件
Spring Boot会自动加载classpath目前下的这两个文件,文件格式为 properties 或 yml 格式

*.properties 文件是 key=value 的形式
*.yml 是 key: value 的形式
*.yml 加载的属性是有顺序的,但不支持 @PropertySource 注解来导入配置,一般推荐用yml文件,看下来更加形象

bootstrap 配置文件是系统级别的,用来加载外部配置,如配置中心的配置信息,也可以用来定义系统不会变化的属性.bootstatp 文件的加载先于application文件
application 配置文件是应用级别的,是当前应用的配置文件

字符串相关

1.打印出String str1 = "as7df3j4g345lo34"中的数字
2.打印出String str2 = "Hello world hello java"中的单词和单词的个数

package com.itheima.practice;

import java.util.HashSet;
import java.util.Set;

public class TestString {
    public static void main(String[] args) {
        String str1 = "as7df3j4g345lo34";
        getNumber(str1);

        System.out.println();
        String str2 = "Hello world hello java";
        getWord(str2);
    }

    public static void getNumber(String s) {
        byte[] bytes = s.getBytes();
        for (byte a : bytes) {
            if (a >= 48 && a <= 57) {
                System.out.print((char) a + " ");
            }
        }
    }

    public static void getWord(String s) {
        String lowerCase = s.toLowerCase();
        String[] splits = lowerCase.split(" ");
        Set<String> sets = new HashSet<>();
        for (String split : splits) {
            sets.add(split);
        }
        System.out.println("单词为:");
        for (String set : sets) {
            System.out.println(set);
        }
        System.out.println("一共有" + sets.size() +  "个词。");
    }
}

Java面试题(持续更新中。。。)

public class TestHouseNumber {

    public static void main(String[] args) {
        getNumber();
    }

    public static void getNumber() {
        Map<Integer,Integer> ids = new HashMap<>();
        int m = 0;
        for (int i = 0; i < 1001; i++) {
            m += i;
            ids.put(i,m);
        }

        for (int i = 1; i < 1001; i++) {
            for (int j = i+2; j < 1001 ; j++) {
                if(ids.get(j)-(i+1) == 2 * ids.get(i)){
                    System.out.println("门牌号:"+(i+1)+",最大门牌号:"+j);
                    continue;
                }
                if(ids.get(j)-(i+1) > 2 * ids.get(i)){
                    continue;
                }
            }
        }
    }
}