Java数组与字符串

本文详细介绍了Java中的数组,包括一维、多维数组及不规则数组的创建、遍历和初始化。此外,还讲解了字符串的基础知识,如不可变性、空串与null的区别,以及常用的字符串方法。附带相关资源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理的笔记
【有错请见谅且指出,无错以后自己看的时候有新见解再添】

资源

视频:https://www.bilibili.com/video/av48144058

书:《Java核心技术(原书第10版) 卷Ⅰ》

数组

数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。

内存解析

在这里插入图片描述

一维数组

格式:

数据类型[] 数组名称 = new 数据类型[长度];

方式一:
int a[]; //int[] a;
int n = 10;
a = new int[n];	//n可以为整型变量,或整型数字(常量)
方式二:
int[] a = new int[5];
方式三:
int[] a = {}1,5,6,7,6};
方式四:
int[] a = new int[]{1,2,3};

注意:

  1. 在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。

    int []a; //只声明了变量a,未初始化为一个真正的数组

  2. new过后才算给数组初始化了。一旦创建了数组,就可以给数组元素赋值。

  3. 初始化值,创建一个数字数组时,元素全为0。boolean数组,元素全为false。对象数组,元素全为null,表示这些元素还未存放任何对象。

  4. int[] a = new int[10] 只能访问0-9下标的元素。访问a[10] 出现“ array index out of bounds ”异常

  5. 数组一旦创建,不能改变它的大小(即长度)。如果要经常需要在运行过程中扩建数组的大小,就应该使用——数组列表(array list)

  6. 【允许数组长度为0】在编写一个结果为数组的方法时,碰巧结果为空,这时就非常有用。

    new a[0] //数组长度为0与null不同。null:表明该引用目前没有指向任何对象的值【开辟了空间没有值】。

    https://blog.youkuaiyun.com/ithinkthereforiam/article/details/57425468

多维数组(二维及以上)

多维数组使用多个下标访问数组元素,适用于表格或更加复杂的排列形式。

二维数组

相当于一个一维数组的每个元素是一维数组。

格式:数据类型[][] 数组名 = new 数据类型[行数][列数];

静态初始化:

int[][] arr = new int[][] {
    {1,2,3},
    {4,5},
    {6,7,8}
};

动态初始化:

String[][] arr = new String[3][2];
String[][] arr = new String[3][];

错误写法:

/* 错误写法
 * String[][] arr = new String[][2];
 * String[4][3] arr = new String[][];
 * int[][] arr = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
 */

正确的怪异写法。【不标准】

int[] arr[] = new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr[] = {{1,2,3},{4,5},{6,7,8}};

注意

  • 初始化时一定要设置行的长度
  • 二维数组允许每行列数不相同

不规则数组

Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”

要想创建一个不规则的数组

  1. 需要分配一个具有所含行数的数组

    int[][] odds = new int[MNAX + 1]

  2. 分配列(每行元素的一条行)

    for(int n = 0; n <= NMAX; n++){
        odds[n] = new int[n + 1];
    }
    
  3. 分配了数组之后,假定没有超出边界,就可以采用通常的方式访问其中的元素了

    for(int n = 0; n < odds; n++){
        for(int k = 0; k < odds[n].length; k++){
            ....
        }
    }
    

好处:比较节省内存空间??

for循环遍历数组

一维数组

int[] a = new int[5];
//for循环便利数组给数组赋值,或者输出
for(int i = 0; i < 5; i++) //5可以替换为a.length 获取数组长度
{
    a[i] = 1;
}

二维数组(数组的数组)

int[][] a = {
    {1,2,3},
    {4,5},
    {6,7,8}
};
for(int i = 0; i < a.length; i++){
    for(int j = 0; j < a[i].length; j++){ //x[i].length; //计算数组a的第i行元素的个数
        System.out.print(a[i][j] + "\t");
    }
    System.out.println();
}

for each循环遍历数组

Java有一种功能性很强的循环结构,可以用来依次处理数组中的每个元素(其他元素的集合也可以,即二维数组的foreach),不使用下标就可以遍历数组

一维数组

格式:for(变量数据类型 变量 : collection) 语句 //变量相当于下标,collection为需要遍历的数组

for (int temp : a) {
	System.out.print(temp + "\t");
}

二维数组

for each循环语句不能自动处理二维数组的每一个元素。它是按照行,也就是一维数组处理的。遍历二维数组需要两个for each嵌套使用

