Java学习笔记-5.常用数据结构
一、数组
1.Java是将数组作为对象来实现的,而非连续的存储空间
2.在Java中,数组时一个类,提供了一些方法和属性,如数组长度array.length
3.Java中数组名可视为对象引用,在初始化时,不能直接定义长度
例:int a[3]; //错误的声明方法
4.数组中的元素也可以是复合数据类型的,这时数组元素实际上是对象引用
例:
Complex[] arr = new Complex[3]; int i; for(i = 0; i < arr.length; i++) { arr[i] = new Complex(); }5.一维数组的声明:type arrayName[]; 或type[] arrayName;
动态初始化:type[] arrayName = new type[length];
静态初始化:type[] arrayName = {val0, val1, …, valn};
6.二维数组的声明:type[][]arrayName; 或type arrayName[][];
动态初始化:type[][] arrayName = new type[length1][length2]; //规则数组
或:type[][] arrayName = new type[length1][]; //不规则数组
array[0] = new type[length2_1];
array[1] = new type[length2_2]; ……
静态初始化:type[][] arrayName = {{1, 2, …}, {1, 2, …}, …};
注:arrayName.length表示二维数组的行数
arrayName[i].length表示二维数组第i行的列数
7.foreach形式的for语句
形式:for(数据类型 迭代变量 : 数组|集合) {
//循环体
}
注意:foreach形式的循环体中通过迭代变量无法修改数组中元素的值
8.Arrays类常用方法
序号 方法 含义 1 static int binarySearch(type[] a, type key) 二分查找,返回数组a中值为key的元素下标值 2 static boolean equals(type[] a, type[] b) 判断数组a和b是否相等 3 static boolean deepEquals(Object[] a, Object[] b) 判断数组a和b是否相等,用于多维数组 4 static void fill(type[] a, type val) 将数组a中的元素都赋值为val 5 static void sort(type[] a) 对数组a中的元素非递减排序 6 static void sort(type[] a, int from, int to) 对数组a中下标from至to的元素进行非递减排序 7 static String toString(type[] a) 返回数组a内容的字符串表示形式 8 static String deepToString(type[] a) 返回数组a内容的字符串表示形式,用于多维数组
二、字符串
1.在Java中出现的字符串常量在编译时都会被转换为String类型的对象
2.创建String对象
String类的构造方法:String() String(String str) String(char[] arr)
创建方法:
(1)String str1; str1 = new String("Hello World");
(2)String str2 = "Hello World";
(3)char[] arr = {'a', 'b', 'c'}; String arr3 = new String(arr);
3.String类的常用方法
(1)运算符 +:用于两个字符串的连接操作
(2)运算符 charAt(int position):字符串中第position个字符(从0开始计数)
(3)运算符 equals(String str):比较两个字符串是否相同
注:
String str1 = new String("Hello"); String str2 = new String("Hello");str1..equals(str2)的结果是true
str1 == str2的结果是false,因为"=="运算符用于比较str1与str2的值,而这两个引用变量分别存放不同的String对象地址
忽略大小写的比较:equalsIgnoreCase()
(4)运算符 indexOf():查找字符串,参数可以是字符或字符串
(5)运算符 split():用于字符串的分割,将字符串根据给定参数进行分割,参数可以是字符或字符串
(6)运算符 toLowCase() toUpperCase():转换大小写
4.main方法的参数
例:
class ArgsDemo { public static void main(String[] args) { for (int i = 0; i < args.length; i++) { System.out.println("args[" + i + "]:" + args[i]); } } }5.StringBuffer 与 StringBuilder 类
String类用于处理创建后内容不再改变的字符串变量,所以在处理内容可变的字符串时,采用StringBuffer或StringBuilder效率较高
StringBuffer类支持多线程,因此多采用StringBuffer
构造方法:
StringBuffer s1 = new StringBuffer(); //创建一个空的StringBuffer对象(初始容量为16) StringBuffer s2 = new StringBuffer(10); //创建一个初始容量为10的StringBuffer对象 StringBuffer s3 = new StringBuffer("Hello"); //创建一个内容为Hello的StringBuffer对象(初始容量为字符串长度加上16) //StringBuffer s4 = "Hello"; 为非法的6.StringBuffer类方法
(1)public void append(type t); //作用为追加新内容
public void insert(int i, type t); //作用为插入新内容
type类型可以是所有基本数据类型、字符数组和对象引用等
i表示在第i个字符处插入新内容
(2)String类与StringBuffer类的转换
StringBuffer->String:String s2 = s1.toString();
String->StringBuffer:StringBuffer s1 = new StringBuffer(s2);
三、Vector类
1. Vector类用于描述向量,定义在java.util包中,可视为允许不同类型元素共存的可变长数组
Vector类的3个属性:长度、容量和增量
长度:向量存储的元素个数
容量:向量的大小,一般容量大于等于长度
增量:容量不足时,每次扩充的量
向量的容量扩充是自动进行的,即当新增的元素超出其容量时,向量的容量会自动增长
构造方法:
方法 含义 public Vector() 构造一个空的向量对象,容量为10,增量为0 public Vector(Collection c) 用于构造一个包含指定集合中元素的向量 public Vector(int initialCapacity) 向量初始容量为initialCapacity,增量为0 public Vector(int initialCapacity, int capacityIncrement) 向量初始容量为initialCapacity,增量为capacityIncrement 设置的向量增量越小,内存空间的利用率越高,但会造成内存分配的次数增多
设置的向量增量越大,执行内存分配的次数将相对较小,但有可能产生内存浪费
在向量中添加元素:add()方法 或 insertElementAt()方法
插入元素后,插入位置之后的元素都向后移动一个单位
在向量中删除元素:removeElement()方法
删除元素后,删除位置之后的元素都向前移动一个单位
清楚向量中的所有元素:removeAllElement()方法 或 clear()方法
访问指定下标处元素:elementAt()方法
查找某个元素在向量中的位置:indexOf()方法