String类是我们在写代码的时候用到的最多的一种数据类型,那么关于String类有常用方法有哪些呢,又有哪些需要注意的地方的呢?这次我对String类进行了简单的学习。
1、String类常用的两种实例化的方法![]()
J2SE的学习——String类系统性学习
2、用equals比较内容运行结果package page20; //equals比较的是具体的内容 public class Demo2 { public static void main(String[] args) { String name1="张三"; String name2=new String("张三"); String name3=name2;//传递,相当于C语言中的指针 //比较的是引用,作用相当于地址 System.out.println("name1==name2:"+(name1==name2)); System.out.println("name1==name3:"+(name1==name3)); System.out.println("name2==name3:"+(name2==name3)); //比较的是内容 System.out.println("name1==name2:"+(name1.equals(name2))); System.out.println("name1==name3:"+(name1.equals(name3))); System.out.println("name2==name3:"+(name2.equals(name3))); } }
先理解一下堆和栈的![]()
J2SE的学习——String类系统性学习 name的相关视图![]()
J2SE的学习——String类系统性学习 ![]()
J2SE的学习——String类系统性学习 我们从下面把name1,name2,name3塞进去,出口就这一个,因此在数据结构中学的栈和队中,栈是先进后出的,并且系统分配的空间是连续的,而堆中,是在一个大的内存区域,开辟一块小区域,用于存放我们创建的对象,我们的name3是来源于对name2的引用的。
对于引用的理解我比较认同这个人说的,网址,自己点一下
![]()
J2SE的学习——String类系统性学习 通过上面的栈中的name对堆中的指向,可以看到,引用,和C语言中的指针很像,很可惜,java中是没有指针的,但是我们可以看到,name3中的数据,来自name2,因此系统是不会为一个引用分配新的堆存储单元的。
这里有一个常量池的概念,还有关于堆、栈、静态区、常量区、方法区的知识,因为自身能力的问题,没法写,不过这个人写的挺不错的,通俗易懂
Java内存图以及堆、栈、常量区、静态区、方法区的区别
3、String的两种实例化的区别 直接赋值的方式:创建的对象存放到字符串对象池里,加入池子中存在这个对象,就不会再创建新的。 new对象方式:每次都创建一个新的对象,不管是否存在,都会重新创建。运行结果package page20; public class Demo1 { public static void main(String[] args) { //实例化String的方式一 String name1="张三"; String name2="张三";//这里的name2是拿池子里面的 //实例化String的方式二 String name3=new String("张三"); String name4=new String("张三");//name3,name4都是新建的 System.out.println("name1==name2:"+(name1==name2));//括号用于处理优先级问题 System.out.println("name1==name3:"+(name1==name3)); System.out.println("name3==name4:"+(name3==name4)); } }
本质上来说,这里相当于是地址的比较,创建相同的对象,取自一个池子里面的同一个,因此是一样的,这就是栈里面的name1,name2同时指向堆中的一个字符串,这个字符串就在字符串常量池中。![]()
J2SE的学习——String类系统性学习 ![]()
J2SE的学习——String类系统性学习
4、字符串的内容不可变性
字符串的特征:不能改变字符串的内容;
想要改变,只能通过指向一个新的内存内地址;
![]()
J2SE的学习——String类系统性学习 改变了,就是一个新的地址,此时张这个堆内存块就会被垃圾回收了,所以不是在张这个内存中增加个三,而是新建一个内存块,再把老的内存块回收掉!![]()
J2SE的学习——String类系统性学习
5、String类的常用方法和基本使用
老样子,看Jdk文档
简单的两个实例![]()
J2SE的学习——String类系统性学习 ![]()
J2SE的学习——String类系统性学习 ![]()
J2SE的学习——String类系统性学习
6、indexof:返回指定字符在字符串中第一次出现的索引代码:![]()
J2SE的学习——String类系统性学习 运行效果package page20; public class Demo5 { public static void main(String[] args) { String st="xbwudbwcweib";//随便打一个字符串 //这个索引是从零开始的 System.out.println("d这个字符在字符串中第一次出现的位置是:"+st.indexOf('d')); } }
下面看一下这个![]()
J2SE的学习——String类系统性学习 简单的看一下区别吧![]()
J2SE的学习——String类系统性学习 运行结果package page20; public class Demo6 { public static void main(String[] args) { String st="xbwudbwcweib";//随便打一个字符串 //这个索引是从零开始的 System.out.println("b这个字符在字符串中第一次出现的位置是:"+st.indexOf('b')); System.out.println("b这个字符在字符串中第一次出现的位置是,从索引4的位置开始找:"+st.indexOf('b',4)); } }
![]()
J2SE的学习——String类系统性学习 7、substring:返回一个新的字符串,它是此字符串的子字符串
用Ctrl+F能够快速的找到
代码![]()
J2SE的学习——String类系统性学习 结果package page20; public class Demo7 { public static void main(String[] args) { String st="张三很帅!"; System.out.println(st.substring(2)); } }
下面这个是范围内进行输出:![]()
J2SE的学习——String类系统性学习 ![]()
J2SE的学习——String类系统性学习
7、字母转换大小写![]()
J2SE的学习——String类系统性学习 ![]()
J2SE的学习——String类系统性学习 一个是大写转化,一个是小写的转化,简单的写一下:
代码:
结果:package page21; public class Demo4 { public static void main(String[] args) { String st="I love English!"; String upst=st.toUpperCase(); System.out.println(upst); String lowerst=st.toLowerCase(); System.out.println(lowerst); } }
![]()
J2SE的学习——String类系统性学习
其他的可以自己简单的试一下,还蛮好玩的,很多细节的知识点,以后都能用上,特别是在开发时候,能够有效的减少代码的复杂度和代码的执行效率问题。page20、21