整理的笔记
【有错请见谅且指出,无错以后自己看的时候有新见解再添】
目录
资源
视频: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};
注意:
-
在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。
int []a; //只声明了变量a,未初始化为一个真正的数组
-
new过后才算给数组初始化了。一旦创建了数组,就可以给数组元素赋值。
-
初始化值,创建一个数字数组时,元素全为0。boolean数组,元素全为false。对象数组,元素全为
null
,表示这些元素还未存放任何对象。 -
int[] a = new int[10]
只能访问0-9下标的元素。访问a[10] 出现“ array index out of bounds ”异常 -
数组一旦创建,不能改变它的大小(即长度)。如果要经常需要在运行过程中扩建数组的大小,就应该使用——数组列表(array list)
-
【允许数组长度为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实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”
要想创建一个不规则的数组
-
需要分配一个具有所含行数的数组
int[][] odds = new int[MNAX + 1]
-
分配列(每行元素的一条行)
for(int n = 0; n <= NMAX; n++){ odds[n] = new int[n + 1]; }
-
分配了数组之后,假定没有超出边界,就可以采用通常的方式访问其中的元素了
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字符串的所有字符全转换为大写字符
…