java基础梳理七:String

字符串:
// 定义:由多个字符组成的一串数据。字符数组可以由多个字符组成(类比,整型数组由多个整型组成)


// 1、String类代表字符串
// 2、Java程序中的所有字符串字面量(比如"abc")都是作为此类的实例实现
// 3、字符串是常量,它们的值在创建以后不能更改


// 字符串的定义
String string = "abc";


// 字符串常用的构造函数:
// 1、String() :初始化一个新创建的 String 对象,使其表示一个空字符序列。
// 2、String(byte[] bytes) :通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
// 3、String(byte[] bytes, int offset, int length) :通过使用平台的默认字符集解码指定的byte 子数组,构造一个新的 String。
// 4、String(char[] value) :分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
// 5、String(char[] value, int offset, int count) :分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
// 6、String(String original) :初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。


// 字符串常用的成员方法:
// 1、int length() :返回此字符串的长度。
String string1 = new String();
System.out.println("string1:" + string1); // 看到显示的结果为无内容,显然String是没有使用Object类的toString方法的
System.out.println("string1的长度为:" + string1.length()); // 0
System.out.println("-----------------------------------------");


// byte[] bytes = { 65, 66, 67, 68 };
byte[] bytes = { 97, 98, 99, 100 };
String string2 = new String(bytes);
System.out.println("string2:" + string2); // abcd
System.out.println("string2的长度为:" + string2.length()); // 4
System.out.println("-----------------------------------------");


String string3 = new String(bytes, 1, 2);
System.out.println("string3:" + string3); // bc
System.out.println("string3的长度为:" + string3.length()); // 2
// java.lang.StringIndexOutOfBoundsException: 如果 offset 和 length
// 参数索引字符超出 bytes 数组的范围
// String string4 = new String(bytes, 3, 2);
// System.out.println("string4:" + string4);
// System.out.println("string4的长度为:" + string4.length());
System.out.println("-----------------------------------------");


char[] chars = { 'J', 'a', 'v', 'a', '真', '简', '单' };
String string5 = new String(chars);
System.out.println("string5:" + string5);//Java真简单
System.out.println("string5的长度为:" + string5.length());//7
System.out.println("-----------------------------------------");


String string6 = new String(chars, 1, 3);
System.out.println("string6:" + string6);//ava
System.out.println("string6的长度为:" + string6.length());//3
// java.lang.StringIndexOutOfBoundsException
// String string7 = new String(chars, 5, 4);
// System.out.println("string7:" + string7);
// System.out.println("string7的长度为:" + string7.length());
System.out.println("-----------------------------------------");


String string8 = new String("中华人民共和国");
System.out.println("string8:" + string8);
System.out.println("string8的长度为:" + string8.length());//7
System.out.println("-----------------------------------------");


String string9 = "中华人民共和国";
System.out.println("string9:" + string9);
System.out.println("string9的长度为:" + string9.length());//7


---------------------------------------------------------------------


// 如何理解:字符串是常量,它们的值在创建以后不能更改
// 1、使用字符串字面量时,先到堆内存中的方法区中的字符串常量池中查找该字面量是否存在,如果存在则直接拿来用;如果不存在着创建之
// 2、字符串字面量的值是常量,它们的值在方法区中的字符串常量池中创建后的确没有发生过改变


String str = "Java";
str += "真简单"; // str = str + "真简单";
// 分解:str + "真简单"  --> "Java" + "真简单"  --> "Java真简单"
// str = "Java真简单";
System.out.println(str);


// 以上三行代码,实际在字符串常量池中创建了3个字符串字面量


----------------------------------------------------------------------


/*
 * 1、== 做比较
 * A:用在基本数据类型上:比较的值是否相等
 * B:用在引用数据类型上:比较的是地址值是否相同
 * 
 * 2、equals 做比较
 * A:用在引用数据类型上:如果继承自Object类的equals,还是比较的是地址值是否相同;有内容比较的要求可以通过重写equals来实现
 * 
 */


// 下句是将字符串的字面量赋值给String类型的变量,首先先去字符串常量池中查找有没有"Java真简单"字符串,没有就创建之
String string1 = "Java真简单";




// 下句是通过new在堆内存中开辟一块空间存放String类型的对象,而该构造函数会使用到"Java真简单"这个字符串字面量,
// 还是先去字符串常量池中查找有没有"Java真简单"字符串,这时池中已经有了"Java真简单"字符串,就不再去创建了,拿着用
String string2 = new String("Java真简单");




