【八股学习】ArrayList扩容机制总结

初始化

/**
 * 默认初始容量大小
 */
private static final int DEFAULT_CAPACITY = 10;

//默认的构造数组其实是没有容量的
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
   
   };

/**
 * 默认构造函数,使用初始容量10构造一个空列表(无参数构造)
 */
public ArrayList() {
   
   
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

/**
 * 带初始容量参数的构造函数。(用户自己指定容量)
 */
public ArrayList(int initialCapacity) {
   
   
    if (initialCapacity > 0) {
   
   //初始容量大于0
        //创建initialCapacity大小的数组
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
   
   //初始容量等于0
        //创建空数组
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
   
   //初始容量小于0,抛出异常
        throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
    }
}

/**
 *构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回
 *如果指定的集合为null,throws NullPointerException。
 */
public ArrayList(Collection<? extends E> c) {
   
   
    elementData = c.toArray();
<think>好的,用户想了解Java基础面试题及答案。首先,我需要整理常见的Java基础问题,比如面向对象、集合框架、多线程、异常处理等。确保每个问题都有简明扼要的答案,并符合用户提供的格式要求。 接下来,用户提到系统级指令,比如数学表达式用$...$,独立公式用$$...$$。不过Java面试题可能涉及数学的地方不多,但如果有例如哈希算法或复杂度分析,可能需要用LaTeX。例如,时间复杂度$O(n \log n)$,或者哈希冲突的概率公式$$P \approx 1 - e^{-k(k-1)/(2n)}$$,不过可能这类内容较少,需视情况而定。 然后要检查引用部分。用户提供的引用中有关于类加载机制、GC的理解等,需要正确引用这些内容。比如在回答双亲委派机制时,需要添加[^2],安全管理器部分也引用。但要注意引用的相关性,确保引用的内容与问题对应。 用户要求生成相关问题,放在最后。需要根据回答的内容提出几个相关问题,比如关于JVM内存模型、HashMap的工作原理等。这些问题应该自然延伸,帮助用户进一步学习。 同时,回答结构要清晰,分点说明,每个问题有答案和可能的子要点。例如,面向对象的特性分为封装、继承、多态,每个点简要说明。代码示例需要用代码块格式,如Java的示例代码。 还需要注意使用中文回答,避免使用Markdown,但用户示例中用了代码块,所以可能允许。但根据用户的最新指令,可能要求避免复杂格式,所以需要确认。不过原示例中有代码块,所以应该保留。 最后,检查所有LaTeX语法是否正确,行内公式用$...$,独立公式用$$...$$,确保没有语法错误。例如,在解释时间复杂度或算法时正确应用。 可能的问题点:确保引用标记正确,比如引用[^1]是关于Java和C++对比,但用户提供的引用内容可能不完全相关,需要合理使用。例如,在讨论Java与C++的区别时引用,在类加载机制时引用。 总结步骤: 1. 收集常见Java基础面试题。 2. 按照用户要求的结构组织答案,分点列出。 3. 添加适当的代码示例,如单例模式、线程示例。 4. 在适当的地方添加引用标记,确保引用内容相关。 5. 生成相关问题,涵盖JVM、集合、多线程等方向。 6. 检查格式、LaTeX和引用是否正确。</think>### Java基础面试题及答案 #### 1. **面向对象的三大特性是什么?** - **封装**:隐藏对象内部细节,通过方法暴露可控操作,例如类的私有属性通过`getter/setter`访问。 - **继承**:子类复用父类属性和方法,支持单继承(Java)和多层继承。 - **多态**:同一方法在不同对象中有不同实现,依赖方法重写(Override)和接口实现。 --- #### 2. **`final`关键字的作用** - **修饰类**:类不可被继承(如`String`)。 - **修饰方法**:方法不可被子类重写。 - **修饰变量**:变量值不可变(常量)。 --- #### 3. **`String`、`StringBuilder`和`StringBuffer`的区别** - **`String`**:不可变字符序列,操作生成新对象。 - **`StringBuilder`**:可变,线程不安全,性能高。 - **`StringBuffer`**:可变,线程安全(方法加`synchronized`),性能较低。 ```java // 示例:StringBuilder拼接字符串 StringBuilder sb = new StringBuilder(); sb.append("Hello").append(" World"); System.out.println(sb.toString()); // 输出 "Hello World" ``` --- #### 4. **Java集合框架的核心接口** - **`List`**:有序可重复(如`ArrayList`、`LinkedList`)。 - **`Set`**:无序唯一(如`HashSet`、`TreeSet`)。 - **`Map`**:键值对存储(如`HashMap`、`ConcurrentHashMap`)。 --- #### 5. **`HashMap`的工作原理** - 基于哈希表,通过键的`hashCode()`计算桶位置。 - 哈希冲突时,使用链表或红黑树(Java 8+)存储。 - 负载因子默认$0.75$,扩容时容量翻倍。 --- #### 6. **多线程的实现方式** - **继承`Thread`类**:重写`run()`方法。 - **实现`Runnable`接口**:更灵活,避免单继承限制。 - **`Callable`和`Future`**:支持返回值。 ```java // 示例:实现Runnable接口 class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程运行中"); } } new Thread(new MyRunnable()).start(); ``` --- #### 7. **Java异常处理机制** - **`try-catch-finally`**:捕获异常并处理。 - **`throws`**:声明方法可能抛出的异常。 - **自定义异常**:继承`Exception`或`RuntimeException`。 --- #### 8. **JVM内存模型** - **堆(Heap)**:对象实例存储区域。 - **栈(Stack)**:方法调用和局部变量。 - **方法区(Method Area)**:类信息、常量池。 --- #### 9. **垃圾回收(GC)机制** - **可达性分析**:从根对象(如栈、静态变量)出发标记存活对象。 - **分代回收**:堆分为新生代(Minor GC)和老年代(Major GC)。 - **常用算法**:标记-清除、复制、标记-整理[^2]。 --- #### 10. **单例模式的实现** - **双重检查锁**:线程安全且延迟加载。 ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值