黑马程序员---java学习笔记之字符串

1、字符串最大的特点是:一旦被初始化,字符串就不可被改变。

public class StringDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		/*
		 * 下述第一句代码,在内存中只会产生一个对象实体
		 * 第二句代码,在内存中会产生两个实体,一个是字符串常量,存放在方法区的常量池中。另一个是对象实体,存放在堆中。
		 * */
		
		String s1 = "abc";
		String s2 = new String("abc");
		
		/*
		 * 因为s1和s2分别指向不同的对象实体,指代的地址不同。
		 * */
		System.out.println(s1 == s2);//打印结果为false
		
		/*
		 * String类重写了Object类中equals方法,用来比较两字符串对象是否具有相同的字符串序列
		 * */
		
		
		System.out.println(s1.equals(s2));//打印结果为true
		

	}

}
2、下面是一段示例代码

public class StringDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String s1 = "abc";
		String s2 = new String("abc");
		String s3 = "abc";
		
		System.out.println(s1 == s2);//打印结果为false
		/*
		 * 为什么下述代码的打印结果是true,s1和s3不是分别指向两个对象吗?
		 * 首先说一下字符串常量池,该常量池位于方法区中,常量池可以理解成字符数组,
		 * 使用s3指向一字符串常量"abc"时,发现常量池中已经存在一个"abc"时,就不会再在常量池中创建一个"abc",而是使两个引用s1和s3
                 * 指向常量池中的同一地址
		 * */
		System.out.println(s1 == s3);//打印结果为true
		

	}

}
3、String类方法中的startswith(...)、endswith(...)和contains(...)方法的一个实用场景就是判断文件名字符串。

4、String类中的int index(String str)方法一方面可以判断某字符串是否在该字符串中(这是contains的功能),还能返回第一次出现该字符串的字符串位置。

String s = "hello java";
		
		String s1 = s.replace('a','n');
		String s1_1 = s.replace('q','n');
		
		System.out.println(s);//打印结果是:hello java
		System.out.println(s1);//打印结果是:hello jnvn
		System.out.println(s1_1);//打印结果是:hello java(当替换的旧字符不在原字符串中时)
		
		String s2_1 = s.replace("java","world");
		String s2_2 = s.replace("jave","world");
		
		System.out.println(s);//打印结果是:hello java
		System.out.println(s2_1);//打印结果是:hello world
		System.out.println(s2_2);//打印结果是:hello java(当替换的旧字符串不在原字符串中时)
5、根据视频中的讲解,我自己想到了一个新的例子:

String s1 = "zhangsan,lisi,,wangwu";
		String[] arr = s1.split(",");
		for( int i = 0; i < arr.length; i++ )
			System.out.println(arr[i]);
运行结果是:

zhangsan
lisi

wangwu

6、String类中几个之前不怎么了解的函数:

        trim():去除字符串两端的空格;*****

        compareTo():按字典序返回两字符串的差值;

        toUpperCase/toLowerCase:字符串转换成大写或者小写;

7、模仿trim函数

public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String str = "   hello world";
		
		int i = 0;
		
		while( str.charAt(i) == ' ' )
			i++;
		int j = str.length() - 1;
		while( str.charAt(j) == ' ' )
			j--;
		String str1 = str.substring(i, j+1);
		System.out.println(str1);

	}
8、在实际编程中,我发现这样是可以的。

String str = "abc";
		str.substring(3,3);
我们知道,字符串"abc"的最大下标值是2,而在subString(...,...)函数中,第一个参数的值居然可以是最大下标值加1。
9、字符串反转

String str = "abcd123";
		int len = str.length();
		char[] chs = new char[len];
		
		for( int i = 0; i < len; i++ )
			chs[i] = str.charAt(len-1-i);
		String str1 = new String(chs);
		System.out.println(str1);

10、查看某字符串中有另一字符串的次数:

public static int subStringCnt(String dadString,String sonString)
	{
		int cnt = 0;
		int index;
		String strTemp = new String(dadString);

		while( (index = strTemp.indexOf(sonString)) != -1)
		{
			cnt++;
			strTemp = strTemp.substring(index+sonString.length(),strTemp.length());
		}
		
		return cnt;
	}
11、求两字符串最大相同子串的非常经典的java代码:

public static String getMaxSubstring(String str1, String str2)
	{
		String max = "", min = "";
		max = (str1.length() > str2.length())?str1:str2;
		min = (str1.length() < str2.length())?str1:str2;
		
		for( int i = 0; i < min.length(); i++ )
			for( int j = 0, k = min.length()-i; k != min.length()+1; j++,k++ )
			{
				String strTemp = min.substring(j,k);
				if( max.contains(strTemp) )
					return strTemp;
			}
		return "";
	}
12、字符串String和字符串缓冲区StringBuffer的区别是:

        a):首先字符串的里面的内容是不可变的,意思就是当你调用String类中的方法对字符串本身进行操作时,比如replace操作,字符串本身并不发生变化,而是新开辟内存空间用来存储操作后的内容示例如下:

String s1 = "hello java";
		String s2 = s1.replace('a','n');
		
		System.out.println(s1);//打印结果是:hello java
		System.out.println(s2);//打印结果是:hello jnvn
		System.out.println(s1 == s2);//打印结果是:false
这说明,调用String类的方法,对字符串操作并不改变源字符串的内容,而是新开辟了一个空间用来存储操作后的内容;

        字符串缓冲区StringBuffer就不是这样了,它长度也可变。

StringBuffer s1 = new StringBuffer("hello java");
		StringBuffer s2 = s1.append(" !!! ");
		
		System.out.println(s1);//打印结果是hello java !!! 
		System.out.println(s2);//打印结果是:hello java !!! 
		System.out.println(s1 == s2);//打印结果是:true
这说明字符串缓冲区类中的方法是对原StringBuffer对象实体进行地操作。

13、字符串缓冲区的特点:

        a):长度和内容可变;

        b):可以操作多种数据;

        c):最终要通过toString方法转换成字符串。

14、注意一下,StringBuffer类中的substring方法返回的是String而不是StringBuffer。

15、StringBuffer线程同步,StringBuider线程不同步。

16、java升级是为了改善这三方面的因素:

        a):提高安全性;

        b):提高效率;

        c):简化书写;

17、基本数据类型包装类:

18、

Integer x = 4;//自动装箱,自动调用new Integer(int ...)的方法
		x = x + 3;//自动拆箱,先将右方x的值使用intValue()方法拿出来进行运算后,再装箱。
Integer x = 128;
		Integer x1 = 128;
		System.out.println(x == x1);//打印结果是:false
		
		Integer y = 127;
		Integer y1 = 127;
		System.out.println(y == y1);//打印结果是:true

第二段代码很奇特:同样都是数进行同样的操作,但是打印结果却不同!对于新特性,如果数值存在于byte范围内,且同样的对象已经存在,java就不会再为它开辟内存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值