黑马程序员---java基础---3String类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

一、定义:

1、从概念上讲,java字符串就是Unicode字符序列。每个用双引号括起来的字符串都是String类的一个实例。Java字符串由char序列组成,字符数据类型是一个采用UTF-16的编码表示Unicode代码点的代码单元。(大多数的常用Unicode字符使用一个代码单元就可以表示,而付诸字符需要一对代码单元表示。具体内容,请自行查阅相关资料或者百度,本人不在此赘述了。)

2、格式:

1 String a = ”abc”;//存储在StringPool中

2 String b = new String(”abc”)://存储在堆内存中

复制代码

3、StringPool(字符串池):有一个存放字符串的公共存储池,称为StringPool,即字符串池。字符变量指向存储池中的相应位置。如果是通过复制一个字符串变量,原始的字符串和复制的字符串将共享这个相同的字符串。

二、特点:

1、String是一种特殊的数据类型,可创建对象。

2、通过String创建的对象分别可存在于字符串池(StringPool)和堆内存中

3、String是一个final的类型,即不可被继承修改,一经生成不可改变。

4、StringPool中的数据可共享,即两个引用变量可指向同一个字符串池中的字符串

5、Java中的任何对象都可写成字符串的形式。

字符串不可变的原因:

a. 可以想得出,每种固定的东西是不会改变的,1就是1,也就是说你若想改变,只得改变这个引用变量所指向的地址。

b. 编译器可以让字符串共享数据。所以不必改变字符串,直接改变变量即可。

c. java的开发者认为共享数据的效率要远远胜于提取、拼接字符串的效率。程序中对字符串的修改操作很少,更多的是对字符串进行比较

(例外:将源自于文件或键盘的单个字符或较短的字符串汇集成字符串。具体在下面会说到。)
字符串
(1)有多个字符组成的一串数据。
(2)字符串的构造方法:
A:String()
初始化一个新创建的 String 对象,使其表示一个空字符序列
s1="abc"

B:String(byte[] bys)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
byte[]bys={97,98,98}
String s2=new string(bys)

C:String(byte[] bys,int start,int count)
定义一个byte数组从指定位置开始,到指定位置结束
byte[]bys={97,98,98}
String s3=new String(bys,1,2)

D:String(char[] chs)
定义一个字符数组
char[]chs={'a','b','c','d','e','爱','你'}
String s4=new String (chs)

E:String(char[] chs,int start,int count)
定义一个char数组从指定位置开始,到指定位置结束
char[]chs={'a','b','c','d','e','爱','你'}
String s5=new String (chs,2,5)

F:String(String s)
初始化一个新创建的 String 对象,
String s6=new String("abcde")

G:String s = "hello";
常见的面试题
A:String s = new String("abc")和String s = "abc"的区别?
有,区别是第一种方案,s1是一个对象,abc也是一个对象。
  前者有两个对象,后者只有一个对象。

(5)字符串的功能方法:
A:判断功能
boolean equals(Object obj)
比较两个字符串内容是否一样。

boolean equalsIgnoreCase(String str)
忽略大小写,判断两个字符串内容是否相同

boolean contains(String str)
判断一个字符串是否包含另一个

boolean startsWith(String str)
判断字符串是否以指定字符串开头

boolean endsWith(String str)
判断字符串是否以指定字符串结束。

boolean isEmpty()
当且仅当 length() 为 0 时返回 true

public boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。

B:获取功能
int length()
获取字符长度

char charAt(int index)
获取指定字符索引

int indexOf(int ch)
返回字符在此字符串中第一次出现的位置

int indexOf(String str);
返回此子符串在此字符串中第一次出现的位置。

int indexOf(int ch,int fromIndex)
返回此字符在字符串中从指定位置开始,
第一次出现的位置

int indexOf(String str,int fromIndex)
返回子字符串在此字符串中从指定位置开始,
第一次出现的位置。

String substring(int start)
获取从指定位置到末尾的子串

String substring(int start,int end)
获取从指定位置开始到指定位置结束

