ArrayList list = new ArrayList() 和List<String> list = new ArrayList<String>() 的区别?

本文探讨了在Java中使用ArrayList与List接口的不同之处。详细解释了依赖抽象而非具体类型的优点,尤其是在代码维护和重构方面。
     一种形式用当前类作为引用类型,那么可以访问到ArrayList这个类中的所有公用方法。第二种形式,用ArrayList实现的接口List作为引用类型,那么通过list引用可以访问到接口中定义的方法。也就是说ArrayList这个类实现了List接口,除了要必须实现接口List中声明的方法外,还可以实现额外的一些方法。但是,第二种形式就无法调用的List接口以外的方法。
     使用上,设计模式中有:“代码尽量依赖于抽象,不依赖于具体”。第一种形式就是依赖具体,第二种形式就是依赖于抽象。因为List是接口。代码依赖于抽象的好处是,代码可以方便替换。例如,代码List list = new ArrayList();下面通过list来操作集合。代码编写后发现集合使用的不准确,应该使用LinkedList,那么只要修改一行代码List list = new LinkedList();就可以,这行以后的代码不需要修改,因为List接口保证了调用的都是接口中的方法,而ArrayList与LinkedList都实现了List接口。而如果当时用ArrayList list = new ArrayList()这种形式的话,那么list访问到的就可能是ArrayList里独有的方法而非List接口中的方法。这样替换成LinkedList的时候就有可能需要修改很多的代码。
`List<String> list = new ArrayList<>(2);` 这行代码的含义、使用场景及相关知识如下: ### 含义 - `List<String>`:`List` 是 Java 中的一个接口,它表示一个有序的集合,允许存储重复的元素。`<String>` 是泛型的使用,表明这个 `List` 集合中只能存储 `String` 类型的元素。 - `new ArrayList<>(2)`:`ArrayList` 是 `List` 接口的一个具体实现类,它基于动态数组实现。括号中的 `2` 是指定 `ArrayList` 的初始容量,即该 `ArrayList` 最初可以容纳 2 个元素。当元素数量超过初始容量时,`ArrayList` 会自动进行扩容。 ### 使用场景 - **预先知道元素大致数量**:当在创建列表时,已经大致知道需要存储的元素数量时,指定初始容量可以避免或减少 `ArrayList` 内部数组的扩容操作,从而提高性能。例如,从数据库查询出固定数量的记录,将这些记录存储到 `List` 中,就可以预先指定初始容量。 ```java import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 假设从数据库查询出 2 条记录 List<String> list = new ArrayList<>(2); list.add("record1"); list.add("record2"); for (String record : list) { System.out.println(record); } } } ``` - **性能优化**:在对性能要求较高的场景中,减少扩容操作可以提高程序的执行效率。因为每次扩容都需要创建一个新的数组,并将原数组中的元素复制到新数组中,这会消耗一定的时间内存。 ### 相关知识 - **泛型的使用**:泛型是 Java 中的一种类型参数化机制,它允许在定义类、接口或方法时使用类型参数。通过使用泛型,可以在编译时进行类型检查,避免在运行时出现 `ClassCastException` 异常。例如,在上述代码中,由于指定了 `List<String>`,如果尝试向 `list` 中添加非 `String` 类型的元素,编译器会报错。 - **`ArrayList` 的扩容机制**:当 `ArrayList` 中的元素数量超过其容量时,会触发扩容操作。默认情况下,`ArrayList` 的扩容策略是将容量扩大为原来的 1.5 倍。例如,初始容量为 2,当添加第 3 个元素时,`ArrayList` 会将容量扩容为 3(2 * 1.5)。 ### 与 `List<String> list = new ArrayList<>()` 的区别 `List<String> list = new ArrayList<>()` 没有指定初始容量,`ArrayList` 会使用默认的初始容量 10。如果在创建列表时不确定元素的数量,或者元素数量较少,可以使用这种方式。而指定初始容量的方式更适合预先知道元素大致数量的场景。 ### 与 `List<String> list = new ArrayList<>(2)` `ArrayList<String> list = new ArrayList<>(2)` 的区别 - `List<String> list = new ArrayList<>(2)` 是面向接口编程,`list` 变量只能调用 `List` 接口中定义的方法。这样做的好处是提高了代码的灵活性可维护性,方便后续更换 `List` 的实现类,如将 `ArrayList` 替换为 `LinkedList`。 - `ArrayList<String> list = new ArrayList<>(2)` 直接使用 `ArrayList` 类型,`list` 变量可以调用 `ArrayList` 类中特有的方法,但代码的灵活性相对较差,后续更换实现类时需要修改较多的代码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值