String类被称为不可变字符串类型,它的对象在创建后不能被修改
可以图中得知输出结果为 传智教育中心,好似和前面所提的不能修改不符,下面将叙述原因。
首先要明确 " " 符号给出的字符串,都存储在字符串常量池中,字符串常量池在堆内存中。
从上图我们可以得知“传智”,“教育”,“中心”三个字符串都在字符串常量池中,但是“传智教育中心”,就不在字符串常量池中因为,“传智教育中心”并不是以“ ”的方式创造的。
name的值是由栈内存中的main方法中的地址确定的,我们对于name的修改只能修改它所指向的字符串的地址值,实际上并不能将String定义的值改变,只能重新开辟一个新的空间并指向这个字符串。
以""方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会存储一份。(这样设计的目的是节省内存)以构造器new对象,每new一个都会产生一个新的对象,放在堆内存中,并且不放在字符串常量池中。
通过""定义字符串常量内存原理
从上图可以得知在s1和s2进行比较时比较的是两个字符串的地址,而不是"abc"值。
上图我们可看到由于new构造器所产生的“abc”并不存在于字符串常量池中,所以构造的两个“abc”
并不是同一个,所以s1和s2存储的地址并不一样。
String类常见面试题
String常用API
这段代码模拟用户登录,但是在判断用户登录名和密码是否正确时,即使输入了正确的用户名和密码,也会显示错误,原因在==运算符上,因为okName==name;实际比较的是两边的地址,所以显示用户名或者密码错误。为了解决这个问题我们可以使用equals方法。
使用equals方法,就可以正常的运行。
在验证码的判断上我们可以应用 equalsIgnoreCase方法,这样在输入时可以随意输入大小写都可以成功判断。
package com.String; public class StringAPI { public static void main(String[] args) { //1.获得字符串长度public int length() String name ="helloworld"; System.out.println(name.length()); //2.获取某个索引位置处的字符public char charAt(int index) System.out.println(name.charAt(1)); //2.1遍历每个字符串的每个字符 for (int i = 0; i欢迎分享,转载请注明来源:内存溢出
评论列表(0条)