C:转换功能
byte[] getBytes()
通过字符串得到字节数组

char[] toCharArray()
通过字符串得到字节数组

static String copyValueOf(char[] chs)
通过字符数组得到字符串

static String valueOf(char[] chs)
通过字符数组得到字符串

static String valueOf(int i)基本类型
通过基本类型得到字符串

String toLowerCase()
把字符串转成小写

String toUpperCase()
把字符串转成大写

String concat(String str)
将参数与原字符串进行连接
D:其他功能
a:替换功能
String replac(char old,char new)
String replac(Stringold, String new)

b:切割功能
String[]split(String regex)

c:去除两端的空格
String trim()

d:按字典顺序比较
int compare To(String str)不忽略大小写
int compare ToIgoecase(String str)忽略大小写
案例:
		A:模拟用户登录
 * 模拟用户登录。你怎么想的你就怎么做。
 * 
 * 分析:
 * 		A:先给定用户和密码。
 * 		B:键盘录入用户名和密码。
 * 		C:判断即可。
 * 			要么成功
 * 			要么失败
 *		D:用循环实现给几次机会。
 */
public class StringTest3 {

	public static void main(String[] args) {
		for (int x = 0; x < 3; x++) {
			// x 0,1,2
			// 键盘录入用户名和密码
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入用户名:");
			String username = sc.nextLine();
			System.out.println("请输入密码:");
			String password = sc.nextLine();

			// 判断即可。
			if (username.equals("admin") && password.equals("admin")) {
				System.out.println("用户登录成功,可以开始玩游戏了");
				palyGame();
				

				break;
			} else {
				// 2,1,0
				if ((2 - x) == 0) {
					System.out.println("账号被锁定,请联系班长");
				} else {
					System.out.println("用户登录失败,你还有" + (2 - x) + "次机会");
				}
			}
		}
	}
	
	public static void palyGame()
	{
		//系统产生一个随机数(1-100之间)。
		int number = (int)(Math.random()*100)+1;

		while(true)
		{
			//键盘录入一个数据。
			Scanner sc = new Scanner(System.in);
			System.out.println("你输入你猜的数据(1-100之间):");
			int guessNumber = sc.nextInt();

			//把录入的数据和随机数进行比较:
			if(guessNumber>number)
			{
				System.out.println("你猜的数据"+guessNumber+"大了");
			}
			else if(guessNumber<number)
			{
				System.out.println("你猜的数据"+guessNumber+"小了");
			}
			else 
			{
				System.out.println("恭喜你,猜中了");
				break;
			}
		}
	}
}

		B:遍历字符串
*
 * 自己想办法遍历字符串,我要获取每一个字符。
 * 举例:hello
 *     结果:h
 *         e
 *         l
 *         l
 *         o
 */
public class StringTest {
	public static void main(String[] args) {
		String s = "hello";
		
		// System.out.println(s.charAt(0));
		// System.out.println(s.charAt(1));
		
		for(int x=0; x<s.length(); x++){
			char ch = s.charAt(x);
			System.out.println(ch);
		}
	}
}

		C:统计字符串中不同类型字符出现的次数
/*
 * 统计一个字符串中,不同类型的字符的个数:不包含其他的字符。
 * 大写字符:
 * 小写字符:
 * 数字字符:
 * 
 * 举例:
 * 		hello12345WORLDhaha678
 * 		大写字符:5
 * 		小写字符:9
 * 		数字字符:8
 * 		
 * 分析:
 * 		A:键盘录入一个字符串。
 * 		B:定义三个统计变量
 * 		C:遍历字符串,获取到每一个字符
 * 		D:判断该字符属于那种类型,然后该类型统计变量++即可。
 */
