1.数组的特点

1)在Java中,无论使用数组或容器,都有边界检查。如果越界操作就会得到一个RuntimeException异常。

2)在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方法,它的缺点是数组对象的大小被固定。

3)对象数组和基本类型数组在使用上几乎是相同的;唯一的区别是对象数组保存的是引用,基本类型数组保存基本类型的值。

4)在Java中声明数组时,无论何种方式定义数组,都不能指定其长度。

2.数组声明

1)数组在声明时,不能分配空间。只有定义完后,可以给数组分配空间。

int num[3];//error

int num[];//ok

num=new int[3];

int num[]=new int[3];

注意

int [] num=new int[]{1,2,3};//ok

int [] num=new int[3]{1,2,3};//error;

2)可以这样定义二维数组。

Int [][]num=new int[3][5]

//or

int [][] num;

num=new int[3][];

num[0]=new int[5];

num[1]=new int[3];

num[2]=new int[2];

3)二维数组赋初值。

int [][] num=new int[][]{1,2,3,4,5,5};//error

int [][] num=new int[][]{{1,2,3},{4,5,5}};//ok

int [][] num=new int[2][]{{1,2,3},{4,5,5}};//error

int [][] num={{1,2,3},{4,5,6}};//ok

3.数组初始化

对象数组在创建之初会自动初始化成null,由原始数据类型构成的数组会自动初始化成零(针对数值类型),(Char)0(针对字符类型)或者false(针对布尔类型)。

4.数组引用的问题

int[] a1 = { 1, 2, 3, 4, 5 };

int[] a2;

a2 = a1;//这里只是复制了一个引用

看以下代码:

publicclassTestArrays {

publicstaticvoidmain(String[] args) {

int[] a1 = { 1, 2, 3, 4, 5 };

for(inti = 0; i < a1.length; i++)

System.out.println("a1["+ i +"] = "+ a1[i]);

int[] a2;

a2 = a1;

for(inti = 0; i < a2.length; i++)

a2[i]++;

System.out.println("-----after change a2------");

for(inti = 0; i < a1.length; i++)

System.out.println("a1["+ i +"] = "+ a1[i]);

System.out.println("-----after change a2[0]------");

a2[0] = 333;

System.out.println("a2[0]="+ a2[0]);

System.out.println("a1[0]="+ a1[0]);

System.out.println("----- a2------");

for(inti = 0; i < a2.length; i++)

System.out.println("a2["+ i +"] = "+ a2[i]);

}

}

结果:

a1[0] = 1

a1[1] = 2

a1[2] = 3

a1[3] = 4

a1[4] = 5

-----after change a2------

a1[0] = 2

a1[1] = 3

a1[2] = 4

a1[3] = 5

a1[4] = 6

-----after change a2[0]------

a2[0]=333

a1[0]=333

----- a2------

a2[0] = 333

a2[1] = 3

a2[2] = 4

a2[3] = 5

a2[4] = 6

数组a1和a2始终在操作同一个对象。

5.数组的相关操作

1)在Java中,所有的数组都有一个缺省的属性length,用于获取数组中元素的个数。

2)数组的复制:System.arraycopy(src,s_index,dest,d_index,x)。意思是复制src数组中从下标s_index开始的x个元素到目标数组dest,从目标数组的下标d_index所对应的位置开始存储。

