增强for循环
什么是增强for循环?
增强for循环 (也称for each循环) 是迭代器遍历方法的一个“简化版”,是一个高级for循环,专门用来遍历数组和集合。
其在遍历数组/集合的过程中,不能对集合中的元素进行增删操作。
增强for循环的使用
1.使用范围:用来遍历集合和数组(必须有遍历目标,目标只能是集合或者数组),所有单列表集合都可以使用增强for循环。 2.格式如下:
int[] array = {1,4,6,2,7,9}
for(int a: array) //格式: 数组的数据类型 变量名 :数组名
{
System.out.println(a));
}
Arrays工具类
java.util.Arrays工具类:提供了非常实用的方法,可以帮助我们在处理数组时更加高效和便捷
Aarry的几个常用函数:
排序 : sort()
对数组从小到大的排序(String类型的数组不宜使用)
查找 : binarySearch()
二分查找法找指定元素的索引值,数组一定是排好序的,否则会出错(Bug)。找到元素,只会返回最后一个位置 。
返回不存在元素的规律:-(应该插入的位置索引 + 1)
int arr[] = { 1, 3, 2, 7, 6, 5, 4, 9 };
//int binarySearch(Object[] a, Object key):在a数组中查找key,返回key在数组中的位置 (无序)
int a1=Arrays.binarySearch(arr,10); //-9
int a2=Arrays.binarySearch(arr,6); //-4
int arr1[] = {1, 4, 6, 7, 9, 10}
int a1=Arrays.binarySearch(arr,10); //5
int a2=Arrays.binarySearch(arr,6); //2
比较: equals()
判断两个数组是否相等
//boolean equals(Object[] a, Object[] a2):比较两个数据是否相等
String string1[]={"1","2","3","4","5"};
String string2[]={"1","3","5","7","9"};
String string3[]={"1","3","5","7","9"};
String string4[]=null;
String string5[]=null;
boolean b1= Arrays.equals(string1,string2); //false
boolean b2=Arrays.equals(string2,string3); //true
boolean b3=string2.equals(string3); //false
boolean b4=Arrays.equals(string1,string3); //false
boolean b5=Arrays.equals(string4,string5); //true
转字符串 : toString()
返回指定数组的内容的字符串表示形式
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
复制: copyOf()
1.int[] copyOf(int[] a, int len):从a数组中截取长度为len的新数组
2.int[] copyOfRange(int[] a, int from, int to):从original数组中截取[from,to)新数组
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//copyOf 方法实现数组复制,a为数组,6为复制的长度
int a1[] = Arrays.copyOf(a, 6);
for (int i : a1) {
System.out.print(i); //123456
}
// copyOfRange:将a数组的指定范围(4~8)复制到新数组a2中
int a2[] = Arrays.copyOfRange(a, 4, 8);
for (int j : a2) {
System.out.print(j); //5678
}
String类概述
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
String类的特点
-
字符串不可变,它们的值在创建后不能被更改
-
虽然 String 的值是不可变的,但是它们可以被共享
-
字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
String类的构造方法
-
常用的构造方法
方法名 说明 public String() 创建一个空白字符串对象,不含有任何内容 public String(char[] chs) 根据字符数组的内容,来创建字符串对象 public String(byte[] bys) 根据字节数组的内容,来创建字符串对象 String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc -
示例代码
public class StringDemo01 { public static void main(String[] args) { //public String():创建一个空白字符串对象,不含有任何内容 String s1 = new String(); System.out.println("s1:" + s1); //public String(char[] chs):根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs); System.out.println("s2:" + s2); //public String(byte[] bys):根据字节数组的内容,来创建字符串对象 byte[] bys = {97, 98, 99}; String s3 = new String(bys); System.out.println("s3:" + s3); //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc String s4 = "abc"; System.out.println("s4:" + s4); } }
创建字符串对象两种方式的区别
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
字符串的比较
==号的作用
-
比较基本数据类型:比较的是具体的值
-
比较引用数据类型:比较的是对象地址值
equals方法的作用
-
方法介绍
public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写
-
示例代码
public class StringDemo02 { public static void main(String[] args) { //构造方法的方式得到对象 char[] chs = {'a', 'b', 'c'}; String s1 = new String(chs); String s2 = new String(chs); //直接赋值的方式得到对象 String s3 = "abc"; String s4 = "abc"; //比较字符串对象地址是否相同 System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s3 == s4); System.out.println("--------"); //比较字符串内容是否相同 System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s3.equals(s4)); } }
字符串拼接
“ + ” 操作符
String对象后面跟着一个 “+” 时,不管 “+” 后面的是什么数据(可能不是Strig对象),都会转换为字符串。当使用 “+” 拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容
concat 方式
当两个量都为String类型且值不为null时,可以用concat方式。
代码示例:
/**
* 1.字符串的拼接:基本数据类型中+是加法运算。
* 字符串参与+运算时,统一按拼接处理
* 2.字符串字面值直接拼接,查找常量池,没有就创建,然后引用
* 有变量参与拼接时没同意在堆内存中new,所以地址肯定不一样
*/
String str1 = "hello";
String str2 = " world";
String str3 = "hello world";
System.out.println(str1+str2);
System.out.println(("hello"+" world") == str3);//ture
System.out.println((str1 +" world") == str3);//false
System.out.println((str1+str2) == str3);//false
System.out.println(str1+1);//hello1
System.out.println(str1+1+1);//hello11
System.out.println(1+1+str1);//2hello
//str1拼上str2
System.out.println(str1.concat(str2)); //hello world
System.out.println("hello".concat(" world") == str3); //false
上课整理:
-
/* * 1.字符串就是一串字符,带 ""。 * 2.字符串是引用类型,String * 3.字符串的定义:String 变量名 = 值; * 4.基本数据类型中, ==比较的是值。引用数据类型中, * == 比较的是内存地址。 * 5.String 变量 = 字面值 * 和String 变量 = new String(字面值). * ==比较结果为FALSE,说明地址不一样,不是同一个。 * 6.String 变量=字面值。首先检查常量池有没有此字面值, * 有的话引用他的地址;没有的话先创建在使用。 * 7.String 变量 = new String(字面值), * 首先检查常量池有没有此字面值,没有的话先创建 * 然后在堆内存开一个空间引用他的地址 * 然后变量实际指向堆内存的地址; * 8.Str1.equals(str2)方法比较Str1和str2的字面值是否一样 */ String str = "Hello World"; System.out.println(str); String str1 = "我爱双体"; System.out.println(str1); String str2 = new String("我爱双体"); System.out.println(str2); //我爱双体 System.out.println(str1 == str2); //false String str3 = "我爱双体"; System.out.println(str1 == str3);//true String str4 = new String("我爱双体"); System.out.println(str2==str4);//false System.out.println(str3==str4);//false //equals()方法比较字面值 System.out.println(str1.equals(str2));//true System.out.println(str1.equals(str3));//true System.out.println(str3.equals(str4));//true
扩展
字符串存储的内存原理
String s = “abc”;直接赋值
特点:
此时字符串abc是存在字符串常量池中的。
先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。
所以,直接赋值的方式,代码简单,而且节约内存。
new出来的字符串
看到new关键字,一定是在堆里面开辟了一个小空间。
String s1 = new String(“abc”);
String s2 = “abc”;
s1记录的是new出来的,在堆里面的地址值。
s2是直接赋值的,所以记录的是字符串常量池中的地址值。
==号比较的到底是什么?
如果比较的是基本数据类型:比的是具体的数值是否相等。
如果比较的是引用数据类型:比的是地址值是否相等。
结论:==只能用于比较基本数据类型。不能比较引用数据类型。