前言:
数组与字符串 (说好一周一更的呢?
从这篇开始,不在使用截图验证方式,代码验证似乎更让人懂。
目录
一、数组
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类的附带操作:
发现一个大佬整理的特别强势,也因为此时已经没时间了
感谢阅读啦,本系列为期末考试而生,有幸帮到你是荣幸。