thinking in java (九) ----- 陣列之二(Array)
效能
在java中有一系列的方式可以用來作為存放物件的容器,並且有很多在操作上比陣列要簡單。但是我們仍然會使用陣列。因為陣列有自己的優點,效率,型別和儲存基本型別的能力。在java中,陣列是效率最高的儲存和隨訪問物件引用序列的方式。
在一般的專案中,確實陣列是咩有List,Map等集合使用方便,但有時候也是會用到的。
public class Main{ public static void main(String[] args) { int sum = 0; int [] arrays = new int [1000001]; Long time1 = System.currentTimeMillis(); for(int i = 0 ; i < 1000000 ;i++){ arrays[i] = i; sum += arrays[i]; } Long time2 = System.currentTimeMillis(); System.out.println("陣列求和所花費時間:" + (time2 - time1) + "毫秒"+sum); int sum1=0; ArrayList<Integer> list = new ArrayList<>(); Long time3 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { list.add(i); sum1 += list.get(i); } Long time4 = System.currentTimeMillis(); System.out.println("List求和所花費時間:" + (time4 - time3) + "毫秒"+sum1); } } ———————————————————————— 陣列求和所花費時間:4毫秒1783293664 List求和所花費時間:49毫秒1783293664
說明效能這一塊兒,陣列還是猛一些。但明顯可以看出受限制比較多,比如說必須先定義陣列長度。在list集合中,求和有一個list.get(i),這個動作是拆箱動作,Integer物件轉換為一個int基本型別,這裡就產生了很多消耗。
所以在效能優先的時候可以考慮陣列、
arraycopy
java提供了一個System.arraycopy()的static函式,和for迴圈比較,這個函式能夠更快速的進行復制陣列,System.arraycopy()被過載以處理所有的型別,其語法:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) ---------------------
其中:src表示源陣列,srcPos表示源陣列要複製的起始位置,desc表示目標陣列,length表示要複製的長度。
直接舉例:
arrayCopy( arr1, 2, arr2, 5, 10);
意思是;將arr1數組裡從索引為2的元素開始, 複製到陣列arr2裡的索引為5的位置, 複製的元素個數為10個. 。
來看一段程式碼
public class Main{
public static void main(String[] args) {
// User [] users=new User[]{new User(1,"admin","[email protected] "),new User(2,"maco","[email protected],com"),new User(3,"kitty","[email protected],com")};//初始化物件陣列
User user1 = new User(1,"admin","[email protected]");
User user2 = new User(2,"maco","[email protected],com");
User [] users = new User[2];
users[0] = user1;
users[1] = user2;
User [] target=new User[users.length];//新建一個目標物件陣列
System.arraycopy(users, 0, target, 0, users.length);//實現複製
System.out.println("源物件與目標物件的實體地址是否一樣:"+(users[0] == target[0]?"淺複製":"深複製"));
target[0].setEmail("[email protected]");
System.out.println("修改目標物件的屬性值後源物件users:");
for (User user : users){
System.out.println(user);
}
}
}
class User{
private Integer id;
private String username;
private String email;
//無參建構函式
public User() { }
//有參的建構函式
public User(Integer id, String username, String email) {
super();
this.id = id;
this.username = username;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", email=" + email
+ "]";
}
}
執行結果
源物件與目標物件的實體地址是否一樣:淺複製
修改目標物件的屬性值後源物件users:
User [id=1, username=admin, [email protected]]
User [id=2, username=maco, [email protected],com]
下圖是過程
Arrays.equals()
這是一個比較陣列是否相同的方法,相同的條件是長度相同,且每一個下標的元素都相等(不是reference),
//基本型別陣列
int[] i1 = new int[]{1,2,3,4};
int[] i2 = new int[]{1,2,3,4};
System.out.println(i1.equals(i2)); //false
System.out.println(Arrays.equals(i1, i2)); //true
//物件陣列
Integer[] i3 = new Integer[]{new Integer(1),new Integer(2)};
Integer[] i4 = new Integer[]{new Integer(1),new Integer(2)};
System.out.println(i3.equals(i4)); //false
System.out.println(Arrays.equals(i3, i4)); //true
---------------------
作者:SnailMann
來源:CSDN
原文:https://blog.csdn.net/SnailMann/article/details/80333044
版權宣告:本文為博主原創文章,轉載請附上博文連結!
因為常規的equals是比較的reference,所以自然是false 。
Arrays.sort()
快速排序
public static void main(String[] args) {
int[] i1 = new int[]{1,3,2,4};
Arrays.sort(i1);
System.out.println(Arrays.toString(i1));
Integer[] i3 = new Integer[]{new Integer(1),new Integer(3),new Integer(2),new Integer(4)};
Arrays.sort(i3);
System.out.println(Arrays.toString(i3));
}
---------------------
[1, 2, 3, 4]
[1, 2, 3, 4]
我們可以看到預設的排序方式是升序的,是從大到小排序的。因為Arrays.sort()沒有專門的降序排序的實現,如果是基本型別陣列,就從後遍歷賦值給另一個數組,如果是物件陣列,可以通過實現Comparator方法來完成,比較麻煩一些。
public class SortDemo {
public static void main(String[] args) {
MyComparator comparator = new MyComparator();
Integer[] i3 = new Integer[]{new Integer(1),new Integer(3),new Integer(2),new Integer(4)};
Arrays.sort(i3,comparator);
System.out.println(Arrays.toString(i3));
//output : [4,3,2,1]
}
}
class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
//如果o1小於o2,我們就返回正值,如果o1大於o2我們就返回負值,
//這樣顛倒一下,就可以實現反向排序了
if(o1 < o2) {
return 1;
}else if(o1 > o2) {
return -1;
}else {
return 0;
}
}
}
Arrays.asList()
待續
參考:https://www.cnblogs.com/chenssy/p/3466092.html