Java day2【第十章】String类特点分析
第十章:String类特点分析:
一.字符串的比较:
范例:进行“==”比较:
public class String Demo{ public static void main(String args[]){ int x = 10; int y = 10; System.out.println(x == y); } }
但是String也有判断相等的问题,可以用"=="但不准确
Eg:
public class Stringdemo{ public static void main(String args[]) { String strA = "mldn"; String strB = new String("mldn"); System.out.println(strA == strB); //返回false } }
使用String类中的public boolean eauqls(Sting str);
范例:
public class Stringdemo{ public static void main(String args[]) { String strA = "mldn"; String strB = new String("mldn"); System.out.println(strA.equals(strB)); //返回true } }
面试题: == 和equals的区别
== :比较对象内存的地址数值是否相等
equals:比较字符串内容是否相等
二.字符串常量
Java中整数默认为int类,小数默认为double类,而任何“”定义的都是String类的匿名对象:
String srt = "mldn";
栈内存 堆内存
str → ”mldn“
所谓的String直接赋值描述的是:将一个匿名对象设置一个具体的引用名字
范例:观察匿名对象的存在:
public class Stringdemo{ public static void main(String args[]) { String strA = "mldn"; System.out.println("mldn".equals(strA)); //返回true } }
没有String常量的基本类型,有的只是String类的匿名对象。
对象相等判断的小技巧:
equals()方法里提供一个可以回避null的判断,所以如果将字符串写在前面,永远不会出现NullpointException的错误
三.String俩种实例化方法的区别:
1.直接赋值:
String strA = "mldn";
栈内存 堆内存
strA → ”mldn“
范例:官产String直接赋值的数据共享:
public class Stringdemo{ public static void main(String args[]) { String strA = "mldn"; String strB = "mldn"; System.out.println(strA == strB); //返回true } }
之所以有这样的 特点,是因为Java的底层JVM里有字符串池,他是一个数组,池中有,则直接指向池中的字符串,没有则新建
2.构造方法:
在字符串池中创建新的:
构造方法创建实例化对象实际上是一个基于一种自己专用的内存空间,但在String提供一种手工入池的方法:
public String intern();
范例:观察手工入池:
public class Stringdemo{ public static void main(String args[]) { String strA = "mldn"; String strB = new String("mldn").intern(); System.out.println(strA == strB); //返回true } }
但这样太啰嗦;
面试题:String类俩种实例化对象的区别:
直接赋值:只会产生一个实例化,并且可以自动保存到对象池中,以实现该字符串的重用。
构造方法:会产生俩个实例化对象,并且不会自动入池,无法实现对象重用,但可以手工入池。
四.String对象(常量)池:
1.静态常量池:指的是程序加载此程序之中保存的字符串,常量,类,方法等等,全部进行内存分配;
2.动态常量池:运行时常量池:程序加载之后,里面有一些变量。
public class Stringdemo{ public static void main(String args[]) { String info = "mldn"; String strA = "www.mldn.cn"; String strB = "www."+info+".cn"; System.out.println(strA == strB); //返回false } }
原因是info在这里是动态的,strB被分配到动态常量池,所以内存地址不同。
五.String修改分析:
字符串不可修改!修改的只是变量名引用的内存空间,所以这种改变将引起大量的垃圾空间,所以开发中String类不要进行频繁的修改,修改次数越多,代码性能越低。
public class Stringdemo{ public static void main(String args[]) { String str = "www."; str += "mldn"; str = str + ".cn"; System.out.println(str); //输出www.mldn.cn } }
六. Java主方法组成分析
public static void main(String args[]) {}
public:访问权限,公开的,主方法是一切的开始点,开始点一定是公共的
static:程序的执行是通过类名称完成的,此方法是由类直接调用的
void:主方法是一切的起点,起点一旦开始就没有返回的可能了
main:是一个系统定义好的方法名称
String agrs[]:字符串的数组,可以实现程序启动参数的接收
范例:输出启动参数
public class Stringdemo{ public static void main(String args[]) { for (String arg:args ){ System.out.println(arg); } } }
文件名 Stringdemo.java
可以看出设置first second 参数,则输出
程序执行时,用空格将参数分开。如果参数本身含有空格,则必须用” “进行包装