Java 面试题
文章平均质量分 85
一份 Java 面试题,日积月累,每日三题
SuZhan7710
于道各努力,千里自同风
展开
-
Java岗面试题--Java并发(日积月累,每日三题)
Synchronized关键字及锁升级的讲解。原创 2023-03-02 18:17:40 · 502 阅读 · 3 评论 -
Java岗面试题--Java并发(volatile 专题)
线程 A 首先得到了 i 的初始值100,但是还没来得及修改,就阻塞了,这时线程 B 开始了,它也得到了 i 的值,由于 i 的值未被修改,即使是被 volatile 修饰,主存的变量还没变化,那么线程 B 得到的值也是100,之后对其进行加 1 操作,得到101后,将新值写入到缓存中,再刷入主存中。一个变量 i 被 volatile 修饰,两个线程想对这个变量修改,都对其进行自增操作也就是 i++,i++ 的过程可以分为三步,首先获取 i 的值,其次对 i 的值进行加1,最后将得到的新值写会到缓存中。原创 2023-02-27 16:00:46 · 1155 阅读 · 0 评论 -
Java 基础回顾之泛型
如果在写接口的时候都没有定义泛型,它默认的就是 Object 类,其实这样写是不规范的。在上述的泛型接口中已经规定传入其中的必须是 A,B 类的对象,那么当我们传入其他类的对象时就会报错。使用泛型方式给 HashMap 中放入三个学生对象,并输出对象信息;原创 2023-02-26 18:40:12 · 552 阅读 · 0 评论 -
Java-重排序,happens-before 和 as-if-serial 语义
由于常见的处理器内存模型比 JMM 要弱,Java 编译器在生成字节码时,会在执行指令序列的适当位置插入内存屏障来限制处理器的重排序。同时,由于各种处理器内存模型的强弱不同,为了在不同的处理器平台向程序员展示一个一致的内存模型,JMM 在不同的处理器中需要插入的内存屏障的数量和种类也不同。对于处理器重排序,JMM 的处理器重排序规则会要求编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barries / Memory Fence)指令,通过内存屏障指令来禁止特定类型的处理器重排序。原创 2023-02-26 09:58:00 · 463 阅读 · 0 评论 -
Java岗面试题--Java并发(日积月累,每日三题)
线程安全在三个方面体现:补充:关于「JMM」的文章请看这位大佬的博文->>>【Java线程】Java内存模型总结总结:JMM通过控制主内存与每个线程的本地内存之间的交互,来为 Java 程序员提供内存可见性保证。为了提高性能,编译器和处理器常常会对指令做重排序。重排序有 3 种类型,其中后 2 种都是处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致。处理器在进行重排序时必须要考虑指令之间的数据依赖性。多线程环境中线程交替执行,由于编原创 2023-02-24 20:24:27 · 3331 阅读 · 2 评论 -
Java岗面试题--Java并发(日积月累,每日三题)
使用多线程的目的是为了充分利用 CPU,但是我们知道,并发其实是一个 CPU 来处理多个线程。为了让用户感觉多个线程是在同时执行的, CPU 资源的分配采用了时间片轮转也就是给每个线程分配一个时间片,线程在时间片内占用 CPU 执行任务。当线程使用完时间片后,就会处于就绪状态并让出 CPU 让其他线程占用,这就是上下文切换。多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。互斥条件;请求与保持条件;不剥夺条件;循环等待条件。原创 2023-02-21 20:46:43 · 2148 阅读 · 0 评论 -
Java岗面试题--Java并发(日积月累,每日三题)
sleep(long millis) : Thread 类中的静态方法,当一个执行中的线程 A 调用了 Thread 的 sleep 方法后,线程 A 会暂时让出指定时间的执行权,但是线程 A 所拥有的监视器资源,比如锁还是持有不让出的。:这个方法相比 wait() 方法多了一个超时参数,它的不同之处在于,如果线程 A 调用共享对象的 wait(long timeout) 方法后,没有在指定的 timeout ms时间内被其它线程唤醒,那么这个方法还是会因为超时而返回。原创 2023-02-20 18:52:01 · 3378 阅读 · 8 评论 -
Java岗面试题--Java并发(日积月累,每日三题)
原理:在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给 Future 对象在后台完成,当主线程将来需要时,就可以通过 Future 对象获得后台作业的计算结果或者执行状态。守护线程(即 Daemon thread),是个服务线程,用来服务于用户线程,准确地来说就是服务其他的线程。需要注意的是,Java 本身并不能创造线程,因为线程其实是操作系统的一种资源,它由操作系统管理。线程:是进程的⼀个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。原创 2023-02-18 20:08:25 · 3452 阅读 · 2 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。Hash 值的范围值 -2147483648 到 2147483647,前后加起来⼤概40亿的映射空间,只要哈希函数映射得比较均匀松散,⼀般应用是很难出现碰撞的。但问题是⼀个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。原创 2023-02-12 17:59:10 · 3579 阅读 · 1 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
因为字符串是不可变的,所以在它创建的时候 hashcode 就被缓存了,不需要重新计算。假设一种情况,线程 A 进入后还未进行数据插入时挂起,而线程 B 正常执行,从而正常插入数据,然后线程 A 获取 CPU 时间片,此时线程 A 不用再进行 hash 判断了,问题出现:线程 A 会把线程 B 插入的数据给覆盖,发生线程不安全。HashMap 不是线程安全的,在多线程环境下,HashMap 有可能会有数据丢失和获取不了最新数据的问题,比如说:线程A put 进去了,线程B get 不出来。原创 2023-02-10 19:29:11 · 3253 阅读 · 2 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
java.util 包下的集合类大部分都是线程不安全的,例如我们常用的「HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap」这些都是线程不安全的集合类,但是它们的优点是性能好。是可以的,但是不推荐。HashMap 的大小只能是「2次幂」的,假设你传一个 10 进去,实际上最终 HashMap 的大小是 16,你传一个 7 进去,HashMap 最终的大小是 8 ,具体的实现在「tableSizeFor」可以看到。原创 2023-02-09 20:40:39 · 1297 阅读 · 1 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
补充: 深克隆的实现就是在引用类型所在的类实现 Cloneable 接口,并使用 public 访问修饰符重写 clone 方法。Java 中定义的 clone 没有深浅之分,都是统⼀的调用 Object 的 clone 方法。不⼀样,因为内存的分配方式不一样。直接看这位大佬的文章—>原创 2023-02-08 18:49:07 · 4393 阅读 · 3 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
Throwable」是异常的顶层父类,代表所有的非正常情况。它有两个直接子类,分别是「Error」「Exception」。Error 是错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用 catch 块来捕获Error 对象。在定义方法时,也无须在其 throws 子句中声明该方法可能抛出 Error 及其任何子类。原创 2023-02-07 19:11:58 · 5919 阅读 · 5 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
对象序列化是⼀个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序。从字节流创建对象的相反的过程称为反序列化。而创建的字节流是与平台无关的,在⼀个平台上序列化的对象可以在不同的平台上反序列化。序列化是为了解决在对象流进行读写操作时所引发的问题。原创 2023-02-06 18:45:56 · 3057 阅读 · 0 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
从上面的代码中可以看出:Java 对于 [-128, 127] 之间的数会进行缓存,比如:Integer i = 127,会将 127 进行缓存,下次再写 Integer j = 127 的时候,就会直接从缓存中取出,而对于这个区间之外的数就需要 new 了。比如,某个方法的参数类型为包装类型,调用时我们所持有的数据却是基本类型的值,则可以不做任何特殊的处理,直接将这个基本类型的值传入给方法即可。原始类型:boolean、char、byte、short、int、long、float、double。原创 2023-02-05 17:09:28 · 4319 阅读 · 1 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super() 来调用父类中特定的构造方法,则编译时将发生错误,因为Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是:在父类里加上⼀个不做事且没有参数的构造方法。原创 2023-02-04 20:39:56 · 661 阅读 · 0 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
代码块执行顺序:静态代码块——> 构造代码块 ——> 普通代码块。原创 2023-02-04 09:23:40 · 3698 阅读 · 2 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
面向对象是⼀种基于面向过程的编程思想,是向现实世界模型的自然延伸,这是⼀种“万物皆对象”的编程思想。由执行者变为指挥者,在现实生活中的任何物体都可以归为⼀类事物,而每⼀个个体都是⼀类事物的实例。面向对象的编程是以对象为中心,以消息为驱动。面向过程更注重事情的每一个步骤及顺序;面向对象更注重事情有哪些参与者(对象)、及各自需要什么;举个栗子 :比如洗衣机洗衣服。面向过程:会将任务拆解成一系列的步骤:打开洗衣机----->放衣服----->放洗衣粉----->清洗----->烘干;面向对象。原创 2023-02-04 09:10:40 · 575 阅读 · 0 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址(很多类重写了 equals ⽅法,比如 String、Integer 等把它变成了值比较,所以⼀般情况下 equals 比较的是值是否相等)。Java 中也不可以覆盖 private 的方法,因为 private 修饰的变量和方法只能在当前类中使用, 如果是其他的类继承当前类是不能访问到 private 变量或方法的,当然也不能覆盖。extends T>表示类型的上界为T,即参数化的类型可能是T也可能是T的子类。原创 2023-02-01 19:55:42 · 4414 阅读 · 2 评论 -
Java岗面试题--Java基础(日积月累,每日三题)
在 Java 的一些集合类的实现中,在比较两个对象是否相等时,会根据上面的原则,会先调用对象的 hashCode() 方法得到 hashCode 进行比较,如果 hashCode 不相同,就可以直接认为这两个对象不相同,如果 hashCode 相同,那么就会进一步调用 equals() 方法进行比较。所以我们就需要注意,如果我们重写了 equals() 方法,那么就要注意 hashCode() 方法,一定要保证能遵守上述规则。HashCode 介绍:hashCode() 的作用是获取哈希码,也称为散列码;原创 2023-01-31 20:02:15 · 2186 阅读 · 0 评论