声明定义一个String对象:
String mString="你好,世界!";
C语言说明:
java中,不再有指针的概念,却有指针的身影,因为java中有一个概念叫做“引用”
,(但是请注意,普通数据类型创建的变量不是引用类型),C++也有。这个“引用”
实际就是宏观上的指针!所以这里的对象“mString”
你可以看成一个指针变量
(如果你有C基础的话),然后上面的赋值语句,就是把字符串“你好,世界!”的首地址
赋值给了指针变量"mString"
.
控制台输入字符串:
Scanner
mScanner
= new Scanner(System.in);
String a=mScanner
.next()或者mScanner
.nextLine()
使用指南:注意,
next()和nextLine()
方法都是返回字符串,都是用来读取字符串的,
第一个方法表示你输入空格符或者回车(换行符)都能停止输入,
但第二个必须输入回车(换行符)才停止。但是注意区别:“停止输入”和“函数执行停止”是两个完全不同的概念!有些小伙伴在使用next()时,输入键盘上的空格按键,发现根本就不会跳过next()这条语句而去执行下一条语句,这是因为next()还没结束,只是不再接收你的输入了而已,仍然需要你按下回车键让next()函数结束呢!简而言之,就是人家还活着,只是跟你断绝了联系。
下面几个才是读取数值型数据:
nextInt()
:将读取的字符串转化为int型
nextFloat()
:将读取的字符串转化为float型
nextDouble()
:…等
上面这些方法又分为两大门派:nextLine()
自成一派,其他(以next()为首
)合成另一派
此处有易错提醒:
千万别在使用next()这一派后使用nextLine()!
否则读取结果可能会有惊喜。
原因:
以next()为首
的那一派输入(请注意:此处所说的输入和读取描述的是同一个动作的两个过程,从键盘输入到控制台,从控制台读取到内存中的变量,姑且认为:读取=输入)的终止标记是【空白符】
——即一个空格字符‘ ’,一个特殊的转义字符\n或\r或\t等。
nextLine()
的一派却只以【换行符】
\n或\r(Linux下只有\n)为终止信号。
所以当你使用next()等以后,按下回车键,这个回车键就会停留在缓存中,并且可以被下一个nextLine()读入,这是nextLIne就相当于直接终止,而读不进你后面输入的字符串了。这时候你可能会有一个疑问:为什么在nextLine()后面使用next()就没事了呢,nextLine()使用时留下的换行符不也会影响到next()的输入吗?在此不做解释,你就当作这是nextLine()的一个特性,比较人家自成一派很不容易,就给人家一点特权吧!
就比如下面这个例子,输入“你好”,然后回车,就直接跳过nextLine()这条语句从而执行最下面的打印语句了。
如果你只需要读取一个字符,可以先用next()等方法先读取字符串,再用下面我即将讲的charAt(0)方法获取第一个字符。
求长度:
String对象.
length()
求某个字符:
String对象.
charAt(下标)
后面连接另一个字符串:
String对象.
concat(另一个字符串)
全部大/小写:
String对象.
toUpperCase()
String对象.toLowerCase()
去掉两边看不到的字符
String对象.
trim()
如:特殊的转义字符\n,\t,\f等,和长度为一个字符的空格’ ',如果他们在整个字符串的两边,将会被去掉。
比较字符串的内容是否(true/fault)相等同:
String对象.
equals(需要比较的另一个字符串)
String对象.equalsIgnoreCase(需要比较的另一个字符串)
:忽略大小写这里可能会有同学问:直接用对象str1==对象str2去判断不就行了吗。不行!前面我们讲了这个的String对象是引用类型,也就是相当于
指针
,指针形象化就是地址,所以你这个语句只能判断这两个指针指向的是不是同一个地址,假设两个地址都装了同一样的东西,你就判断不出来了吧。而这里的equals就是帮你解决这种问题的!
更精确的比较比较字符串的内容相等情况:
String对象.
compareTo(需要比较的另一个字符串)
String对象.compareToIgnoreCase(需要比较的另一个字符串)
:不区分大小写
前>后:返回大于0的整数
前==后:返回0
前<后:返回小于0的数
检查字符串是否以某个字符(串)开始/结束:
String对象.
startsWith(某个前缀字符串)
String对象.endsWith(某个后缀)
检查字符串之间是否有包含关系(子集)
String对象.
contains(子集)
:该“子集”确实是子集,返回true
获取字符串的子串(子集):
String对象.
substring(开始截取的下标)
:结束默认为字符串末尾
String对象.substring(开始截取的下标,结束截取的下标+1)
:更精确截取这里可能又有人迷惑和易错了,为什么不直接是“结束截取的下标”,而偏偏要加1,这你就需要问该函数的开发者,你可以这样理解:一般你写for循环遍历数组的时候,是不是曾经这样写过:
for(int i=0;i<10;i++)
,代码中出现了“10”这个数字,但是数组的下标最高只能到达9。所以你懂我意思吧,10只是字符串(即数组)的长度,而不是下标的最大值。
返回某个字符(串)第一次出现的下标:
如果没有匹配的,返回-1
String对象.
indexOf(某个字符/字符串)
:默认从0——>数组长度-1
String对象.indexOf(某个字符/字符串,从哪个下标往后)
:从指定下标——>数组长度-1
返回某个字符(串)最后一次出现的下标:
如果没有匹配的,返回-1
String对象.
lastIndexOf(某个字符/字符串)
:默认从0——>数组长度-1
String对象.lastIndexOf(某个字符/字符串,从哪个下标往后)
:从指定下标——>数组长度-1
以某个字符(串)分割字符串:
注意它的返回值,它的返回值是一个字符串数组,而不是一个字符串。这很好理解啊,你拿刀切一根香肠,最后肯定变成很多根香肠啦!
它的另一个重载函数就不讲理,因为(我)不常用。
另外还有一小部分,相信学完前面以后,你均可以见名知意。
数值——>字符串:加双引号即可!
int number=123456;
String strNumber=number+"";
当然,可能还可以使用object类的toString()方法。
字符串——>数值:
String strNumber=123456;
int number=Integer.parseInt(strNumber);
注意:这里不再是使用String的实例方法,而是使用Integer的静态方法。其实,解析(parse)这个词用得比较专业,所以可能很多人没看懂这个方法名所表达的意思,就是把字符串解析,解析的结果是整型。
类似的,double number=Double.parseDouble(strNumber);
float number=Float.parseFloat();
注意:这里的字符串必须是0-9的字符(可以包含正负号,小数点)的数值型字符串,否则虽然可以编译运行成功,但是执行到这个解析的语句时,就会报异常。