publicclassTestArrayCopy {

publicstaticvoidmain(String[] args) {

inta[]=newint[]{1,2,3,4,5};

intb[]=newint[]{9,8,7,6,5,4,3};

System.arraycopy(a, 0, b, 0, 3);

for(inti=0;i

System.out.print(a[i]);

System.out.println();

for(inti=0;i

System.out.print(b[i]);

}

}

结果:

12345

1236543

如果复制对象数组,那么只是复制了对象的引用,而不是对象本身。因此是浅复制。System.arraycopy()不会执行自动包装与自动拆包,两个数组必须具有相同的确切类型。

3)将一个原始数组转换为等价的对象类型数组:Array.get()。

另一个有用的技术是将一个原始数组转换为等价的对象类型数组。每个对应元素使用它们的封装器类,例如在封装数组中,37成为Integer(37)。

importjava.lang.reflect.Array;

publicclassArrayConv {

// if input is a single-dimension primitive array,

// return a new array consisting of wrapped elements,

// else just return input argument

publicstaticObject toArray(Object vec) {

// if null, return

if(vec ==null) {

returnvec;

}

// if not an array or elements not primitive, return

Class cls = vec.getClass();

if(!cls.isArray()) {

returnvec;

}

if(!cls.getComponentType().isPrimitive()) {

returnvec;

}

// get array length and create Object output array

intlength = Array.getLength(vec);

Object newvec[] =newObject[length];

// wrap and copy elements

for(inti = 0; i < length; i++) {

newvec[i] = Array.get(vec, i);

}

returnnewvec;

}

publicstaticvoidmain(String args[]) {

// create a primitive array

intvec[] =newint[] { 1, 2, 3 };// wrap it

Object wrappedvec[] = (Object[]) toArray(vec);

// display result

for(inti = 0; i < wrappedvec.length; i++) {

System.out.println(wrappedvec[i]);

}

}

}

方法"toArray"的参数是一个Object对象(数组可以被赋值给一个Object引用)。如果参数是null或者代表的不是原始类型数组那么这个方法简单的返回参数值。java.lang.Class工具类用于判断参数是否是一个数组并获取数组的底层元素的类型。

一旦做完这些检查,使用java.lang.reflect.Array工具类的反射工具方法就可以获取原始数组的长度并获得数组的单个元素。Array.get获得的每个元素被返回到封装器类中,例如Integer或者Double。

4)填充数组:Arrays.fill()。

①fill(array,val):使用值val填充整个数组array;

②fill(array, fromIndex,toIndex,val):使用值val填充部分数组array;

fromIndex -要使用指定值填充的第一个元素的索引(包括);

toIndex -要使用指定值填充的最后一个元素的索引(不包括);

如果fromIndex > toIndex,抛出IllegalArgumentException;

如果fromIndex < 0或toIndex > a.length,抛出ArrayIndexOutOfBoundsException;

如果fromIndex = toIndex,则什么都不做。

importjava.util.Arrays;

classBee{}

publicclassFillingArrays {

publicstaticvoidmain(String[] args){

int[] ints=newint[3];

Bee[] bees=newBee[3];

Arrays.fill(ints,1);

Arrays.fill(bees, 1,2,newBee());

for(inti:ints)

System.out.print(i+",");

System.out.println();

for(Bee bee:bees)

System.out.print(bee+",");

}

}

结果:

1,1,1,

null,Bee@a90653,null,

5)数组比较:Arrays.equals()/Arrays.deepEquals()。

Arrays类提供了重载后的equals()方法。数组相等的条件是元素个数相等,并且对应位置的元素内容也相等。deepEquals()方法用于多维数组。

importjava.util.Arrays;

publicclassComparingArrays {

publicstaticvoidmain(String[] args) {

intint1[] =newint[] { 1, 2, 3 };

intint2[] =newint[] { 1, 2, 3 };

System.out.println(Arrays.equals(int1, int2));

String[] str1 =newString[] {"t","t","t"};

String[] str2 =newString[] {newString("t"),newString("t"),

newString("t") };

System.out.println(Arrays.equals(str1, str2));

}

}

结果:

true

true

由str1与str2的比较可以发现,比较的是内容而不是引用。

6)数组的字符串表示:Arrays.toString()/Arrays.deepToString()。

其中,deepToString()方法用于多维数组。

importjava.util.Arrays;

publicclassThreeDWithNew {

publicstaticvoidmain(String[] args){

int[][][] a=newint[2][2][4];

System.out.println(Arrays.deepToString(a));

}

}

结果:

[[[0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0]]]

7)数组的排序:Arrays.sort()。

importjava.util.Arrays;

