String字符串

String类

String类有两种赋值方式:一种是直接赋值,语法如下

public class Father {

	public static void main(String[] args) {
		String st = "Java";
		System.out.println(st);
	}

直接赋值会出现常量池数据共享的情况,String st = "java";执行这段程序时,jvm会在常量池中开辟出一段空间来存储java这个字符串对象并在栈中存储变量st并让他指向该对象,若再执行String  str = "java";这段代码时,jvm会先在常量池中搜索是否有”java“字符串对象,如果有则让str也指向java,也就是说st和str的地址是一样的,这就是常量池数据共享,若没有java这段字符串,则在常量池中另开劈一段空间来存储。

另一种是构造方法将其实例化:

public class Father {

	public static void main(String[] args) {
		String st = new String("sada");
		System.out.println(st);
	}
}

 

String st = new String("sada");在执行这段代码时,其实分为两步,第一步时在常量池中找到或创建出“sada”对象,第二步是使用new关键字在堆内存中创建出一个对象并让st指向该堆内存的地址,该new出的堆内存就是在常量池中找到或创建出的“sada”对象,也就是说执行这段代码时创建了两个对象,一个在常量池中,一个在堆内存中。

String常用方法

length() 该方法返回字符串的长度。

public class Test extends Son {

	public static void main(String[] args) {
		String str = "abc";
		int a = str.length();
		System.out.println(a);
	}
}

startsWith(String value) 判断字符串是否以value字符串开头,如果是返回true,否则返回false。

public class Test extends Son {

	public static void main(String[] args) {
		String str = "javadoc";
		String str1 = "ja";
		System.out.println(str.startsWith(str1));
	}
}

endsWith(String value) 判断字符串是否以value字符串结尾,如果是返回true,否则返回false。

public class Test extends Son {

	public static void main(String[] args) {
		String str = "javadoc";
		String str1 = "oc";
		System.out.println(str.endsWith(str1));
	}
}

equals(String targetString) 用于判断两个字符串是否相同,完全相同返回true,否则返回false。

public class Test extends Son {

	public static void main(String[] args) {
		String str1 = "java";
		String str2 = "Java";
		String str3 = "javaa";
		System.out.println(str1.equals(str2));
		System.out.println(str1.equals(str3));
	}
}

String 类equals方法和==区别:

String类中的equals方法用于判断两个字符串是否相同:

 

public class Test extends Son {

	public static void main(String[] args) {
		String str1 = "java";
		String str2 = "Java";
		String str3 = "javaa";
		System.out.println(str1.equals(str2));
		System.out.println(str1.equals(str3));
	}
}

如果所比较的两个变量是引用类型,则==用于比对两个变量指向的是否为同一个存放数据的地址;如果是基本数据类型的两个变量进行比较,则比较的是值是否相等。

equalsIgnoreCase (String value) 用于判断两个字符串忽略大小写后是否相同,相同返回true,否则返回false: 

public class Test extends Son {

	public static void main(String[] args) {
		String str1 = "java";
		String str2 = "Java";
		String str3 = "javaa";
		System.out.println(str1.equals(str2));
		System.out.println(str1.equalsIgnoreCase(str2));
	}
}

toCharArray() 将字符串转换为char类型的数组:

public class Test extends Son {

	public static void main(String[] args) {
		String str1 = "ABCDEFG";
		char [] arr = str1.toCharArray();
		for (char c : arr) {
			System.out.println(c);
		}
	}
}

还有一些。。。

程序分析:

public class Test {
	
	public static void main(String[] args) {
		String name = "Tim";
		test(name);
		System.out.println(name);// String是引用类型,但为什么不是Lucy
	}

	public static void test(String str) {
		str = "Lucy";
	}
}

由于str是引用类型变量,传参时是将str的首地址传给str,但在执行str = "Lucy";这段代码时,会重新创建一个对象,对重新进创建的对象赋值,自然是对main方法的name无影响。

另外:String,Integer, Double等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待。可以认为是传值。

Java API文档

JAVA API文档提供了很多官方的介绍和类、方法、变量的解释。一般很系统,涉及所有的方面,如果开发人员对正在使用的类不熟悉,想查看类里面的变量或者方法,就可以打开JavaAPI文档进行阅读和查看。

StringBuffer类

先读一下下面类:

public class Test {
	
	public static void main(String[] args) {
		String a = "nan";
		a = a + "sda";
		System.out.println(a);
	}
}

可以看粗来,这样向a中添加字符串会新创建一个对象,占用内存,按此方法添加的话,内存往往会占用很多,但StringBuffer类会在添加字符串时不新创建对象。

StringBuffer类可以存放字符串,和String类不同的是,StringBuffer字符串代表的是可变的字符序列,可以对字符串对象内容进行修改。

程序判读:

public class Foo {
	public static void main(String[] args) {
		StringBuffer a = new StringBuffer("A");
		StringBuffer b = new StringBuffer("B");
		operate(a, b);
		System.out.println(a + "," + b);//AB,B
	}
	static void operate(StringBuffer x, StringBuffer y) {
		x.append(y);
		y = x;
	}
}

此程序的结果是:AB,B     因为在传入a和b时,和String一样传入的是对象的首地址,x.append(y);  在执行这段代码时,通过append方法给x也就是a添加上b的值,在执行y=x;这段代码时,y = x就是先创建一个新的对象y,再对新对象y附上x的值,并不是对main方法中的y操作。

 

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值