ARTICLE DETAIL

资讯详情

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

java学习过程中遇到的问题

java学习过程中遇到的问题 //打印菱形,分为两部分:正等腰三角形,倒等腰三角形 public static void main(String[] args) { Scanner sc new Scanner(System.in); System.out.println(请输入奇数:); int num sc.nextInt(); if (num % 2 0) { return; } int mid num / 2; //第一部分:正等腰三角形--------------- //外层循环控制打印行数 for (int i 0; i mid; i) { //打印空格 for (int j 0; j mid - i; j) { System.out.print( ); } //打印*号,个数是2*i1 for (int k 0; k 2 * i 1; k) { //换成这两行就是打印字母菱形图 //char ch (char) (Ai); //System.out.print(ch); System.out.print(*); } System.out.println(); } //第二部分:倒等腰三角形---------------- //只需将i倒序遍历,其他不变 for (int i mid - 1; i 0; i--) { for (int j 0; j mid - i; j) { System.out.print( ); } for (int k 0; k 2 * i 1; k) { //换成这两行就是打印字母菱形图 //char ch (char) (Ai); //System.out.print(ch); System.out.print(*); } System.out.println(); } }一、Java 基础1.和equals()的区别比较基本类型时比值比较引用类型时比内存地址。equals()是Object的方法默认比较地址但String、Integer等重写后比较内容。自定义类需要重写equals()才能实现内容比较。2.String、StringBuilder、StringBuffer的区别String不可变每次修改都会生成新对象线程安全。StringBuilder可变非线程安全性能高。StringBuffer可变方法用synchronized修饰线程安全性能稍低。3. 接口和抽象类的区别抽象类可以有构造方法、普通成员变量、具体方法接口Java 8 之前只能有常量和抽象方法。类只能单继承抽象类但可以实现多个接口。接口强调行为规范抽象类强调代码复用和 is-a 关系。4. 深拷贝与浅拷贝浅拷贝复制对象时基本类型复制值引用类型复制引用地址原对象和副本共享内部对象。深拷贝复制对象时引用类型也递归复制一份两者完全独立。实现方式重写clone()、序列化、手动复制等。5. Java 异常体系Throwable是所有异常和错误的父类。Error系统级错误程序无法处理如OOM、StackOverflowError。Exception程序可处理的异常分为运行时异常RuntimeException和受检异常Checked Exception。常见运行时异常NullPointerException、IndexOutOfBoundsException、ClassCastException、IllegalArgumentException。受检异常必须显式捕获或抛出如IOException、SQLException。6. 泛型与类型擦除泛型提供编译期类型检查避免强制类型转换。Java 泛型在编译后会被擦除替换为边界类型或Object。不能使用基本类型作为泛型参数不能创建泛型数组。7.final、finally的区别final修饰类不可继承修饰方法不可重写修饰变量不可变引用不可变对象内容可变。finally异常处理中一定会执行的代码块除System.exit()或 JVM 崩溃。二、集合框架1.ArrayListArrayList基于动态数组ArrayList扩容默认增加原容量的一半2.HashMap的底层原理JDK 8 之前数组 链表JDK 8 之后数组 链表 红黑树。通过key.hashCode()计算哈希值定位桶下标。链表长度超过 8 且数组长度 ≥ 64 时链表转红黑树。默认容量 16负载因子 0.75扩容为原来的 2 倍。3.HashMap的扩容机制当元素数量超过capacity * loadFactor时触发扩容。扩容时重新计算每个元素在新数组中的位置数据迁移。JDK 8 中利用高位运算判断元素是留在原位置还是移动到“原位置 旧容量”。4. 集合工具类Collections和ArraysCollections提供排序、反转、同步包装、不可变集合等方法。Arrays提供数组转 List、排序、二分查找、填充等方法。三、JVM1. JVM 内存区域程序计数器线程私有记录指令地址。Java 虚拟机栈线程私有存储栈帧局部变量表、操作数栈等。本地方法栈执行 Native 方法。堆对象实例分配区域垃圾回收主要区域。方法区元空间类信息、常量、静态变量。运行时常量池存放编译期生成的字面量和符号引用。2. 堆和栈的区别堆线程共享存放对象GC 管理内存可动态扩展。栈线程私有存放方法调用和局部变量生命周期随线程结束。3. 类加载过程加载 → 验证 → 准备 → 解析 → 初始化。加载读取字节码生成Class对象。验证检查字节码合法性。准备为静态变量分配内存并赋默认值。解析将符号引用替换为直接引用。初始化执行静态变量赋值和静态代码块。4. 双亲委派模型类加载器层级启动类加载器 → 扩展类加载器 → 应用程序类加载器。加载时先委派父加载器父加载器无法加载时才由子加载器加载。作用避免类重复加载保护核心类库安全。5. 如何判断对象可回收引用计数法有循环引用问题Java 不使用。可达性分析从 GC Roots 出发不可达的对象可回收。GC Roots 包括栈中引用、静态变量、常量、JNI 引用。6. 垃圾回收算法标记-清除产生内存碎片。复制算法空间利用率低适合新生代。标记-整理移动对象消除碎片适合老年代。分代收集新生代用复制老年代用标记-整理或标记-清除。7. 常见垃圾收集器Serial单线程适合客户端。ParNewSerial 的多线程版本。Parallel Scavenge关注吞吐量。CMS关注低延迟有碎片问题。G1区域化分代可预测停顿。ZGC/Shenandoah低延迟大堆。8. 对象创建过程类加载检查 → 分配内存指针碰撞或空闲列表→ 初始化零值 → 设置对象头 → 执行构造方法。9. 内存泄漏与 OOM内存泄漏对象不再使用但无法被 GC 回收常见原因静态集合、连接未关闭、监听器未移除、ThreadLocal未清理。OOM堆溢出、栈溢出、元空间溢出、直接内存溢出。10. JVM 调优常用参数-Xms初始堆-Xmx最大堆-Xmn新生代大小。-XX:PrintGCDetails打印 GC 详情。-XX:HeapDumpOnOutOfMemoryErrorOOM 时生成堆转储。四、设计模式1. 单例模式饿汉式、懒汉式双重检查锁、静态内部类、枚举。注意线程安全、反射破坏、序列化破坏。2. 工厂模式简单工厂、工厂方法、抽象工厂。优点解耦创建者和使用者符合开闭原则。3. 代理模式静态代理、JDK 动态代理、CGLIB 代理。应用Spring AOP、RPC 框架。4. 观察者模式定义一对多依赖状态变化时通知所有观察者。Java 内置Observer和ObservableSpring 事件机制。5. 适配器模式、装饰器模式、模板方法模式、策略模式适配器接口转换。装饰器动态增强功能如 Java IO。模板方法定义算法骨架子类实现具体步骤。策略封装算法族可互相替换。
返回列表