for (int[] row : a){ //遍历行
	for(int col : row)
        System.out.print(col); //遍历列,一次行遍历多次列
    System.out.println();
}
  • collection集合表达式必须时一个数组或者是一个实现类Iterable接口的类对象
  • 循环a中的每一个元素(for each element in a )
  • 好处:更加简洁、更不易出错(不必为了下标的起始值和终止值而操心
  • 会遍历数组的每一个元素,如果不需要遍历每一个,可以使用for循环

toString打印数据元素列表(更加简单的方式)

**一维数组:**Arrays类的toString方法,打印数组中的所有元素。

int[] a = {1,5,6,7,6};
System.out.println(Arrays.toString(a));
//返回一个包含数组元素的字符串。
//[1,5,6,7,6]]

**二维数组:**Arrays类的deepToString方法

int[][] a = {
    {1,2,3},
    {4,5},
    {6,7,8}
};
System.out.println(Arrays.deepToString(a));
//输出格式为
//[[1,2,3],[4,5],[6,7,8]]

数组的初始化以及匿名数组

创建数组对象并同时赋予初始值的简化书写 【创建的匿名数组只能使用一次,不能多次使用】

格式:new int[] {17, 18, 23, 56, 100}

int[] a = {1, 2, 3, 4, 5};
a = new int[] {17, 18, 23, 56, 100}; //在不创建新变量的情况下重新初始化一个数组
//相当于
int[] a = {1, 2, 3, 4, 5};
int[] b = new int[] {17, 18, 23, 56, 100};
a = b; //a和b指向同一块内存地址
System.out.println(Arrays.toString(a)); //[17, 18, 23, 56, 100]
b[0] = 1;
System.out.println(Arrays.toString(a)); //[1, 18, 23, 56, 100]

数组的常用方法

Arrays工具类

length 获取数组长度(数组有多少个),数组中的属性 例:int n = a.length

equals 如果两个数组大小相同,且下标相同的元素的值都对应相等,返回true。 例:boolean flag = equals(a, b)

fill 将指定值填充到数组中 例:fill(a, 1) //将数组a中的数据元素全换为1。数组a和值要类型相同

toString 输出整个数组的信息,即返回包含数组中的数据元素的字符串,数据元素都被放在括号内,并用逗号分割

sort 排序 【快速排序算法】 升序

binarySearch 在数组中查找该值是否存在【二分搜索算法,折半查找】,返回相应的下标值,否则返回负数值。

copyOf / copyOfRange 返回与原数组类型相同的一个数组,数组元素为原数组的值

String 字符串

Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,String。

每个用双引号括起来的字符串都是String类的一个实例。字符串是“”括起来的字符序列,Unicode序列

格式一:

String 变量名;

变量名 = new String("字符串");

格式二:String = new String("字符串");

格式三:String = "字符串";

不可变字符串

String类没有提供用于修改字符串的方法。如何修改这个字符串?提取需要的字符,再拼接上替换的字符串:s = s.substring(0, 3) + "p!";

不可变字符串优点:编译器可以让字符串共享

Java的设计者认为共享带来的高效率远胜过于提取、拼接字符串所带来的低效率。【自我理解:把原始字符串放置在堆中,字符串遍历指向存储池中相应的位置。如果复制一个字符串变量,原始字符串和复制的字符串共享相同的字符。】

如果一块内存不再使用了,系统最终会将其回收。

空串和null串

空串:长度为0的字符串

检测一个字符串是否为空:

if(str.length == 0)
if(str.equals(""))

空串是一个Java对象,有自己的串长度(0)和内容(空)

null:特殊值,没有任何对象与该变量关联。【暂这么多】

检查一个字符串是否为null

if(str == null)

如果要检查一个字符串既不是null也不为空串。【需要先检查str不为null】

if(str != null && str.length() != 0)

码点与代码单元【暂空】

暂留,不是很能懂

字符串的常用方法

(字符串开始位置从0开始,类似于数组)

String[] sf2 = f2.list();//放回string类型的数组

a.length() 返回int,返回字符串a的长度

a.equals(Object anObject) 返回boolean,将字符串a与anObject字符串相比较,相等返回true反之返回false。不能使用==比较字符串,因为//string存的是地址,用new运算符调用 string相当于再次开辟了一块内存空间,所以a == c 输出为false

a.substring(int start) 返回String,返回字符串中从开始位置到字符串末尾的子串

a.substring(int start,int end) 返回String,返回字符串中从开始位置到(end-1)的子串

a.charAt(int index) 返回char,返回index指定位置的字符

a.indexOf(String str) 返回int,返回str在字符串中第一次出现的位置,值为-1时字符不存在

a.compareTo(String anotherString) 返回int

(1)a字符串大于b字符串,则返回大于0的值

(2)若相等,则返回数字0

(3)a字符串小于b字符串,则返回小于0的值

例:x=“abc” y=“adc” 那么x.compareTo(y) 结果为-2 x<y

a.replace(oldchar,newchar) 返回String,返回a字符串中所有old字符被new字符替换掉后的a字符串

a.replaceAll(oldString,newString) 返回String,返回a字符串中所有old字符串被new字符串替换后的a字符串

a.trim() 返回String,去掉a字符串首尾的空格

a.toLowerCase() 返回String,将a字符串的所有字符全转换为小写字符

a.toUpperCase() 返回String,将a字符串的所有字符全转换为大写字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值