1. 程式人生 > >thinking in java (九) ----- 陣列之二(Array)

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