您的位置:首页 > 职场人生

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

2014-01-03 13:46 531 查看

---------------------- <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)
定义一个
4000
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>、期待与您交流!
----------------------

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: