JAVA程序设计——数组、字符串(String)

前言:

数组与字符串 (说好一周一更的呢?

从这篇开始,不在使用截图验证方式,代码验证似乎更让人懂。

目录

一、数组

1.数组的创建与赋值

Ⅰ:数组声明(两种)

Ⅱ:数组分配内存

Ⅲ:数组初始化

2.数组的遍历

Ⅰ:基础遍历

Ⅱ:for-eash 增强for循环

3.数组的基本操作‘

Ⅰ.数组的copy

Ⅱ.与Arrays有关的操作

4.可变长参数数组与多维数组

Ⅰ:可变长参数数组

Ⅱ:多维数组

字符串String

1.字符串的创建:


一、数组


1.数组的创建与赋值

数组创建具备以下过程:

Ⅰ:数组声明(两种)

int[] scores;
int scores[];
////创建一个int类型的socres数组

创建时提倡第一种声明方法,同时注意:数组声明时并没有像C++那样被分配内存,所以不可将代码写为:

int[5] scores;

Ⅱ:数组分配内存

int[] scores;
scores = new int[8];
////创建了一个大小为8的int类型数组

并且上述两个语句可以连起来使用:int[] scores = new int[8]

Ⅲ:数组初始化

分配内存之后,接下来的操作便是对数组进行初始化。

初始化有两种方法:

int[] scores = {1,2,3};
///静态初始化,{}内跟scores具有的值
int[] scores=new int[]{1,2,3};
///此时注意,[]内不要有数组长度大小的值
///系统会自动分配

完成以上三步,一个数组就创建OK了。


2.数组的遍历

java中数组的遍历与C++比较像(可以说具有某种共性)

Ⅰ:基础遍历

我们可以像C++一样,根据下标去访问数组中的第index个元素:

for(int i = 0 ;i < scores.length;i++){
	System.out.println(i);
}

注意:为了防止数组越界情况发生,建议使用length函数去访问,这样即安全又有利于维护。

Ⅱ:for-eash 增强for循环

在C++中遍历迭代器等容器:例如vector,set等 ,用到过此类增强for循环:

for(int x:scores) 
	System.out.println(x);
////格式 for(类型  变量:数组)
////注意此时的类型应与数组类型相同

并做个简单的测试,通过增强for循环不会改变数组内部的值:

public class Test{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] scores= {1,2,3};
		for(int x:scores) {
			System.out.print(x+" ");
			x++;
		}
		System.out.println();
		for(int x:scores) 
			System.out.print(x+" ");
	}
}
//输出结果
//1 2 3
//1 2 3
///由此可见 通过改变x并不会改变java的数组

3.数组的基本操作‘

Ⅰ.数组的copy

首先思考一个问题:

public class Test{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] scores= {1,2,3};
		int[] copyscores ;
		copyscores = scores;
		for(int x:copyscores)
			System.out.print(x+" ");
		System.out.println();
	}
}
///以上输出结果为 1 2 3

但是这是不是就意味着,已经完成了数组的copy呢?

我们将代码增加以下修改操作:

public class Test{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] scores= {1,2,3};
		int[] copyscores ;
		copyscores = scores;
		for(int x:copyscores)
			System.out.print(x+" ");
		System.out.println();
		copyscores[0]=2;
		for(int x:scores)
			System.out.print(x+" ");
		System.out.println();
		for(int x:copyscores)
			System.out.print(x+" ");
		System.out.println();
	}
}
///以上输出结果为:
///1 2 3
///2 2 3
///2 2 3

这就意味着,在改变copy数组的同时,原数组也发生了改变,说明 原数组与copy数组指向了同一个内存地址,所以数组赋值语句只是将scores数组的一个引用赋值给了copyscores,并没有实现真正的copy。

如何实现真正的copy?

第一种方法:for循环(非常简单也可行的方法)

int[] scores= {1,2,3};
int[] copyscores = new int[4];
for(int i=0;i<scores.length;i++)
		copyscores[i]=scores[i];
////这样就非常简单的实现了数组的copy
////同样 如果 将上述测试移到这里,发现修改scores时,copyscores并没有改变。

第二种方法:System.arraycopy类的方法

System.arraycopy(src, srcPos, dest, destPos, length);
///src 被复制数组名
///srcpos 从哪开始复制
///dest 复制数组名
///destpos 从哪开始复制
///length 复制长度
example:
int[] scores= {1,2,3};
int[] copyscores = new int[4];
System.arraycopy(scores, 0, copyscores, 0, 1);
///scores : 1 2 3
///copyscores :1 0 0
System.arraycopy(scores, 1, copyscores, 0, 2);
///scores : 1 2 3
///copyscores :2 3
System.arraycopy(scores, 1, copyscores, 1, 2);
///scores : 1 2 3
///copyscores :0 2 3

详情见以上代码

Ⅱ.与Arrays有关的操作

数组排序:Arrays.sort(数组名)

int[] scores= {3,2,1};
Arrays.sort(scores);
///scores:1 2 3

需要值得一说的是:Arrays.sort默认为 升序排序,并且对所有可比较的数据类型,都可以进行升序排序。

但是此方法也支持,各种类型的排序具体的排序类型需要自行构建比较对象comparator。

数组填充:Arrays.fill(name,begin,end ,val)

int[] copyscores = new int[4];
Arrays.fill(copyscores,0,3,2);
///输出结果:
///2 2 2 0

数组相等:Arrays.equal(name1,name2)

int[] scores= {3,2,1};
int[] copyscores = new int[4];
System.arraycopy(scores, 0, copyscores, 0, 3);
boolean f= Arrays.equals(scores, copyscores);
System.out.print(f);
////输出结果为false
///因为copy数组大小声明为4

4.可变长参数数组与多维数组

Ⅰ:可变长参数数组

这个应用在实际中非常的重要,举个例子:

请你用一个方法使用传参的形式计算出4个数相加的结果,那么就需要传4个参数

   public long GetSum(int a,int b,int c,int d) {
	   long sum=a+b+c+d;
	   return sum;
	}

如果参数个数类型不一:5个6个3个等,这时候用方法重载的办法也会降低效率。

最好的办法就是 —— 可变长参数数组

   public static long GetSum(int...scores) {
	   long sum=0;
	   for(int x:scores)
		   sum+=x;
	   return sum;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(GetSum(1,2,3));
		System.out.println(GetSum(1,2,3,4));
	}
///输出结果:
///6
///10
///可见十分方便~

Ⅱ:多维数组

多维数组可以理解为:一维的一维的一维的一维的一维(....可变长参数)

所以声明与上述声明方法类似,唯一不同在于,每一维空间都可不相同。

声明方法:int[][][] s= new int[][][]///有几维 就几个[]

不定长在于:

int[][] s= new int[4][];
s[0] = new int[2];
s[1] = new int[3];
///注意不定长的一维一定要不带参数

字符串String

1.字符串的创建:

感觉常用的就两种创建:

String a ="123";
String b = new String();
b="321";
System.out.println(a);
System.out.println(b);
///123
///321

特别注意String是一种静态的不可改变的数组,如果想要改变String的可以使用Stringbuffer。

StringBuffer a = new StringBuffer();
a.append(2);
System.out.println(a);

2.字符串String类的附带操作:

发现一个大佬整理的特别强势,也因为此时已经没时间了

String的操作集合


感谢阅读啦,本系列为期末考试而生,有幸帮到你是荣幸。

发布了157 篇原创文章 · 获赞 146 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43857314/article/details/105387725
今日推荐