publicclassArrSort {

publicstaticvoidmain(String[] args) {

inta[] =newint[] { 1, 2, 4, 8, 3 };

Arrays.sort(a);//对数组排序

for(inti : a)

System.out.print(i);

}

}

结果:

12348

8)在已排序的数组中查找某个元素:Arrays.binarySearch()。

你可以在排完序的数组上进行二分法查找。

publicclassArrBin {

publicstaticvoidmain(String[] args) {

intvec[] = { -5, 19, 23, 37, 47, 56 };

intslot = Arrays.binarySearch(vec, 35);

slot = -(slot + 1);

System.out.println("insertion point = "+ slot);

}

}

结果:

insertion point = 3

这个程序有个微妙的概念,如果二分法查找失败它将返回:

-(insertion point) - 1

这个演示程序以参数35调用查找方法,而那个参数在数组中不存在,方法返回值-4,如果这个值加1再取其负数就得到3,这就是35应该被插入到数组中的位置,换言之,值-5, 19和23在数组中占据的位置是0,1和2。因此值35应该在索引3的位置,而37, 47以及56顺延。搜索方法并不进行实际的插入操作而只是指出应该在何处插入。

9)在数组上使用集合特性,这假设你已经有一个对象数组:Arrays.asList。

最终的范例基于前面的那个并向你展示如何在数组上使用集合特性。这假设你已经有一个对象数组。

importjava.util.Arrays;

importjava.util.Iterator;

importjava.util.List;

publicclassArray2List {

publicstaticvoidmain(String args[]) {

Object vec[] = {newInteger(37),newInteger(47) };

List lst = Arrays.asList(vec);

lst.set(1,newInteger(57));

for(inti = 0; i < vec.length; i++) {

System.out.println(vec[i]);

}

Iterator it=lst.iterator();

while(it.hasNext())

System.out.println(it.next());

}

}

在这个程序中,vec是一个对象数组,包含Integer(37)和Integer(47),然后Arrays.asList被调用。它返回一个集合(List接口类型),使用数组作为集合的后台存储。换言之,ArrayList这样的集合类型在它内部有某种存储类型去存储集合元素。在这个例子中,使用的存储类型是作为参数传。

6.关于数组的排序操作

1)对象数组排序,必须实现Comparable接口。

importjava.util.Arrays;

classStudentimplementsComparable {

intnum;

Stringname;

Student(intnum, String name) {

this.num= num;

this.name= name;

}

//重写toString()方法,以便main:System.out.println(ss[i]);

publicString toString() {

return"number="+num+","+"name="+name;

}

publicintcompareTo(Object o) {

Student s = (Student) o;

returnnum> s.num? 1 : (num== s.num? 0 : -1);

}

}

publicclassTestArrayObjCopy {

publicstaticvoidmain(String[] args) {

Student[] ss =newStudent[] {newStudent(1,"zhangsan"),

newStudent(2,"lisi"),newStudent(3,"wangwu") };

Arrays.sort(ss);

for(inti = 0; i < ss.length; i++) {

System.out.println(ss[i]);

}

}

}

结果:

number=1,name=zhangsan

number=2,name=lisi

number=3,name=wangwu

2)以num为第一关键字,name为第二关键字排序

importjava.util.Arrays;

classStudentimplementsComparable {

intnum;

Stringname;

Student(intnum, String name) {

this.num= num;

this.name= name;

}

publicString toString() {

return"number="+num+","+"name="+name;

}

publicintcompareTo(Object o) {

Student s = (Student) o;

intresult =num> s.num? 1 : (num== s.num?0 : -1);

if(0 == result) {

result =name.compareTo(s.name);

}

returnresult;

}

}

publicclassTestArrayObjCopy {

publicstaticvoidmain(String[] args) {

Student[] ss =newStudent[] {newStudent(1,"zhangsan"),

newStudent(2,"lisi"),newStudent(3,"wangwu"),

newStudent(3,"mybole") };

Arrays.sort(ss);

for(inti = 0; i < ss.length; i++) {

System.out.println(ss[i]);

}

}

}

