java中高级面试题总结(全面)_java高级面试题大汇总

java中高级面试题总结(全面)_java高级面试题大汇总参考了网上的面试题,整理了一份面试题的资料。String,StringBuffer,StringBuilder的区别是什么?String为什么是不可变的?String是字符串常量,后两者是字符串变量。其中,StringBuffer是线程安全的,而StringBuilder是非线程安全的,线程安全会带来额外的开销,所以StringBuilde

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

参考了网上的面试题,整理了一份面试题的资料。

  1. String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?
    String是字符串常量,后两者是字符串变量。其中,StringBuffer是线程安全的,而StringBuilder是非线程安全的,线程安全会带来额外的开销,所以StringBuilder效率会高一些。
    String不可变是因为在JDK中String类被声明为一个final类。

  2. HashTable, HashMap,TreeMap区别?
    JAVA为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类。
    其中,HashMap是非线程安全的,HashTable是线程安全的。HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。HashTable使用Enumeration,HashMap使用Iterator。HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。
    TreeMap能够把它保存的记录根据键排序,默认是按升序排序。

  3. ConcurrentHashMap是怎么实现线程安全的?
    ConcurrentHashMap肯定不可能是每个方法加synchronized,那样就变成了HashTable。从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中。

  4. HashMap底层数据结构
    hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
    HashMap根据Key的hashCode来计算数组位置,如果得到相同的位置,则就近存储。
    HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。首先,HashMap类的属性中定义了Entry类型的数组。Entry类实现java.ultil.Map.Entry接口,同时每一对key和value是作为Entry类的属性被包装在Entry的类中。
    java中高级面试题总结(全面)_java高级面试题大汇总
    HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。table数组的元素是Entry类型的。每个 Entry元素其实就是一个key-value对,并且它持有一个指向下一个 Entry元素的引用,这就说明table数组的每个Entry元素同时也作为某个Entry链表的首节点,指向了该链表的下一个Entry元素,这就是所谓的“链表散列”数据结构,即数组和链表的结合体。

  5. HashMap的循环取值
    Map<String, String> map = new HashMap<String, String>(); for (Entry<String, String> entry : map.entrySet()) { entry.getKey(); entry.getValue(); }


  6. Vector,ArrayList, LinkedList的区别是什么?
    java中高级面试题总结(全面)_java高级面试题大汇总
    List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。
    Vector线程同步,ArrayList、LinkedList线程不同步。
    LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
    ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。

    对于需要快速插入,删除元素,应该使用LinkedList。
    对于需要快速随机访问元素,应该使用ArrayList。
    对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
    对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

  7. 面向对象的特性
    继承:从多个子类中抽象出实例变量以及方法,形成更抽象的父类,避免在子类中的代码重复,维护起来更加方便。
    多态:即一个父类的引用可以指向任意一个子类对象。它的好处就是可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
    重写:重写就是要求方法参数完全一样,这样才会覆盖掉父类中的同名方法。
    重载:重载要求的是参数列表一定要不一样。即子类中可以增加一个和父类中完全一样的方法,但是参数不一样,当子类对象调用方法时,根据参数列表来判断应该调用父类中的方法还是子类中的方法。
    接口:继承只是个开始,要使用多态,我们还需要接口。Interface 是一种100%纯抽象的类。
    抽象类:有些类根本就不应该被初始化!抽象类不能初始化!但是可以用抽象类型作为一个引用类型。这也是为何当初要有抽象类型的目的。修饰符:abstract。抽象类是除了被继承之外没有其他用途,没有值,没有目的的类。它可以带有抽象和非抽象的方法。

  8. Path 和 Classpath的区别是什么?
    Path和Classpath都是操作系统级的环境变量。Path是告诉操作系统到哪里找到可执行文件的,Classpath是告诉操作系统到哪里找到.class文件的。

  9. Java应用中哪个包是默认被import的?
    java.lang是被默认导入的,就算没有import声明。

  10. sleep() 和 wait() 有什么区别?
    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

  11. abstract class和interface有什么区别?
    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
    接 口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有 程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。 然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到 接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

  12. CLASS.FORNAME和CLASSLOADER.LOADCLASS的区别
    Class.forName(className)装载的class已经被初始化,执行类中的static块;而ClassLoader.loadClass(className)装载的class还没有被link。
    一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。

  13. JAVA基本数据类型和字节大小
    byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
    short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
    int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
    long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
    float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
    double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
    boolean:只有true和false两个取值。1位
    char:16位,存储Unicode码,用单引号赋值。
    字节=位数/8

  14. 什么是NIO?
    NIO是New IO 的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O。

  15. 同步与异步IO、阻塞与非阻塞IO 
    同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
    异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成状态、通知和回调来通知调用者。
    阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在 得到结果之后才会返回。
    非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

  16. 字符流和字节流的区别,使用场景
    Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。
    Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换InputStreamReader 和 OutputStreamWri处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
    字符流只能处理文本类文件,字节流可以处理任意文件;

  17. Java创建线程之后,直接调用start()方法和run()的区别
    start:用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
    run:run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。

  18. 线程有几种状态
    在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。 
    第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 
    第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 
    第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。 
    第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。 
    第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。 

  19. char 型变量中能不能存贮一个中文汉字,为什么?
    char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

  20. Java中如何实现序列化,有什么意义? 
    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。 
    要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。

  21. 如何通过反射调用对象的方法? 
    import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str)); // HELLO } }


  22. 面向对象原则
    单一职责原则:一个类只做它该做的事情。
    开闭原则:软件实体应当对扩展开放,对修改关闭。
    依赖倒转原则:面向接口编程。
    里氏替换原则:任何时候都可以用子类型替换掉父类型。
    接口隔离原则:接口要小而专,绝不能大而全
    合成聚合复用原则:优先使用聚合或合成关系复用代码。
    迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

  23. java当中float以及double数据类型的掌握
    java当中默认声明的小数是double类型的;
    double d=4.0
    如果声明:
    float x = 4.0则会报错,需要如下写法:
    float x = 4.0f或者float x = (float)4.0
    其中4.0f后面的f只是为了区别double,并不代表任何数字上的意义

    float 内存分配4个字节,占32位,有效小数位6-7位
    double 型 内存分配8个字节,有效小数位15位

    float和double只能用来做科学计算或者是工程计算; 在商业计算中我们要用java.math.BigDecimal。

    public static double add(double v1,double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } 

    BigDecimal是通过使用compareTo(BigDecimal)来比较的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171444.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • eclipse下载及安装教程[通俗易懂]

    eclipse下载及安装教程[通俗易懂]eclipse下载及安装教程Java编程最好的集成开发工具就是IBM研发的Eclipse软件,Eclipse完全免费,是java开发人员的必备平台。进入eclipse下载页,界面如下图所示:(附加官网下载链接:https://www.eclipse.org/downloads/)eclispe提供了两种下载方式。一种是下载安装程序,下载后直接运行安装程序,根据安装程序的提示选择安装选项并完成安装;一种是下载具有不同功能项的eclispe压缩包,下载后手动解压即可。第一种——安装程序方式

  • 新经济政策商品经济_2021年国际商务热点

    新经济政策商品经济_2021年国际商务热点新经济的50个新热点2005-06-2114:09  中国机电企业网10多年来,新经济一直沿着“技术发展”和“应用创新”这两个方向奔跑。  这两个方向可以被看作既分立又统一的一对“双螺旋”——技术发展创造了应用的创新环境,而应用的创新往往很快就会触到技术的极限,进而鞭策技术的进一步演进。  在技术和应用这两条线上都可以诞生出引人入胜的商业创意,但是只有当技术和应用的激烈碰撞达到一定的融合程

  • Unity安装VScode「建议收藏」

    Unity安装VScode「建议收藏」https://code.visualstudio.com/下载好之后,打开unity edit-  preferenceexternaltools openbyfileextension,点开,Browse,然后选你VSCode.exe的位置。  之后双击打开会有我这个是安装好扩展的界面,大概就是要 左边这个几个安装好之后可能打出不来提示,重…

  • jmeter怎么测性能(vs性能测试)

    1.背景介绍XXX认证要求测试合作伙伴的APP服务器性能,主要涉及APP服务器最大的并发请求消息处理能力,根据《XXX认证解决方案设计说明书》里的要求,APP服务器并发数量为2500packet/s,即在10秒内的第1秒达到2500packet/s,后面9秒等待APP服务器处理。2.测试需求APP服务器并发请求消息处理能力为2500packet/s3.测试用例名称预置条件测试步骤预期结果APP处理北向推送数据的能力1.在公有云上完成

  • 液压油报关_液压油算是危险品吗

    液压油报关_液压油算是危险品吗  韩国液压油进口代理报关知识整理  液压油就是我们利用液体压力能的液压控制系统可以使用的液压介质,在液压技术系统中起着能量信息传递、抗磨、系统进行润滑、防腐、防锈、冷却等作用。对于液压油,首先要满足液压装置在工作温度和启动温度下的液体粘度要求,因为润滑油的粘度变化直接关系到液压作用、传动效率和传动精度,还要求润滑油的粘温性能和剪切稳定性能满足不同用途的需要。液压油的种类繁多,分类管理方法各异,长期发展以来,习惯以用途可以进行垃圾分类,也有学生根据不同油品类型、化学组分或可燃性分类的。这些分类方法只反

  • python自动化运维脚本范例

    python自动化运维脚本范例

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号