JavaSE数组和字符串
数组相关操作
- 新建数组
int[] anArray;
int[] anArray = new int[10];
int[] arr = new int[] {1,2,3,4,5};
- for循环:
int arr[] = new int[] {1,2,3,4,5};
for(int i = 0 ;i < arr.length; i++)
{System.out.println(anOtherArray[i]);
}
- for-each循环:
for(int element : arr)
{System.out.println(element);
}
数组和List
经典for-each
public static void main(String[] args) {int[] anArray = new int[] {1, 2, 3, 4, 5};List<Integer> aList = new ArrayList<>();for (int element : anArray) {aList.add(element);}// [1, 2, 3, 4, 5]System.out.println(aList);}
}
使用 IntStream + forEach
public static void main(String[] args) {int[] anArray = {1, 2, 3, 4, 5};List<Integer> aList = new ArrayList<>();Arrays.stream(anArray).forEach(aList::add);System.out.println(aList);}
使用 boxed() 与 toList()(Java 16+ 推荐)
public static void main(String[] args) {int[] anArray = {1, 2, 3, 4, 5};List<Integer> aList = Arrays.stream(anArray).boxed() // 将 int 转换为 Integer.toList(); // 转为 List<Integer>System.out.println(aList);}
数组的排序和查找
使用Arrays类提供的sort()方法
- 基本数据类型按照升序排列
- 实现了Comparable接口的对象按compareTo()排序
public static void main(String[] args) {int[] arr = new int[] {5, 2, 1, 4, 8};Arrays.sort(arr);// [1, 2, 4, 5, 8]System.out.println(Arrays.toString(arr));
}public static void main(String[] args) {String[] yetAnotherArray = new String[] {"A", "E", "Z", "B", "C"};Arrays.sort(yetAnotherArray);// [A, B, C, E, Z]System.out.println(Arrays.toString(yetAnotherArray));
}
反序局部元素:
public static void main(String[] args) {String[] arr = new String[] {"A", "E", "Z", "B", "C"};Arrays.sort(arr, 1, 3,Comparator.comparing(String::toString).reversed());// [A, Z, E, B, C]System.out.println(Arrays.toString(arr));}
查找元素
public static void main(String[] args) {int[] arr = new int[] {5, 2, 1, 4, 8};for (int i = 0; i < arr.length; i++) {if (arr[i] == 4) {// 找到 3System.out.println("找到 " + i);break;}}}
数组复制
public static void main(String[] args) {int[] array1 = {1, 2, 3};int[] array2 = {4, 5, 6};// 创建一个新数组,长度为两个数组长度之和int[] mergedArray = new int[array1.length + array2.length];// 复制第一个数组到新数组System.arraycopy(array1, 0, mergedArray, 0, array1.length);// [1, 2, 3, 0, 0, 0]System.out.println(Arrays.toString(mergedArray));// 复制第二个数组到新数组System.arraycopy(array2, 0, mergedArray, array1.length, array2.length);// [1, 2, 3, 4, 5, 6]System.out.println(Arrays.toString(mergedArray));}
遍历复制数组
public static void main(String[] args) {int[] array1 = {1, 2, 3};int[] array2 = {4, 5, 6};// 创建一个新数组,长度为两个数组长度之和int[] mergedArray = new int[array1.length + array2.length];// 复制第一个数组到新数组int index = 0;for (int element : array1) {mergedArray[index++] = element;}// 复制第二个数组到新数组for (int element : array2) {mergedArray[index++] = element;}// [1, 2, 3, 4, 5, 6]System.out.println(Arrays.toString(mergedArray));
}
二维数组:
int[][] oddNumbers = { {1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23} };for(int i = 0; i < oddNumbers.length; i++){for(int j = 0; j < oddNumbers[i].length; j++){System.out.println(oddNumbers[i][j]);}
}
stream 流打印 Java 数组
public static void main(String[] args) {String [] arr = {"1","2","3"};// 普通输出System.out.println(arr);// 第一种方式Arrays.asList(arr).stream().forEach(s -> System.out.println(s + " "));// 第二张方式Stream.of(arr).forEach(System.out::println);// 第三种方式Arrays.stream(arr).forEach(System.out::println);}
for循环打印数组
public static void main(String[] args) {String [] arr = {"1","2","3"};// for循环打印数组for(int i = 0; i < arr.length; i++){System.out.println(arr[i]);}for (String s : arr) {System.out.println(s);}}
Arrays 工具类打印数组
Arrays.toString() 可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组,有多种重载形式。
public static void main(String[] args) {String [] arr = {"1","2","3"};// toString方法 [1, 2, 3]System.out.println(Arrays.toString(arr));
}
String类的声明
Java字符串是不可变的
,被final修饰,不会有子类,没有子类可以重写该方法;数据存储在char[]数组,也是被final修饰的。
- 可以保证String对象的安全性
- 保证哈希值不会频繁变更
- 实现字符串常量池,节省存储空间
substring()、concat()、replace()都是new新的字符串对象,都不是在原来的字符串进行的,原来的字符串对象没有发生改变。
string对象一旦被创建就固定不变,对它的任何操作都不会影响原来的字符串对象,会生成新的字符串对象。
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {
}
- final类:不能被子类继承
- Serializable接口:可以序列化
- Comparable接口:compareTo()方法比较两个字符串是否相等
- String、StringBuffer、StringBuilder都实现了CharSequence接口,不可变。
==比较对象的地址
,比较字符串内容可以使用equals()方法。
String 类的 hashCode 方法
每一个字符串都有一个hash值,这个哈希值大概率不重复,所以String适合作为HashMap的键值。
先看hashCode方法的源码:
private int hash; // 缓存字符串的哈希码public int hashCode() {int h = hash; // 从缓存中获取哈希码// 如果哈希码未被计算过(即为 0)且字符串不为空,则计算哈希码if (h == 0 && value.length > 0) {char val[] = value; // 获取字符串的字符数组// 遍历字符串的每个字符来计算哈希码for (int i = 0; i < value.length; i++) {h = 31 * h + val[i]; // 使用 31 作为乘法因子}hash = h; // 缓存计算后的哈希码}return h; // 返回哈希码
}
上述的方法叫做“31倍哈希法”,将得到哈希存储在成员变量,便于下次使用;31倍哈希法简单易实现,计算速度快,均匀分布在哈希表种。
public static void main(String[] args) {String name = "一成";int hashCode = computeHashCode(name);// 一成" 的哈希码是: 644112System.out.println( name + "\" 的哈希码是: " + hashCode);// String 的 hashCode 644112System.out.println("String 的 hashCode " + name.hashCode());}public static int computeHashCode(String name) {int h = 0;for (int i = 0; i < name.length(); i++) {h = 31 * h + name.charAt(i);}return h;}
String 类的 substring 方法
substring常用来截取字符串
public static void main(String[] args) {String str1 = "Hello, yicheng!";// 1.提取字符串中的一段子串// 从第7个字符(包括)提取到第12个字符(不包括)String subStr = str1.substring(7, 12);// 输出 "world"System.out.println(subStr);// 2.提取字符串中的前缀或后缀String str2 = "Hello, yicheng ";// 提取前5个字符,即 "Hello"String prefix = str2.substring(0, 5);// 提取从第7个字符开始的所有字符,即 "yicheng"String suffix = str2.substring(7);// 3.查找子字符串的位置(从指定位置开始查找)String str3 = "Hello yicheng";// 从索引为3的位置开始查找 "l" 子字符串在 str 中第一次出现的位置int index = str3.indexOf("l", 3);// 输出 3System.out.println(index);// 4.查找多个子字符串String str4 = "Hello, yicheng";// 查找 "o" 子字符串在 str 中第一次出现的位置int index1 = str4.indexOf("o");// 从索引为5的位置开始查找 "o" 子字符串在 str 中第一次出现的位置int index2 = str4.indexOf("e", 5);// 输出 4System.out.println(index1);// 输出 8System.out.println(index2);}
String其它方法
- length():返回字符串长度
- isEmpty():判断字符串是否为空
- charAt():返回指定索引处的字符
- valueOf() :将其他类型的数据转换为字符串
- getChars(): 把整数复制到字符数组
- getBytes(): 返回字符串的字节数组,可以指定编码方式
- trim(): 去除字符串两侧的空白字符
- toCharArray(): 将字符串转换为字符数组
public static void main(String[] args) {String name = "一成在成长";char[] result = name.toCharArray();// [一, 成, 在, 成, 长]System.out.println(Arrays.toString(result));}