🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~”
ArrayList在Java数组中的使用技巧
这篇博客灵感来源于某一天Aileen(🤫)遇到了一道数组合并的题,于是她按照自己的思路把这道题的解题过程写了下来,如下图所示:
她的想法是想把奇数和偶数分别用两个数组装起来再把它们合并在一个新的数组里面But她尝试通过编写代码实现自己的想法,如下:
import java. util. Arrays ;
public class Work11_1 { public static String reverse ( int [ ] arr) { int [ ] all = new int [ ] { } ; int [ ] evenarr = new int [ ] { } ; int [ ] oddarr = new int [ ] { } ; for ( int i = 0 ; i < arr. length; i++ ) { if ( arr[ i] % 2 == 0 ) { evenarr[ i] = arr[ i] ; } else { oddarr[ i] = arr[ i] ; } } System . arraycopy ( oddarr, 0 , all, 0 , oddarr. length) ; return Arrays . toString ( all) ; } public static void main ( String [ ] args) { int [ ] array = new int [ ] { 1 , 2 , 3 , 4 , 5 , 6 } ; System . out. println ( reverse ( array) ) ; }
运行结果:
通过报错信息我们可以知道,她的代码存在着一些问题: 数组在初始化时(即:`all` ,`evenarr`,`oddarr`的创建)未给它们分配大小,导致后面我们其实是无法向这些数组里面添加元素的,中国有句古话“强扭的瓜不甜”,即使我们强制给他们添加新元素,这也是徒劳,最终就会看到控制台那句报错信息写的:数组越界异常~
她为了解决这个问题,在Java中找到了一个内置类,即 `ArrayList` , 下面我们将进入ArrayList的学习:
ArrayList:
这个类是Java内置的一个类它继承了Java中的AbstractList
并实现了List
接口。他是一个可以动态修改的数组
,与普通数组相比,他没有固定大小的限制
,我们可以通过它进行添加或删除元素。
import java. util. ArrayList ; public class ArrList { public static void main ( String [ ] args) { ArrayList < String > mylist = new ArrayList < > ( ) ; System . out. println ( "---添加----------------------------------------------------------------------" ) ; mylist. add ( "Apple" ) ; mylist. add ( "Banana" ) ; mylist. add ( "Cherry" ) ; System . out. println ( mylist) ; System . out. println ( "---访问------------------------------------------------------------------------" ) ; System . out. println ( mylist. get ( 2 ) ) ; System . out. println ( "---修改------------------------------------------------------------------------" ) ; mylist. set ( 0 , "youzi" ) ; System . out. println ( mylist) ; System . out. println ( "---删除------------------------------------------------------------------------" ) ; mylist. remove ( 2 ) ; System . out. println ( mylist) ; System . out. println ( "---计算大小------------------------------------------------------------------------" ) ; System . out. println ( mylist. size ( ) ) ; System . out. println ( "---迭代打印数组列表------------------------------------------------------------------------" ) ; for ( int i = 0 ; i < mylist. size ( ) ; i++ ) { System . out. println ( mylist. get ( i) ) ; } System . out. println ( "---使用for-each打印数组列表------------------------------------------------------------------------" ) ; for ( String fruit: mylist) { System . out. println ( fruit) ; } }
}
打印结果:
让我们把上面学到的ArrayList类的方法用到我们解决这道题的思路上吧~
学以致用
使用ArrayList(单线程常用)解决问题
import java. util. ArrayList ;
import java. util. Arrays ;
public class Work11_1 { public static String reverse ( int [ ] arr) { ArrayList < Integer > evenList = new ArrayList < > ( ) ; ArrayList < Integer > oddList = new ArrayList < > ( ) ; for ( int i= 0 ; i < arr. length ; i++ ) { if ( arr[ i] % 2 == 0 ) { evenList. add ( arr[ i] ) ; } else { oddList. add ( arr[ i] ) ; } } int [ ] all = new int [ evenList. size ( ) + oddList. size ( ) ] ; for ( int i = 0 ; i < oddList. size ( ) ; i++ ) { all[ i] = oddList. get ( i) ; } for ( int i = 0 ; i < evenList. size ( ) ; i++ ) { all[ oddList. size ( ) + i] = evenList. get ( i) ; } return Arrays . toString ( all) ; } public static void main ( String [ ] args) { int [ ] array = new int [ ] { 1 , 2 , 3 , 4 , 5 , 6 } ; System . out. println ( reverse ( array) ) ; } }
我们通过使用ArrayList这个动态数组能够提高读`get()`写`add()`、`set()`操作的高效性,并且其内存开销比较小,因为它不会每次修改创建数组的副本。However`ArrayList`不是线程安全的,在多线程环境中,如果多个线程同时对同一个`ArrayList`修改,可能会导致数据不一致,或者抛出异常,如果想在多线程环境中使用`ArrayList`.需要手动同步,但它会增加代码的复杂性和错误的风险。
使用CopyOnWriteArrayList(多线程适用)解决问题
import java. util. Arrays ;
import java. util. concurrent. CopyOnWriteArrayList ; public class Work11_1 { public static String reverse ( int [ ] arr) { CopyOnWriteArrayList < Integer > evenList = new CopyOnWriteArrayList < > ( ) ; CopyOnWriteArrayList < Integer > oddList = new CopyOnWriteArrayList < > ( ) ; for ( int i = 0 ; i < arr. length; i++ ) { if ( arr[ i] % 2 == 0 ) { evenList. add ( arr[ i] ) ; } else { oddList. add ( arr[ i] ) ; } } int [ ] all = new int [ evenList. size ( ) + oddList. size ( ) ] ; for ( int i = 0 ; i < oddList. size ( ) ; i++ ) { all[ i] = oddList. get ( i) ; } for ( int i = 0 ; i < evenList. size ( ) ; i++ ) { all[ oddList. size ( ) + i] = evenList. get ( i) ; } return Arrays . toString ( all) ; } public static void main ( String [ ] args) { int [ ] array = new int [ ] { 1 , 2 , 3 , 4 , 5 , 6 } ; System . out. println ( reverse ( array) ) ; }
}
Java中for-each的使用
基本语法
for (元素类型 变量名 : 数组或集合){
}
具体实例
public class ForEach { public static void main ( String [ ] args) { int [ ] numbers = { 1 , 2 , 3 , 4 , 5 } ; for ( int num : numbers) { System . out. print ( num+ " " ) ; } }
}