11字符串

字符串变量是引用数据类型,其变量名存储在内存A区(相对小的区域),B区存字符串内容(所有引用类型都是如此存储),A区字符串地址的内容就是B区对应字符串存储的地址,而像int型数字就只存在于A区,变量名地址的内容就是其数值,String在java.lang包下(课程上老师讲的很多函数的具体用法可能都没讲全,需要自己课下多看看文档能怎么用)

如果对一个字符串变量重新赋值,相当于在B区新开辟一个区域,然后将A去字符串变量名的地址存储内容改成新的B区地址(和python贴标签一样)

定义字符串变量

String a = "Hello World!";

String b = new String("Tom"); //通过字符串类

"\n”同样表示换行

System.out.println(a+'\n'+b);//将a,b换行输出

字符串拼接

字符串和字符串加法没说的了

不同的内容和字符串拼接得到的结果还是字符串,看下例,注意字符'a'不是按数值走

String a = "Hello";

String b = a+3+true+'a'+4.12;          //Hello3truea4.12

字符串api

定义String s = "hello";后相关字符串对象s的函数

s.length()获得字符串长度(别少了括号会报错)

s.indexOf(a)获得字符串a在s的索引,如果a是s的子字符串(s包含a,a可以是一个或多个连续的字符串也可以是字符常量或者满足字符范围的ascii码值的int数)j就返回对应的索引(有重复子串返回第一个),从开头0数起,如果不在,返回-1,注意函数是驼峰命名,O大写,函数还可以输入字符(或字符对应得整数),查找对应字符的索引

s.lastIndexOf(a)同上,但是重复子串的时候获取的是最后一个

s.charAt(i)获取s字符串i索引位置的内容,超出范围会报错(0到length()-1)

下例实现逐个字符输出b

String b = "abcdefghi";

for(int i=0;i<b.length();i++){

System.out.println(b.charAt(i));

}

s.substring(startindex)获得字符串从索引到结束的字符串内容(超边界会报错)(还有注意函数不符合驼峰规则,没有大写)

s.substring(startindex,endindex)字符串从startindex到endindex(右侧不包括)之间的内容(类似python切片)

s.startsWith(a)判断字符串s是否以a(a只能使用字符串,不能使用字符和int)开头,条件满足返回true否则false,注意拼写有字母s,如果判断是以空字符串开头也返回true

s.endsWith(a)判断字符串是否以a结尾,要求和前者一样

将判断字符串相等之前先讲一下字符串存储,我们如下定义字符串

String str = "www.sikiedu.com";

String str2 = "www.sikiedu.com";

String str3 = new String( "www.sikiedu.com");

三种方式创建了字符串,他们print结果都是一样的,但是存储方式有区别,内存中,变量名存储于栈,引用类等存储于堆,常量存储于方法区的运行常量区内,我们str定义在栈中,同时常量区就有了字符串内容的,其地址是089,栈内str地址存放的内容就是089(字符串地址),同理str2创建,但是因为常量已经存在,不重复创建常量,只是将st2的地址存放内容变成089,而str3是通过引用对象生成,需要在堆区开辟一个空间,str3的地址就指向了堆区的地址,而堆区进一步指向常量区的常量。如下图

插图1

我们使用==判断字符串时,是判断其引用内容是否相等,如str==str2是看栈区的存放地址是否相等,因此str==str2为true,str==str3为false

s.equals(a)判断字符串a和s的内容是否相等,这里判断的是最终引用常量,上面的str.equals(str3)就可以返回true了,注意拼写不要少了s

s.equalsIgnoreCase(a)比较s和a的字符串内容,无视大小写,返回true,false

s.compareTo(a)比较字符串s和a的每个字符,相等判断下一个,如不等,返回ascii码差值不计算其他位,全部相等返回0,如果长度不等(即出现要和空字符比较),则返回长度的差值

s.contains(a)字符串s是否包含子串,是否返回true,false,拼写有s

s.isEmpty()判断字符串s是否为空字符串,返回true,false

如果定义String s = null;后尝试调用isEmpty()就会报错,我们定义类型变量如果开始不知道明确的值,可以先赋值null,但是null对象是没有isEmpty()方法的

s.toLowerCase()返回s字符串的字母全部转化为小写字母的字符串,s本身不变

s.toUpperCase()返回s字符串的字母全部转化为大写字母的字符串,s本身不变

s.split(a)以a字符串作为分隔,返回的是字符串数组

代码如下图,中间使用了String []数组strs接收结果,数组我们后边学,这里先混个脸熟,这里还有选择点作为分隔,使用字符串是\\.因为.是关键符号,java中使用\.存储,而字符串中\也是特殊符号,所以使用\\.,最后使用了for()遍历数组strs,这里学习下

特殊情况,当分隔符位于字符串左边界时,字符串数组第一个元素为空字符串,而边界位于右边时,没有空字符串

插图2

s.split(String a,int limit)s字符串以a字符串分割,limit是分割最大次数限制,即从左侧开始分割,达到次数上限时,把最后一个分割连同字符串剩下的所有内容一起送给数组最后一个元素,下图运行分别输出a和b.c.d

插图3

s.trim()函数返回s字符串首尾的多个空格删除(类比于python的strip)的字符串,不影响原来的字符串

s.replace(old,new)返回一个新字符串,其把原来每个old内容替换成new,其中old,new内容必须一致,可以都是字符串,也可以都是字符,但不能一个是字符一个是字符串

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容