结果:

number=1,name=zhangsan

number=2,name=lisi

number=3,name=mybole

number=3,name=wangwu

7.范型数组

不能实例化具有参数类型的数组。

Fruit[] apples=newFruit[]{newApple(),newApple(),newApple()};//ERROR

但是,可以参数化数组本身的类型。

packagesamples;

//参数化类

classClassParameter{

publicT[] get(T[] arg){

returnarg;

}

}

//参数化方法

classMethodParameter{

publicstatic T[] get(T[] arg){

returnarg;

}

}

classFruit{}

classAppleextendsFruit{}

classOrangeextendsFruit{}

classBananaextendsFruit{}

publicclassParameterizedArrayType {

publicstaticvoidmain(String[] args) {

Apple[] apples={newApple(),newApple(),newApple()};

Fruit[] genF1=newClassParameter().get(apples);

Fruit[] genF2=newClassParameter().get(apples);

Fruit[] genF3=MethodParameter.get(apples);

for(Fruit f:genF1)

System.out.print(f+",");

System.out.println();

for(Fruit f:genF2)

System.out.print(f+",");

System.out.println();

for(Fruit f:genF3)

System.out.print(f+",");

System.out.println();

Fruit[] fruits={newApple(),newOrange(),newBanana()};

Fruit[] genF4=newClassParameter().get(fruits);

Fruit[] genF5=MethodParameter.get(fruits);

for(Fruit f:genF4)

System.out.print(f+",");

System.out.println();

for(Fruit f:genF5)

System.out.print(f+",");

}

}

结果:

samples.Apple@1fb8ee3,samples.Apple@61de33,samples.Apple@14318bb,

samples.Apple@1fb8ee3,samples.Apple@61de33,samples.Apple@14318bb,

samples.Apple@1fb8ee3,samples.Apple@61de33,samples.Apple@14318bb,

samples.Apple@1a758cb,samples.Orange@1b67f74,samples.Banana@69b332,

samples.Apple@1a758cb,samples.Orange@1b67f74,samples.Banana@69b332,

8.二维数组实现矩阵乘法

/**

*两个矩阵Am¡Án、Bn¡Ál相乘得到Cm¡Ál,

*每个元素Cij=aik*bkj(i=1..m,n=1..n)

*/

publicclassMatrixMultiply {

publicstaticvoidmain(String args[]) {

inti, j, k;

inta[][] =newint[2][3];

intb[][] = { { 1, 5, 2, 8 }, { 5, 9, 10, -3 }, { 2, 7, -5, -18 } };

intc[][] =newint[2][4];

for(i = 0; i < 2; i++)//行

for(j = 0; j < 3; j++)//列

a[i][j] = (i + 1) * (j + 2);

for(i = 0; i < 2; i++) {//行

for(j = 0; j < 4; j++) {//列

c[i][j] = 0;

for(k = 0; k < 3; k++)

c[i][j] += a[i][k] * b[k][j];

}

}

System.out.println("\n*** Matrix A ***");

for(i = 0; i < 2; i++) {

for(j = 0; j < 3; j++)

System.out.print(a[i][j] +" ");

System.out.println();

}

System.out.println("\n*** Matrix B ***");

for(i = 0; i < 3; i++) {

for(j = 0; j < 4; j++)

System.out.print(b[i][j] +" ");

System.out.println();

}

System.out.println("\n*** Matrix C ***");

for(i = 0; i < 2; i++) {

for(j = 0; j < 4; j++)

System.out.print(c[i][j] +" ");

System.out.println();

}

}

}

