Thinking in java ——数组

请优先使用高级容器集合,除非证明用数组确实效率高,否则当然优先使用容器集合。


效率方面(数组优势):

在java中,数组是效率最高的存储和随机访问对象引用的一种方式。The array is Java’s most efficient way to store and randomly access a sequence of object references.

因为它是个线性序列,访问速度很快,但是在其生命周期内大小无法改变,array.length就是它的容量大小。

类型安全:泛型出现之前,除了数组外的其他容器都无法限制数据类型,统一按照Object对待,并且无法存放基本类型。

注意1: List<String> list = Arrays.asList(new String[] { "1", "2" });  返回的是一个大小固定的list。

              (Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.))

                List<String> list = new ArrayList(Arrays.asList(new String[] { "1", "2" }));  返回的是一个大小不固定的list。 

数组初始化:对象类型的数组 e.g.  String[] sarray=new String[4];  sarray[0] ——sarray[3]都初始化为null 

                 基本类型  初始化为0,false等等


例(根据传入参数返回一个数组,数组中的元素取自一个常量集合,但是不能重复):

<span style="font-size:14px;">package com.java.array;

import java.util.Arrays;
import java.util.Random;

public class IceCream {

	private static Random random = new Random();

	static final String[] FLAVORS = new String[] { "Chocolate", "Strawberry",
			"Lemon", "Mint Chip", "Mud Pie" };

	static String[] setFlavor(int n) {
		if (n > FLAVORS.length) {
			throw new IllegalArgumentException("n is too big");
		}
		String[] rs = new String[n];
		boolean[] picked =  new boolean[FLAVORS.length];
		for (int i = 0; i < n; i++) {
			
			int t;
			
			do {
				t = random.nextInt(FLAVORS.length);
				System.out.println("t:"+t);
			} while (picked[t]);
			picked[t] = true;
			rs[i] = FLAVORS[t];
		}

		return rs;
	}

	public static void main(String[] args) {

		String[] rs = setFlavor(5);
		System.out.println(Arrays.toString(rs));
	}

}</span>

数组与泛型:数组与泛型通常无法公用,当然一般也没人这样用。唯一可以公用的示例:

<span style="font-size:14px;">// 数组无法使用泛型,但是可以声明后强转
		// !ArrayList<String>[] ls = new ArrayList<String>[3];
		ArrayList<String>[] ls = (ArrayList<String>[]) new ArrayList[10];</span>


Arrays.fill()  向指定的数组中填充复制值(基本类型);或者向数组中填充同一个对象的引用(对象类型);

<span style="font-size:14px;">		ArrayList<String>[] ls = (ArrayList<String>[]) new ArrayList[10];
		List<String> list = new ArrayList<String>();
		list.add("1");
		Arrays.fill(ls, list);
		System.out.println(Arrays.toString(ls));
		list.remove(0);//删除list对象中的元素,查看数组的情况
		System.out.println(Arrays.toString(ls));</span>

<span style="font-size:14px;">         /*output
	 * [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 
	 * [[], [], [], [], [], [], [], [], [], []]
	 */</span>


 

遇到的一个小问题:

<span style="font-size:14px;">Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;</span>
<span style="font-size:14px;">public class Test {

    public static void main(String[] args) {
        System.out.println(new CountingGenerator.String(12).next());
        List<Integer> list=new ArrayList<Integer>();
        list.add(new Integer(1));
        list.add(new Integer(2));
	Integer[] c =null;
        //throw an exception: 
        //Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
	//1.list.toArray() return an Object[] which is not superClass of Integer[] 
	//2.c= list.toArray(new Integer[]{}); is correct! return Integer[] **
	c =  (Integer[]) list.toArray(c);
		 
    }
}</span>
in other words,1you can't treat a list of Integer IS-A list of Object! Integer[] a... and int b[] ...  ;2 a=b or b=a is wrong,they won't be autoboxing or autounboxing!

Arrays常用方法:

Arrays里有很多常用的 static method,如比较两个数组的 Arrays.equals()(多维数组用Arrays.deepEquals());Arrays.fill()用于对数组填充元素;Arrays.sort()对数组排序,Arrays.toString()使数组成为字符串;Arrays.binarySearch()排序后查找元素;Arrays.hasCode()产生数组的散列码;Arrays.asList()接收任意序列或数组为参数翻回一个List.

另外:System.arraycopy(Object src,int srcPos, Object dest, int destPos, int length) src是复制源数组,原数组复制的起始位置,(复制到)目的数组,复制的元素个数;另个数组必须类型完全一致,数组无法自动拆箱装箱。

Arrays.equals() : 比较两个数组中对应位置的对应元素的equals方法是否返回true。改写equalsf方法:

<span style="font-size:14px;">	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		} else if (obj instanceof Test19) {
			return ((Test19) obj).i == this.i;
		} else {
			return false;
		}
	}</span>


Arrays.sort() : 两个数组排序,你可以给你的要排序的对象类实现Comparable接口。另外一种就是用策略模式,可以用匿名内部类的方式实现Comparator接口。当你传入的Comparator对象不同,就会有不同的比较方式。(传入对象的不同而产生不同行为——策略模式)如下,就是按照CompType对象的 j变量做比较的,当然你也可以按照其他变量做比较排序!

<span style="font-size:14px;">		Arrays.sort(array, new Comparator<CompType>() {
			@Override
			public int compare(CompType o1, CompType o2) {
				return o1.j < o2.j ? -1 : (o1.j == o2.j ? 0 : 1);
			}
		});
		</span>
java标准类库正对正排序(字符串大写字母在前)做了优化:对于基本类型使用“快速排序”,对对象类型使用”稳定归并排序“。除非你能证明排序是瓶颈,否则无需担心排序问题!


Arrays.binarySearch()

1.首先要对查找的数组做Arrays.sort()排序;2.其算法为二分查找,返回索引号;3.数组中有重复的元素,查找时随机返回任意一个索引号。对于对象类型需要传入改写的Comparator作为参数!




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值