Java学习笔记2——Arrays类

一、Arrays工具类
Arrays是针对数组操作的工具类。
Arrays不能实例化。内置了私有的默认构造函数,保证其不能被实例化。
位于java.util包

private Arrays() {}

1、成员方法
(1)排序sort方法:对不同类型进行排序。
A、对基本类型的排序
支持以下基本类型:char,byte,short,int,long,float,double进行排序。以下以int为例。
①对数组a进行排序:public static void sort(int[] a)
②对数组a进行指定范围的排序:public static void sort(int[] a, int fromIndex, int toIndex)

对数组a的下标从fromIndex到toIndex-1的元素排序,toIndex位置的元素不参与排序。

例子:

public class ArraysDemo {
    public static void main(String[] args) {
        int[] a = {1,4,2,10,6,9};
        Arrays.sort(a);
        for(int i : a){
            System.out.print(i+" ");
        }
        //结果:1 2 4 6 9 10 
    }
}
public class ArraysDemo {
    public static void main(String[] args) {
        int[] a = {1,4,2,10,6,9};
        Arrays.sort(a,1,4);
        for(int i : a){
            System.out.print(i+" ");
        }
        //结果:1 2 4 10 6 9 
    }
}

B、对Object类型进行排序
它要求传进来的数组对象必须实现Comparable接口。

①对Object数组进行排序:public static void sort(Object[] a)
②对Object数组进行指定范围的排序:public static void sort(Object[] a, int fromIndex, int toIndex)
③带泛型参数的接口,它需要指定一个比较器:public static void sort(T[] a, Comparator c)

例子:
以自定义User类为例子,实现Comeparable< T >接口,重写compareTo接口

public class User implements Comparable<User> {
    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(User user) {
        return age - user.getAge();
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}
public class ArraysDemo {
    public static void main(String[] args) {
        User[] users = new User[5];
        users[0] = new User("A",15);
        users[1] = new User("B",25);
        users[2] = new User("C",18);
        users[3] = new User("D",37);
        users[4] = new User("E",28);
        Arrays.sort(users);
        for(User u : users){
            System.out.println(u);
        }
    }
}

结果:
User [name=A, age=15]
User [name=C, age=18]
User [name=B, age=25]
User [name=E, age=28]
User [name=D, age=37]

在Arrays工具类中,内部还使用了多种排序方法进行排序,例如mergeSort(归并排序),快速排序等等。

(2)二分查找方法:public static int binarySearch(int[] arr,int value)
使用二分查找的算法进行查找。

例子:

public class ArraysDemo {  
    public static void main(String[] args) {  
        int[] a = { 12, 23, 34, 45, 56, 67 };  
        System.out.println(Arrays.binarySearch(a, 23));  
        System.out.println(Arrays.binarySearch(a, 27));  
    }  
}  

(3)把数组变成字符串:仍然以int为例子。
public static String toString(int[] a)

(4)将一组对象转换成列表:public static < T > List< T > asList(T… a)

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

将一组对象转换成列表,这里返回的ArrayList并非平常用的java.util.ArrayList ,而是Arrays.java中定义的一个简单的静态内部类–ArrayList。它不支持添加和移除元素,不支持扩容。

静态内部类——ArrayList

 private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable{
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

    ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
        a = array;
    }

    public int size() {
        return a.length;
    }

    public Object[] toArray() {
        return a.clone();
    }

    public <T> T[] toArray(T[] a) {
        int size = size();
        if (a.length < size)
        return Arrays.copyOf(this.a, size,
                     (Class<? extends T[]>) a.getClass());
        System.arraycopy(this.a, 0, a, 0, size);
        if (a.length > size)
        a[size] = null;
        return a;
    }

    public E get(int index) {
        return a[index];
    }

    public E set(int index, E element) {
        E oldValue = a[index];
        a[index] = element;
        return oldValue;
    }

        public int indexOf(Object o) {
            if (o==null) {
                for (int i=0; i<a.length; i++)
                    if (a[i]==null)
                        return i;
            } else {
                for (int i=0; i<a.length; i++)
                    if (o.equals(a[i]))
                        return i;
            }
            return -1;
        }

        public boolean contains(Object o) {
            return indexOf(o) != -1;
    }
}

(5) 获得哈希值:(依然以int为例)
public static int hashCode(int a[])

例子

public class ArraysDemo {
    public static void main(String[] args) {
        int[] a = {1,3,54,74,22};

        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.hashCode(a));
        System.out.println(Arrays.asList(a));
    }
}

(6)填充:以int为例
①public static void fill(int[] a, int val):将数组中的数据替换成val
②public static void fill(int[] a, int fromIndex, int toIndex, int val):将数组中的数据,从fromIndex到toIndex-1全部替换成val

还有对Object对象的填充,此处省略。

public class ArraysDemo {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,8,9,10};
        Arrays.fill(a, 1);
        for(int i : a){
            System.out.print(i+" ");
        }
        Arrays.fill(a,1,4,2);
        for(int i : a){
            System.out.print(i+" ");
        }

    }
}

(7)比较两个数组的数据是否相同
public static boolean equals(int[] a, int[] a2)

 public static boolean equals(int[] a, int[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
}

public static boolean equals(Object[] a, Object[] a2)
具体需要实现什么逻辑的比较,需要重写对象中的equals方法。

 public static boolean equals(Object[] a, Object[] a2) {

        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i=0; i<length; i++) {
            Object o1 = a[i];
            Object o2 = a2[i];
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;
        }
        return true;
    }

今天大致看了一下Arrays的部分源码跟其他人对于Arrays的讲解与看法,Arrays工具类具有很多方便的功能,例如sort方法,但是里面部分是属于不稳定排序,所以也存在一点的风险吧。然后到Arrays内的hashCode,equals方法,到对object对象的排序需要实现Comparable< T >接口,重写compareTo方法。Arrays工具类也可以适用于很多方面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值