1.练习题
判断一个数是不是质数
public static void main(){
System.out.println(isZS(7));
}
public static boolean isZS(int num){
if(num == 1){
return false;
}
for(int i = 2;i < num;i++){
if(num%i != 0){
return false;
}
}
return true;
}
2.数组
2.1数组的定义
数组,一种数据结构,连续存储,随机存取的特性,不能拓展,确定之后就不可以再修改了.
数组的下表是从0开始,数组中有一个length来保存数组的长度属性.
数组的查询修改的效率较高,但是增删的效率极低,因为要重新创建一个新的空间
数组类似于数据结构的顺序表这个结构,增删的效率极低,但是具有随机存取的特性,
与之相反的是链表,链表是不连续存储的数据结构,查找的效率极低,增删的效率相较于数组高上不少.
2.2数组的存储
数组是引用数据类型的一种,(引用数据类型包含:类数组接口),数组在被定义好之后存储在堆内存中,在栈内存空间中存储仅仅是数组在堆内存空间中的地址
public static void main(){
int age = 18;
//main函数在栈内存中开辟的空间中存储的是age数值的大小
int[] age = {18};
//main函数在栈内存中开辟的空间中存储的是age数组在堆内存空间中的地址
}
2.3数组使用
2.3.1数组的声明
1.静态声明
public static void main(){//静态声明
//数据类型[] 变量名 = {值...}
int[] arr1 = {1,2,3,4};
//数据类型 变量名[] = {值...}
int arr2[] = {1,2,3,4}
//数据类型[] arr3 = new int{值...}
int[] arr3 = new int[]{1,2,3,4}//前两种方式是简写
}
2.动态声明
public static void main(){
//动态声明 声明一个int型数组,数组的大小是5,默认值是0
int[] arr1 = new int[5];
//整型的默认是0 小数的默认是0.0 引用数据的默认是null
//布尔类型的默认是false 字符 \u0000
}
2.3.2获得数组数据
public static void main(){
int arr[] = {1,2,3,4};
System.out.println(arr[1]);//该条语句会打印2
//获取数组的第二个元素
}
2.3.3修改数组数据
public static void main(){
int[] arr = {1,2,3};
int result = arr[1];//通过result来接受arr数组中的整型值
}
2.3.4给main函数传参
右击
2.3.5传值与传址
传值:传入的整型的值
传址:引用数据类型,传入的是地址,数据存在堆空间中
public static void main(){
int age = 18;
System.out.println(age);
//传入algo的是局部变量,改变并不会影响main函数中的变量
algo(age);//会先输出 17 然后输出18
int[] ages = {18};
System.out.println(ages[0]);
algo2(ages);//会输出两个19
//引用数据类型传入的地址
}
public static void algo1(age){
age--
System.out.println(age);
}
public static void algo2(int ages){
ages[0] = 19;
System.out.println(ages[0]);
}
2.3.6数组异常
最常见就是数组下标越界
//java.lang.ArrayIndexOutOfBoundsException: 22
//数组下标越界报错提示
2.3.7数组遍历
public static void main(){
int[] arr = {1,2,3,4,5};
for(int i = 0;i<arr.length;i++){
//通过for循环一次打印一维数组的值
System.out.println(arr[i]);
}
}
2.3.8数组插入复制
public class Array05 {
//插入复制
public static void main(String[] args) {
int[] src = {1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int[] dest = {11,12,13,14,15,16,17,18,19,20,21,22,23,24};
int srcIndex = 2;
int destIndex = 3;
int length = 3;
int[] newDest = copy(src, srcIndex, dest, destIndex, length);
for (int i = 0; i < newDest.length; i++) {
System.out.println(newDest[i]);
}
}
/**
* 插入复制
*
* @param src
* 源数组
* @param srcIndex
* 源数组起始位置
* @param dest
* 目标数组
* @param destIndex
* 目标数组起始位置
* @param length
* 复制个数
*/
public static int[] copy(int src[],int srcIndex,int dest[],int destIndex,int length){
//新数组的长度=目标数组(dest)+插入的个数(length)
int[] newDest = new int [dest.length + length];
//1.目标数组中的 0~起始索引先插入到新的数组之后
for (int i = 0; i <= destIndex; i++) {
newDest[i] = dest[i];
}
//2.将src要插入的插入到newDest中,
int index = destIndex+1;
for (int i = srcIndex; i < srcIndex+length; i++) {
newDest[index]=src[i];
index++;
}
//3.把dest数组剩余的都放到新的数组中
//destIndex+1开始到dest.length结束
for (int i = destIndex+1; i < dest.length; i++) {
newDest[index] = dest[i];
index++;
}
return newDest;
}
}
2.3.9数组替换复制
public class Array06 {
//替换复制
public static void main(String[] args) {
int[] src = { 1, 2, 3, 4, 5, 6 };
int[] dest = { 11, 12, 13, 14, 15, 16 };
int srcIndex = 1;
int destIndex = 2;
int length = 2;
copy(src, srcIndex, dest, destIndex, length);
// 调用API
//System.arraycopy(src, srcIndex, dest, destIndex, length);
for (int i = 0; i < dest.length; i++) {
System.out.println(dest[i]);
}
}
/**
* 替换复制
*
* @param src
* 源数组
* @param srcIndex
* 源数组起始位置
* @param dest
* 目标数组
* @param destIndex
* 目标数组起始位置
* @param length
* 复制个数
*/
public static void copy(int src[],int srcIndex,int dest[],int destIndex,int length){
//src的srcIndex是用来替换的,从srcIndex开始,长度为length要被替换到
//dest数组中以destIndex开始,length结束的地方
for (int i = 0; i < length; i++) {
dest[destIndex] = src[srcIndex];
srcIndex++;
destIndex++;
}
}
}
3.二维数组
3.1定义
二维数组中存储都是一维数组,以此类推,
三维数组中存储都是二维数组
public static void main(){
int[][] arr = {{1,2,3},{2,3,4}};
//在arr这个二维数组中,有两个一维数组,并且这俩一维数组都有三个元素
}
3.2命名
命名方式类似于一维数组,也是分为静态,动态
public static void main(){
//静态声明
int[][] arr = {{123},{123}};
//动态声明
int[][] arr1 = new int[5][5];
//动态定义一个 可以存储六个一维数组
//并且每一个一维数组都最多可以存储六个元素
}
3.3查询
public static void main(){
int[][] arr = {{1,2,3}{4,5,6},{7,8,9}};
int[] arr_1 = arr[1];//用一个一维数组来接受 二维数组的第一个元素
//因为二维数组的每一个元素都是由一维数组组成
//再用一个int 来接受这个int变量
int arr__1 = arr_1[1]
//上面做法得到的结果等于下面这行代码
int arr__2 = arr[1][1];
}
3.4修改
public static void main(){
int[][] arr = {{1,2,3}{4,5,6},{7,8,9}};
arr[1][1] = 2;//会把二维数组arr的第二个一维数组的第二个元素变为2 {4,2,6}
}
3.5遍历
public static void main(){
int[][] arr = {{1,2,3}{4,5,6},{7,8,9}};
for(int i = 0;i<arr.length;i++){
for(int j = 0; j< arr[i].length;j++){
//使用双层for循环,就类似于,每一行代表一个一维数组
System.out.print(arr[i][j] + " ");
}
System.out.println(" ");
}
}
3.6二维数组锯齿状
public static void main(){
int[][] arr = new int[4][];
//这个时候打印,会打印一个五行五列的0
for(int i=0;i<=arr.length;i++){
arr[i] = new int[i+1];
//这个时候打印会出现,第一行一个0,第二行2个0,以此类推
}
}
4.交换变量值
package _05_Array;
public class Array09 {
//交换变量值
public static void main(String[] args) {
int a = 9;
int b = 10;
// 1 中间变量(开发常用)
int temp = a;
a = b;
b = temp;
// 2 加减法
a = 9;
b = 10;
a = a + b;
b = a - b;//这个时候 a已经变成了a+b 用 a+b - b = a 所以 b = a a还是a+b
a = a - b;//再用 a+b -b(b是a),就得到了a=b
// 3 位异或//a^a = 1
a = 9;
b = 10;
// a=9 0 000 1001
// b=10 0 000 1010
// a= 0 000 0011
a = a ^ b;
// b= 0 000 1001
b = a ^ b;
// 0 000 1010
a = a ^ b;
System.out.println("a=" + a + " , b=" + b);
}
}