JavaSE知识点总结
文章目录1、intern()方法2、try...catch...finally3、hashCode和equals的关系4、什么是反射反射有什么缺点5、BIO同步阻塞、NIO同步非阻塞、AIO异步非阻塞的区别6、**面向对象的理解**7、什么是抽象类8、什么是接口9、抽象类和接口的区别10、什么是泛型11、异常12、注解13、反射14、static和final的区别以及分别存储在JVM的哪个区域15、Linux的五种IO模型16、Reactor线程模型详解17、IO零拷贝1、intern()方法“ab”.intern()这个方法会首先检查字符串常量池中是否有”ab”这个字符串如果存在则返回这个字符串常量池中的引用否则就将这个字符串在堆中的引用添加到字符串常量池中然后返回这个常量常量池中字符串的引用。以下代码是在jdk1.8中测试jdk1.6会有所不同。publicstaticvoidmain(String[]args){// 创建2个对象一个String对象在堆中一个String常量在常量池StringsnewString(2);// 判断s是否在常量池中存在则返回常量池中对象的引用此时intern指向常量池中的对象Stringinterns.intern();// s2字符串在常量池中所以返回常量池中的对象引用Strings22;// s:为堆中对象 s2:为常量池对象 所以falseSystem.out.println(ss2);// false// intern和s2都是指向常量池中的字符串所以trueSystem.out.println(interns2);// trueSystem.out.println(sintern);//falseSystem.out.println(------------------------);// 创建4个对象堆中33,3,3对象常量池:3对象Strings3newString(3)newString(3);// 判断s3是否在常量池中不存在则将s3加入常量池中并且常量池中保存的是s3的引用返回常量池中对象的引用此时s3和intern2指向同一个对象Stringintern2s3.intern();// s4字符串在常量池中所以返回常量池中的对象引用Strings433;// s3和intern2和s4指向的是同一个对象System.out.println(s3s4);// trueSystem.out.println(intern2s3);// trueSystem.out.println(intern2s4);// trueSystem.out.println(------------------------);// 创建4个对象堆中33,3,3对象常量池:3对象Strings5newString(3)newString(3);// s6字符串不在常量池中将字符串放入字符串常量池中此时与堆中的引用不同Strings633;// 判断s5是否在常量池中存在Stringintern3s5.intern();System.out.println(s5s6);// falseSystem.out.println(s6intern3);// trueSystem.out.println(s5intern3);//false}2、try…catch…finallyreturn 先把【要返回的值】保存起来然后执行 finallyfinally 里如果重新 return会覆盖返回值finally 仅修改变量不 return不会改变已经保存好的返回值。// 返回 40publicstaticintfun(){inta10;try{System.out.println(a/0);a20;// return a;}catch(Exceptione){a30;returna;}finally{a40;returna;}}// 返回 30publicstaticintfun(){inta10;try{System.out.println(a/0);a20;// return a;}catch(Exceptione){a30;returna;}finally{a40;}returna;}// 返回 30publicstaticintfun(){inta10;try{System.out.println(a/0);a20;returna;}catch(Exceptione){a30;returna;}finally{a40;}}3、hashCode和equals的关系约定如果equals(a,b) true那么a.hashCode()必须等于b.hashCode()如果a.hashCode() b.hashCode()不代表equals(a,b)true哈希碰撞如果equals重写了一定要重写 hashCode否则破坏约定使用Object.hashCode是根据随机算法生成的hashCode值(hash碰撞)无法保证两个对象equals相等的时候hashCode也相等。重写equals时必须要重写hashCode原因像一些集合容器map在进行比较两个对象相等的判定条件是hashcode和equals都相等所有在重写equals时必须要重写hashCode才能保证集合容器的正确使用。Object 默认 hashCode ()native 方法生成 identity hash code存在对象头 mark word不是内存地址Object默认equals()默认比较对象地址4、什么是反射反射有什么缺点反射是指在程序运行时动态获取类的信息、调用类的方法、访问类的属性等操作能力。在Java中反射允许程序在运行时检查和操作类、方法、字段等使得程序可以在运行时动态地创建对象、调用方法、修改属性等。优点运行时动态操作类解耦实现通用框架可以访问私有成员缺点性能低破坏封装编译不校验问题运行才暴露setAccessible(true)是修改访问权限吗答案不是修改源码的 private 修饰符只是关闭 JDK 的访问权限检查。5、BIO同步阻塞、NIO同步非阻塞、AIO异步非阻塞的区别同步应用线程主动发起 IO 拷贝将内核数据拷贝到应用内存中read/write异步内核读完数据从内核到应用内存才主动回调通知应用阻塞调用IO等API时没有数据线程挂起非阻塞没有数据直接返回不卡线程同步异步关键IO 数据拷贝是谁来做阻塞非阻塞调用 API 无数据会不会卡住线程。BIO 是同步阻塞 IO一连接一线程。来一个客户端就新建一个线程线程阻塞在 read连接多线程爆炸适合连接数少场景。NIO 是同步非阻塞 IO基于多路复用Linux 底层 epoll。少量线程监听大量连接Selector 监听 fd 就绪事件内核通知就绪后应用线程自己调用 read 拷贝数据Netty 底层就是 NIO适合高并发长连接。AIO 是异步非阻塞 IO。应用发起读请求直接返回内核把数据全部拷贝到用户缓冲区后回调通知程序Linux 原生 AIO 有缺陷Java 很少落地。6、面向对象的理解面向对象OOP是一种编程思想把程序看作多个对象的交互面向对象的核心是将现实世界的实体抽象为代码中的’对象’每个对象包含数据属性和操作数据的方法形成高内聚低耦合的模块。这样设计更符合人类思维方式让程序结构更清晰。它有四大特性封装将数据和方法封装在类内部隐藏内部细节只暴露必要接口提高安全性和维护性降低耦合。继承子类复用父类代码建立类之间的层次关系。extends关键字Java只有单继承接口可以多实现。多态同一接口行为不同对象有不同实现提高代码灵活性、拓展性。extends/implement 都是实现方式。编译时多态方法重载运行时多态方法重写。抽象抽取通用规范只定义方法签名让子类实现。抽象类abstract class、接口interface。面向过程关注怎么做步骤面向对象关注谁来做对象。在过往的项目中面向对象的思想和特性帮助我们快速响应需求变更、降低代码维护成本、提高代码质量。但我们也要平衡面向对象与其他范式函数式编程的优势防止过度设计增加系统的复杂度。7、什么是抽象类抽象类是用来捕捉子类通用特性的类它不能被实例化只能作为其他类的父类。抽象类特点用abstract关键字声明可以包含抽象方法和具体方法可以有构造方法、成员变量子类继承使用extends一个类只能继承一个抽象类单继承8、什么是接口接口是行为的抽象定义了一组方法规范实现类必须遵守这些规范。接口特点用interface关键字声明Java 8之前只能有抽象方法和常量Java 8可以有默认方法、静态方法Java 9可以有私有方法实现类使用implements一个类可以实现多个接口9、抽象类和接口的区别设计理念不同抽象类是’is-a’关系继承接口是’has-a’关系组合单继承 vs 多实现Java中类只能继承一个父类但可实现多个接口抽象类可以有构造方法和具体实现早期接口只能有抽象方法成员变量方面抽象类可以是普通变量接口只能是常量10、什么是泛型Java 泛型generics是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型也就是说所操作的数据类型被指定为一个参数。好处1.可以将运行期的异常提前到编译期2.消除强制类型转换3.提高了类型安全泛型的三种方式泛型类泛型接口泛型方法11、异常Java中所有异常和错误的根类是Throwable它有两个直接子类Error和Exception(受检异常 or 非受检异常)。定义异常是程序运行过程中发生的不正常事件会打断正常的指令流。分类分为受检异常和非受检异常错误和运行时异常。异常处理机制try-catch-finallythrow和throws。自定义异常可以通过继承Exception或RuntimeException来创建自定义异常。最佳实践例如不要吞掉异常不要使用异常控制流程使用具体的异常类型等。常见运行时异常NullPointerException空指针异常JAVA8中可用Optional来避免一般是代码中出现了空对象时抛出该异常IndexOutOfBoundsException数组下标越界异常当使用的数组下标超出数组允许范围时抛出该异常ClassCastException类型转换异常当试图将对象强制转换为不是实例的子类时抛出该异常NumberFormatException数字格式化异常当试图将一个String转换为指定的数字类型而该字符串确不满足数字类型要求的格式时抛出该异常JSONExceptionJSON异常进行JSON格式化操作时出现异常会抛出该异常ArithmeticException算术异常常见检查性异常SQLExceptionSQL异常IOExceptionIO异常在对流操作时有可能会出现的异常FileNotFoundException找不到某个文件时会抛出该异常ClassNotFoundException找不到某个类时会抛出该异常InterruptedException中断异常12、注解Java 注解Annotation又称 Java 标注是 JDK5.0 引入的一种注释机制。继承自java.lang.annotation.Annotation。注解本身不影响代码逻辑但可以通过反射获取注解信息。packagejava.lang.annotation;publicinterfaceAnnotation{booleanequals(Objectobj);inthashCode();StringtoString();Class?extendsAnnotationannotationType();}内置注解Override - 检查该方法是否是重写方法。如果发现其父类或者是引用的接口中并没有该方法时会报编译错误。Deprecated - 标记过时方法。如果使用该方法会报编译警告。SuppressWarnings - 指示编译器去忽略注解中声明的警告。SafeVarargs - Java 7 开始支持忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。FunctionalInterface - Java 8 开始支持标识一个匿名函数或函数式接口。Repeatable - Java 8 开始支持标识某注解可以在同一个声明上使用多次。自定义注解DocumentedTarget(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)publicinterfaceMyAnnotation1{}元注解元注解的作用就是负责注解其他注解Java定义了4个标准的meta-annotation类型他们被用来提供对其他annotion类型作说明。Retention - 标识这个注解怎么保存是只在代码中还是编入class文件中或者是在运行时可以通过反射访问。Documented - 标记这些注解是否包含在用户文档中。Target - 标记这个注解应该是哪种 Java 成员。Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)Retention 的取值publicenumRetentionPolicy{SOURCE,/* Annotation信息仅存在于编译器处理期间编译器处理完之后就没有该Annotation信息了 */CLASS,/* 编译器将Annotation存储于类对应的.class文件中。默认行为 */RUNTIME/* 编译器将Annotation存储于class文件中并且可由JVM读入 */}Target的取值publicenumElementType{TYPE,/* 类、接口包括注释类型或枚举声明 */FIELD,/* 字段声明包括枚举常量 */METHOD,/* 方法声明 */PARAMETER,/* 参数声明 */CONSTRUCTOR,/* 构造方法声明 */LOCAL_VARIABLE,/* 局部变量声明 */ANNOTATION_TYPE,/* 注释类型声明 */PACKAGE/* 包声明 */}注解的主要价值编译检查如Override确保正确重写方法框架配置如Spring的Autowired、Service简化配置代码生成如Lombok的Data自动生成代码测试标记如JUnit的Test13、反射反射就是在运行状态能够动态的获取该类的属性和方法并且能够任意的使用该类的属性和方法这种动态获取类信息以及动态的调用对象的方法的功能就是反射。它让Java在运行时具有像动态语言一样的特性。核心功能包括动态获取类信息Class对象创建对象newInstance调用方法invoke访问/修改字段get/set处理注解和泛型关键类Class类的元数据入口Field字段信息Method方法信息Constructor构造方法Modifier修饰符信息实际应用场景框架开发Spring通过反射实现依赖注入动态代理AOP切面编程序列化工具Jackson/GSON处理JSON测试框架JUnit发现并运行测试方法插件系统动态加载和扩展功能优点灵活性高实现动态编程框架开发的基础设施支持运行时类型检查缺点性能开销反射操作比直接调用慢安全问题可以绕过访问控制代码复杂降低可读性和维护性编译检查缺失错误在运行时才发现性能优化缓存反射对象使用setAccessible(true)减少检查避免在热点代码中使用反射获取class对象三种方式类名.class如Person.class 该方式安全可靠程序性能最高对象.getClass()如person.getClass()Class.forName(全类名)如Class.forName(“ldc.org. demo.person”)总结反射是Java在运行时动态获取和操作类信息的能力。通过Class对象可以获取字段、方法、构造器等信息并能创建对象、调用方法、访问字段。它广泛应用于框架开发如Spring、动态代理、序列化等场景。优点是灵活性高缺点是性能差、安全性低。实际使用中需要注意性能优化和安全控制。14、static和final的区别以及分别存储在JVM的哪个区域维度staticfinal语义类级成员与对象无关值/引用只能赋一次内存份数整个 JVM 只有一份与普通字段份数相同生命周期类加载即分配卸载才回收一旦赋值就冻结可变性可反复修改不可再改基本类型值不变引用类型地址不变能否叠加✅ 可单独用✅ 可单独用叠加后类级常量编译期或运行期确定仍是“只能一次”语义类型static存储位置实例 final存储位置static final存储位置优化后值直接内联到使用处引用存在堆Class对象中局部变量基本类型变量堆Class对象中堆对象中元空间运行时常量池栈字符串变量堆Class对象中的引用 堆字符串常量池堆对象的引用 -- 堆字符串常量池元空间运行时常量池– 堆字符串常量池栈引用– 堆字符串常量池对象引用堆Class对象中的引用 堆对象堆对象的引用 堆对象元空间运行时常量池– 堆对象栈引用 -- 堆对象方法元空间元空间类元空间元空间代码块元空间–15、Linux的五种IO模型https://blog.csdn.net/Linging_24/article/details/134984317?spm1001.2014.3001.550116、Reactor线程模型详解https://blog.csdn.net/Linging_24/article/details/134984818?spm1001.2014.3001.550117、IO零拷贝https://blog.csdn.net/Linging_24/article/details/134984466?spm1001.2014.3001.5501
上一篇/下一篇内容由系统自动关联
返回资讯列表 →