java画蝴蝶_java之数组相关推荐

  1. java画虚线_java cansvas 画虚线要怎么设置?

    展开全部 java cansvas 画虚线通过Graphics2D setStroke(BasicStroke) 设置笔画虚线模式.32313133353236313431303231363533e5 ...

  2. java 画树_java – 如何绘制代表连接节点图的树?

    我想在Java GUI中显示树,但我不知道如何.树代表连接节点的图形,如下所示: 我应该说我有自己的树类: public class BinaryTree { private BinaryNode r ...

  3. java 画树_java – 如何绘制代表连接节点图的树?

    我想在 Java GUI中显示树,但我不知道如何.树代表连接节点的图形,如下所示: 我应该说我有自己的树类: public class BinaryTree { private BinaryNode ...

  4. java画圈_java动态画圈圈。运用多线程,绘图

    总结:只是意外的收获吧.之前一篇是老师教的,一个点,从底层开始升起,到鼠标按下的地方开始画圈圈, 现在改变了一下,因为点上升的一个循环和画圈的循环是分开的 现在让点点自己跑,并且边跑边画圈.而且在fo ...

  5. java画笑脸_java的画图运用。一个简答的笑脸程序☺

    一个简答的笑脸. 需要两个java文件 代码如下: GradeBook.java import java.awt.Color; import java.awt.Graphics; import jav ...

  6. java 画星星_Java——绘制五角星

    Java2D支持通过GeneralPath实现绘制任意的几何形状. 步骤:1)实例化GeneralPath对象 2)调用moveTo()方法锚地开始点坐标 3)调用lineTo()或curveTo() ...

  7. java 画弧线_java画图基本操作-线/折线,圆弧/扇形,椭圆,文本

    /*** 画线/折线*/ private static voiddrawLine(Graphics g) { Graphics2D g2d=(Graphics2D) g.create();//抗锯齿 ...

  8. java画雪花_java分形绘制科赫雪花曲线(科赫曲线)代码分享

    首先我们举个例子: 我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形.换句话说,较小的分支通过放大适当的比例后可以得到一个与整体几乎完全一致的花簇.因此我们可以说西兰花 ...

  9. java 画树_java Graphics 绘制树形图,保存图片

    最近项目中要做报告,生成树形图显示父子关系,网上没找到合适的工具,所以用Graphics画了个简单的. 很简单直接上代码吧. import javax.imageio.ImageIO; import ...

最新文章

  1. Java 遍历map
  2. Laravel 清空配置缓存
  3. CentOS Linux使用logrotate分割管理日志
  4. 生命不能承受之轻——沉重的眼泪
  5. ECS服务器下挂载数据盘
  6. matlab给图像加云,matlab怎么给图像加雾
  7. MS Sql当中 money类型数据使用 Decimal 传输
  8. html鼠标经过小手,css鼠标小手
  9. 【ubuntu工具】ubuntu下文件对比软件meld
  10. 数据结构——线性表的链式存储
  11. Hadoop技术之Hadoop HA 机制详解
  12. A - Robot Rapping Results Report
  13. 鸿蒙方舟UI开发框架-eTS状态管理
  14. 基于微信小程序和安卓的课程考勤点名系统APP
  15. 所有设备都不安全 只要连WiFi 就会被入侵
  16. 3. 剪辑入门--电影混剪 (1)
  17. oracle 删除数据违反约束条件,ORA-02292: 违反完整约束条件 处理
  18. 9张逻辑思维图,迅速提升你的工作能力
  19. python引用自己写的文件
  20. Ubuntu下常用的快捷键

热门文章

  1. ijkplayer源码分析 start流程和buffering缓冲策略
  2. 视频教程-micropython基础入门(esp32/esp8266单片机开发)-物联网技术
  3. 如何存储社交软件中的「好友、粉丝关系」
  4. python随机生成10个数_python得到一个10位随机数的方法及拓展
  5. 鸿蒙系统电视k歌,华为电视怎么k歌?全网最详细的教程在这里
  6. 2022-2027年中国共享充电宝市场规模现状及投资规划建议报告
  7. 手机上怎么打开python文件_python怎么打开文件
  8. 该如何在视频里添加文字呢?推荐3个视频加文字的方法
  9. 海岛奇兵满分计算公式
  10. 和领导提了离职,结果他马上给我涨薪,还承诺明年晋升,该不该留下?