ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

java 面试题总结(基础篇)

java 面试题总结(基础篇) 一、编程基础1.JDK、JRE、JVM的区别JVMJava Virtual MachineJava虚拟机负责加载、执行字节码文件.class和垃圾回收等任务。JREjava Runtime Environment:Java运行环境包含了JVM和java程序运行时库APIJDKJava Development Kit:Java开发工具包包含了JRE和java开发工具2.基本数据类型有哪些byte字节型存整数占1个字节范围-128到127short短整型占2个字节-32768到32767int最常用 整型占4个字节-2^ 31到2^31long:长整型占8个字节float单精度浮点数存小数占4个字节赋值要加f或F不能表示精确的数double双精度浮点数占8个字节不能表示精确的数boolean布尔型只能存储true或false占1个字节char字符型采用Unicode编码格式存单个字符占2个字节3.说说java中的数组在Java中数组是用于存储相同类型元素的容器。是等长对象可以通过索引来访问和操作元素。使用前需要被声明。type[]arrayName;//声明数组arrayNamenewtype[length];//赋值int[]numbersnewint[5];numbersnewint[]{1,2,3,4,5};for(inti0;inumbers.length;i){System.out.println(numbers[i]));}//或者直接赋值int[]numbers{1,2,3,4,5};多维数组是多个一维数组组成的数据结构可以表示一个表格或矩阵具有行、列的概念第一个索引代表行第二个代表列4.Java中的三大特性是什么各个描述一下优劣势封装允许将数据和方法包装在一个类中并对外隐藏内部细节。优势①数据隐藏定义私有private关键字避免外界直接访问和修改对象的数据提高了数据的安全性和可靠性。②隔离复杂性将类的视线细节隐藏起来质保路必要的接口给外界使用者减少了对外部的依赖减低了类之间的复杂性。③提供公共接口定义public公共接口对外提供统一的访问和操作方式提供更好的交互方法便于使用和维护。劣势需要对内部成员的可见性仔细控制增加了程序员的代码细节要求继承:允许一个派生类通过extends关键字继承基类可以使用基类的属性和方法优势**①代码复用**派生类可以直接使用负类属性和方法提高了代码复用性**②扩展性**派生类可以重写基类方法在继承的方法上进修修改扩展添加新的属性和方法以满足不同需求劣势①层次过深复杂增加了类之间的关系和依赖强耦合导致基类修改时可能会影响所有的派生类②单一继承限制: 一个类只能继承一个基类某些情况下会限制程序设计。克服继承的劣势可以采用**接口Interface**等替代继承可实现多个接口多态:有多种形态同一个类型的变量引用不同类型的对象动态的执行相应的方法。条件存在继承关系、重写基类的方法、用基类类型的引用变量来引用派生类对象优势①灵活性: 通过统一的接口来操作不同的对象提高了代码的灵活性和可维护性。当需求变化时只需要更换具体的子类对象而无需修改现有的代码。②方法的回调: 可以将一个对象作为参数传递给其他方法③提高代码可读性代码更易读劣势过度抽象化、开销不确定、复杂性提高5.重写和重载的区别重写发生在父子类中方法名相同参数列表相同方法体不同方法的重写override两同两小一大原则方法名相同参数类型相同子类返回类型小于等于父类方法返回类型子类抛出异常小于等于父类方法抛出异常子类访问权限大于等于父类方法访问权限。重载同一类中方法名相同参数列表不同6.描述一下抽象类的特点abstract关键字修饰可用在变量、常量、方法派生类可继承有抽象方法的必须得是抽象类派生类可重写抽象方法7. 和equals方法的含义 比较的是变量栈内存中存放的对象堆的内存地址用于判断两个对象地址是否相同①两边的操作数必须是同一类型包括父子类②当两边对象里是具体的数字则是比较值相同equals比较两个对象的内容是否相等重写后用于String类型对象的比较重写前在比较引用类型的变量时和一样。8.说说JAVA中的this关键字表示当前对象①引用当前对象②解决命名冲突方法内部存在与成员变量同名时可以用this防冲突表示当前对象成员变量③引用其他构造方法可用用this其他构造方法调用9.static关键字的作用①修饰变量表示静态变量属于类。在程序启动时就会被初始化且该类的所有实例共享同一个静态变量类名直接访问②修饰方法表示静态方法类名直接调用无需创建实例只能直接访问静态变量和调用静态方法不能被重写只能被隐藏③静态代码块在类加载时就执行且一次用于类的初始化操作二、API应用1.String/StringBuffer/StringBuilder有什么不同①可变性String 是不可变的类一旦创建了对象就不能修改其内容对字符串进修拼接、插入或删除等都会重新创建新的对象StringBuffer和StringBuilder是可变的类支持对字符串动态修改是用地址指向对象②线程安全性String是安全的适用于多线程StringBuffer是线程安全的方法使用了synchronized关键字进修同步StringBuilder是线程不安全的③性能StringBuilder StringBuffer 线性安全影响了性能。String 在常量池的使用上是性能优化了的但是在频繁的字符串拼接操作中会创建大量的临时对象性能会受到影响2.说说ArrayList的特点及应用场景ArrayList是java中的集合的一种常用的动态数组实现类继承了AbstractList抽象类特点①动态数组底层是具有动态扩容的特性添加和删除元素时可以自动调整底层数组大小②随机访问获取元素是通过索引随机访问③允许存储重复元素通过索引访问和修改④非线性安全不适用多线程的并发操作⑤插入和删除效率较低需要移动其他元素应用场景需要快速访问元素频繁访问的场景3.LinkedList的特点及使用场景java中常用的双向链表实现类高效的插入和删除只需要修改节点的引用不需要进行元素的移动和复制可用作栈和队列实现了Deque接口非线性安全应用场景频繁进行插入和删除操作的场景4.HashMap特点及应用场景高效的查找和插入操作HashMap的底层是通过哈希表实现的使用率哈希函数将键转换为数组索引。键值对存储每个键都是唯一的。通过键可以快速查找对应的值。HashMap中的键和值都可以为null但一个HashMap只能有一个null键。无序的元素元素的存储顺序不固定如果需要有序可以考虑使用LinkedHashMap线程不安全多线程环境下可能会导致数据不一致的问题。如果需要在多线程下安全的使用可以考虑ConcurrentHashMap可变大小动态调整根据实际元素数量自动扩容和收缩应用场景适用于根据键快速查找对应值的时候缓存、数据索引、字典等4. 泛型及应用提供了编译时类型安全监测机制本质是参数化类型允许类、接口、方法的定义中使用类型参数指定数据类型提高了代码的安全性和可读性泛型类和接口 通过尖括号指定类型 ListE 表示一个可以存放元素类型为E的列表类型通配符当我们不知道用什么类型时用和extends Type? 代表位置类型? extends [Type]可以存放类型或其子类的列表? super [Type]表示存放类型或其类型的父类类型泛型擦除只是在编译器这个层次实现字节码文件中是不包含泛型的类型信息的编译时被去掉这就是泛型擦除避免了强制类型转换重用性提高将类型参数化可以使得同一段代码可以使用与不同类型的数据5.创建对象的方式使用new关键字使用Class类的newInstance() 方法反射机制MyObjectobjMyClass.class.newInstabnce()使用Constructor类的newInstance方法反射机制ConstructMyClassconstructorMyClass.class.getConstructor(String.class)MyClassobjconstructor.newInstance(parameter)使用clone方法类实现Cloneable接口MyObjectobj2(MyObject)obj.clone();使用反序列化类实现Serializable接口将对象转换为字节序列再将序列转换为对象ObjectInputStreaminnewObjectInputStream(newFileInputStream(file.ser));MyObjectobj(MyObject)in.readObject();6.细说一下Java线程对象状态新建状态New:线程对象创建后尚未启动即没有调用start()方法初始化操作可以进行就绪状态Runnable线程对象已经准备好执行并且等待获取CPU时间片运行状态Running正在执行run()方法中的代码阻塞状态Blocked线程对象由于某些原因暂时无法执行需要等待唤醒或满足特点条件等待状态Waiting等待其他线程的特点操作无法被唤醒waitjoin(),park()方法等终止状态Terminated:执行完run()方法或者出现了异常而终止7.说一下synchronized关键字用于实现线程之间的同步保证多线程访问共享资源时的安全性修饰方法使用该关键字修饰的方法称为同步方法。当线程访问该方法时会自动获得该方法所在对象的监视器其他线程则被阻塞直到该线程执行完释放锁是隐式获取锁的方式锁是该方法所在对象的实例锁修饰代码块称为同步块需要指定获取锁的对象或者类锁可以是任意对象也可以是使用this关键字表示当前对象的实例锁还可以使用类名.class表示类锁8.说说对反射技术的理解反射技术是Java中一种强大的功能允许程序 运行时动态地获取和操作类的名称、方法、属性等信息动态的创建对象调用方法访问和修改属性及执行其他与类相关的操作。核心是一组类和接口Class类类或接口、Constructor类构造方法、Method类方法、Field类属性先获取类的字节码对象①通过class.类名②forName(包名.类名)方法动态创建对象Class类的newInstance方法相当于无参构造Class?clazzMyClass.class;​Objectobjclazz.newInstance();动态调用方法Method类的invoke()方法可以调用类的方法Methodmethodclazz.getMethod(methodName,int.class);​Objectresultmethod.invoke(obj,123);动态访问和修改字段通过Filed类Class?clazzMyClass.class;​Objectobjclazz.newInstance();​Fieldfieldclazz.getDeclaredField(fieldName);//此field是你的属性名​field.setAccessible(true);// 设置访问权限Objectvaluefield.get(obj);// 获取字段的值​field.set(obj,newValue);// 设置字段的值使得程序具有更大的灵活性和扩展性同时也带来了一定的性能开销9.HashMap如何解决散列冲突散列冲突指多个元素哈希值映射到了同一个桶中。HashMap会在该桶上使用链表或红黑树来存储冲突的元素。jdk8之后当链表的长度超过阈值默认8并且数组大小大于等于64HashMap会将链表转换为红黑树从而提高在冲突桶的查找和删除性能。当红黑树的节点数量小于等于6时HashMap会将红黑树转换回链表结构以节省内存开销。10.常用日期API有哪些主要集中在java.time包中java8引入①LocalDate表示日期包含年月日②LocalTime表示时间包含时分秒③LocalDateTime日期和时间结合④Instant:表示时间戳代表从1970年1月1日开始的纳秒数。⑤Duration用于处理时间段的类表示秒、纳秒等单位的时间差⑥DateTimeFormatter提供格式化和解析日期时间字符串的功能⑦Date和Calendar早期使用的日期API⑧SimpleDateFormat用于格式化和解析日期时间字符串使用较为方便线程不安全11.wait、notify、notifyAll方法应用这些方法可以实现线程直接的通讯必须使用在同步方法和同步代码块内部由对象锁调用①wait方法使当前线程进入等待状态同事会放弃对象锁并且等待其他线程调用同一对象的notify或notifyAll方法来唤醒②notify用于唤醒同一对象上调用wait方法进入等待状态的线程只能唤醒同一对象的多个线程其中一个并由系统决定唤醒哪个线程③notifyAll可以唤醒同一对象上的所有线程12.描述一下线程池的常见参数①corePoolSize线程池大小表示核心线程的数量一直存活即使没有任务②maximumPoolSize最大池大小表示线程池最大线程的数量当工作队列已满并且线程数小于最大池大小线程池才会创建新的线程来处理任务③keepAliveTime线程空闲时间表示线程数量超过最大池大小空闲线程的存活时间默认是立即销毁多余线程④unit时间单位和keepAliveTime搭配使用分为NANOSECONDS 纳秒、MICROSECONDS 微秒、MILLISECONDS 毫秒、SECONDS 秒、MINUTES 分钟、HOURS 小时、DAYS 天⑤workQueue工作队列存储等待执行的任务。⑥threadFactory线程工厂创建新线程⑦handler拒绝策略处理线程池队列已满且无法接受新任务时的情况AbortPolicy 丢弃任务抛出RejectedExecutionException异常默认、allerRunsPolicy 由调用线程执行、DiscardPolicy 丢弃任务 不抛异常、DiscardOldestPolicy 丢弃最前面的任务喜新厌旧、自定义策略Java面试题总结提高篇
返回列表