// 因为string1 和 string2都是在栈上的声明,string1引用的是字符串字面量"Java真简单"的地址,
//string2引用的是在堆内存中开辟的空间的地址,自然不会相同,也就判断为false
System.out.println(string1 == string2); // false




// String类的成员方法:
//  boolean equals(Object anObject) :将此字符串与指定的对象比较。 
//  将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。 
//  如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
// String的equals方法重写了继承自Object类的equals方法,比较的是两个字符串对象的内容


System.out.println(string1.equals(string2)); // true


-----------------------------------------------------------------------------------


String string1 = new String("Java真简单");
String string2 = new String("Java真简单");
System.out.println(string1 == string2); // false
System.out.println(string1.equals(string2)); // true


String string3 = new String("Java真简单");
String string4 = "Java真简单";
System.out.println(string3 == string4); // false
System.out.println(string3.equals(string4)); // true


// string5引用的字符串常量池中的字面量"Java真简单"(首先也是现在池中找是否存在"Java真简单")
String string5 = "Java真简单";
// string6引用的也是字符串常量池中的字面量"Java真简单"
String string6 = "Java真简单";
System.out.println(string5 == string6); // true
System.out.println(string5.equals(string6)); // true


--------------------------------------------------------------------------


String string1 = "Java";
String string2 = "真简单";
String string3 = "Java真简单";

System.out.println(string3 == string1 + string2); // false
System.out.println(string3.equals(string1 + string2)); // true

System.out.println("---------------------------------------------------------");
System.out.println(string3 == "Java" + "真简单"); // true
System.out.println(string3.equals("Java" + "真简单")); // true

System.out.println("---------------------------------------------------------");
System.out.println(string3 == string1 + "真简单"); // false
System.out.println(string3 == "Java" + string2); // false
System.out.println(string3.equals(string1 + "真简单")); // true
System.out.println(string3.equals("Java" + string2)); // true

// 1、字符串变量做加法(连接)时,先去做开辟空间的事情,再去做字符串的连接
// 2、字符串字面量(常量)做加法(连接)时,先做字符串的连接,再去做开辟空间的事情
// 3、字符串变量和字符串字面量(常量) 或 字符串字面量(常量)和字符串变量做加法(连接)时,
先去做开辟空间的事情,再去做字符串的连接


------------------------------------------------------------------------------------------



 * String类的常用成员方法:(具有判断功能) 
 * 1、boolean equals(Object anObject):将此字符串与指定的对象比较。 
 * 2、boolean equalsIgnoreCase(String anotherString) :将此String 与另一个 String 比较,不考虑大小写。 
 * 3、boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true。
 * 4、boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始。 
 * 5、boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始。 
 * 6、boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束。 

 * 7、boolean isEmpty() :当且仅当 length() 为 0 时返回 true。


String string4 = null; // null值
String string5 = ""; // 空字符串
String string6 = "0";
String string7 = "null";
String string8 = " "; // 有一个空格的字符串


// java.lang.NullPointerException:空指针异常
// System.out.println("string4 isEmpty:" + string4.isEmpty());
System.out.println("string5 isEmpty:" + string5.isEmpty());
System.out.println("string6 isEmpty:" + string6.isEmpty());
System.out.println("string7 isEmpty:" + string7.isEmpty());

System.out.println("string8 isEmpty:" + string8.isEmpty());


* String类的常用成员方法(具有获取功能)
* 1、int length() :返回此字符串的长度。
* 2、char charAt(int index) :返回指定索引处的 char 值。
* 3、int indexOf(int ch) :返回指定字符在此字符串中第一次出现处的索引。(从左向右查找)
* 4、int indexOf(String str) :返回指定子字符串在此字符串中第一次出现处的索引。(从左向右查找,以出现的位置在字符串中的左侧位置为准)
* 5、int indexOf(int ch, int fromIndex) :返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
* 6、int indexOf(String str, int fromIndex) :返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
* 7、String substring(int beginIndex) :返回一个新的字符串,它是此字符串的一个子字符串。
* 8、String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串的一个子字符串。

猜你喜欢

转载自blog.csdn.net/qq_36987708/article/details/80807696