public class StringTest2 {
	public static void main(String[] args) {
		//键盘录入一个字符串。
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请输入一个字符串:");
		String line = sc.nextLine();
		
		//定义三个统计变量
		int bigCount = 0;
		int smallCount = 0;
		int numberCount = 0;
		
		//遍历字符串,获取到每一个字符
		for(int x=0; x<line.length(); x++){
			char ch = line.charAt(x);
			
			if(ch>='a' && ch<='z'){
				smallCount++;
			}
			else if(ch>='A' && ch<='Z'){
				bigCount++;
			}
			else if(ch>='0' && ch<='9'){
				numberCount++;
			}
		}
		
		//输出结果
		System.out.println("大写:"+bigCount);
		System.out.println("小写:"+smallCount);
		System.out.println("数字:"+numberCount);
	}
}

		D:把字符串的前三个大写,其他小写
* 键盘录入一个字符串(只包含英文字母),把前三个字母转成大写,把其他的都转换小写。
 * 
 * 举例:
 * 		hEllWoRLd
 * 
 * 		结果:
 * 		HELlworld
 * 
 * 分析:
 * 		A:键盘录入一个字符串
 * 		B:截取字符串的前三个字符
 * 		C:截取字符串的其他部分
 * 		D:把B部分转成大写+C部分转成小写
 */
public class StringTest {
	public static void main(String[] args) {
		// 键盘录入一个字符串
		Scanner sc = new Scanner(System.in);

		System.out.println("请输入一个字符串:");
		String line = sc.nextLine();

		// 截取字符串的前三个字符
		/*
		 * String s1 = line.substring(0, 3); //截取字符串的其他部分 String s2 =
		 * line.substring(3); //把s1转成大写+s2转成小写 String s3 =
		 * s1.toUpperCase().concat(s2.toLowerCase()); System.out.println(s3);
		 */

		// String s = line.substring(0, 3).toUpperCase()
		// .concat(line.substring(3).toLowerCase());
		// System.out.println(s);
	}
}

		E:把字符串中字符排序
/* 
 * 对字符串中的字符进行排序:
 * "baskcd" -- "abcdks"
 * 
 * 分析:
 * A:把字符串变成字符数组
 * B:自己写功能实现对数组的排序
 * C:在把数组变成字符串
 */
public class StringTest {
	public static void main(String[] args) {
		String s = "baskcd";

		// 把字符串变成字符数组
		char[] chs = s.toCharArray();

		//自己写功能实现对数组的排序
		sort(chs);
		
		//在把数组变成字符串
		String result = String.valueOf(chs);
		System.out.println(result);
	}
	
	public static void sort(char[] chs){
		for(int x=0; x<chs.length-1; x++)
		{
			for(int y=0; y<chs.length-1-x; y++)
			{
				if(chs[y]>chs[y+1]){
					char temp = chs[y];
					chs[y] = chs[y+1];
					chs[y+1] = temp;
				}
			}
		}
	}
}

		F:统计大串中小串的个数
/*
 * 获取一个字符串中指定子串出的次数。
 * 比如说“hanbasdnbafllgnbahjnbakqqqqlnbaxi” 
 * 在这个字符串中,多有个nba?
 */
public class StringTest2 {
	public static void main(String[] args) {
		String maxString = "hanbasdnbafllgnbahjnbakqqqqlnbaxi";
		String minString = "nba";
		
//		int count = getCount(maxString,minString);
//		System.out.println(count);
		
		int count = getCount2(maxString,minString);
		System.out.println(count);
	}

	public static int getCount(String maxString, String minString) {
		//定义统计变量
		int count = 0;
		
		//首先查一次
		int index = maxString.indexOf(minString);
		
		//判断是否存在
		while(index!=-1){
			count++;
			//截取
			maxString = maxString.substring(index+minString.length());
			//在变化后的大串中查找
			index = maxString.indexOf(minString);
		}
		
		return count;
	}
	
	public static int getCount2(String maxString, String minString) {
		//定义统计变量
		int count = 0;
		
		//首先查一次
		int index = 0;
		
		//判断是否存在
		//查找,赋值,判断三句写成了一句
		while((index = maxString.indexOf(minString))!=-1){
			count++;
			//截取
			maxString = maxString.substring(index+minString.length());
		}
		
		return count;
	}
}


 

 


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值