java的String类详解

java中使用了面向对象的思想,把字符串封装到java.lang包下的String类中,供我们使用和操作。

一,String类的创建和初始化。

1,使用字符串常量初始化:
String s="abc";
以这种方式初始化的字符串,“abc”是保存在一个字符串缓冲区当中的,也就是堆内存当中。
在这里要将两个小插曲:一个就是字符串对象一旦被初始化就不会被改变。

String s="qwe";
s="nbx";
System.out.println("s="+s);

这里的打印结果显然是nbx;其实在这,是两个字符串对象(“qwe”和“nbx”),s只是引用型变量,实际在内存当中的字符串对象是没有改变的。
在这里插入图片描述
还有一个注意的地方,先看例子吧:

  String s="abc"
  String s1="abc";
  System.out.println(s==s1)

这里对s和s1进行的比较,显然是对地址的比较,你会神奇 的发现,这个例子的运行结果竟然是true,我们会发现这两个变量所指的地址值是相同的,这是为什么呢?
首先,在字符串建立的时候,在内存中有一个字符串缓冲区,当字符串进入的时候,先寻找,看是否有该字符串(abc),没有就存入,然后到第二句代码,进入到缓冲区中,查找到已有abc,所以就把已有的abc的地址值赋给了s1,所以就导致了s和s1的地址值相同。

2,使用String类中的构造方法初始化。

String s1=new String("abc");

这种的初始化,实际上是创建了两个对象,一个new和一个字符串对象在堆内存中。

  String s="abc"
  String s1=new String("abc")
  System.out.println(s==s1)

所以,当我们再次使用这个方法来比较两个地址值是否相同时,就是发现是false。s是创建在一个字符缓冲区当中的,而s1是创建在对象中的,就会导致两个地址不相同。
再提一点,当然这两个内容是相同的,我们可以使用String类中的equals()方法来验证。

二,String类的功能分类。

这里只列举一些常用的方法,更多的请大家查看API文档,进行更多的学习。

1.获取

获取字符串中字符的个数

int length();

根据位置获取字符

char charAt(int index);

根据字符获取在字符串中的第一次出现的位置

int indexOf(int ch);
int indexOf(int ch,int fromIndex);//从指定位置进行ch的查找第一次出现的位置

根据字符获取在字符串中的最后一次出现的位置

int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);//从指定位置进行ch的查找最后一次出现的位置

获取字符串中一部分字符串

String substring(int beginIndex,int endIndex);//包括起始索引,但是不包含结束索引(左闭右开)
String substring(int beginIndex);
2.转换

将字符串变成字符串数组

String[] split(String regex)

String s="小强,小王,小李";
String[] arr=s.split(",");
for(int i=0;i<arr.length;i++ {
         System.out.println(arr[i]);
}

将字符串变成字符数组。

char[] toCharArray();

将字符串变成字节数组。

byte[] getBytes();

将字符串中的字母转成大小写。

String toUpperCase();//大写
String toLowerCase();//小写

将字符串中的内容进行替换。

String replace(char oldChar,char newChar);
String replace(String s1,String s2);

将字符串两端的空格去除。

String trim();

将字符串进行连接。

String concat(string);
3.判断

两个字符串内容是否相同?

boolean equals(Object obj);
boolean equalsIgnoreCase(String str);//忽略大写比较字符串内容

字符串是否包含指定字符串?

boolean contains(String str);

字符串是否以指定字符开头,是否以指定字符结尾。

startWith(String str);
endsWith(String str);
4.比较
compareTo(String str);

通过对这些方法的了解,我们就可以对字符串的操作游刃有余了。

小结:

将字符串转换为字符数组用toCharArray。
将字符数组转换为字符串用字符串构造函数。

三,练习

接下来就练习2个小题目,让我们更熟悉String类中的这些方法。
1:给定一个字符串数组,按照字典顺序进行从小到大排序。
{“man”,“abc”,“cba”,“xx”,“zz”,“xixi”}。
分析:

  1. 对于排序,有很多种排序算法,诸如选择排序,冒泡排序,这里我们就使用冒泡排序。
  2. 但是,之前排序的是整数,现在要对字符串进行排序,怎么办呢?不用担心,我们可以使用字符串中对象比较的功能。
public static void main(String[] args) {

		 String[] arr={"man","abc","cba","xx","zz","xixi"};
		 sortString(arr);
		 printArray(arr);
	}

  public static void sortString(String[] arr) {

		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j < arr.length; j++) {

				if(arr[i].compareTo(arr[j])>0)//字符串比较用compareTo方法
					swap(arr,i,j);
			}
		}
	}
	public static void swap(String[] arr, int i, int j) {
		String temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

2,一个子串在整串中出现的次数。“nbaernbatynbauinbaopnba”

public static void main(String[] args) {

		String str = "nbaernbatnbaynbauinbaopnba";
		String key = "nba";
		
		int count = getKeyStringCount(str,key);
		System.out.println("count="+count);
				
	}
	
public static int getKeyStringCount(String str, String key) {
		
		//定义计数器。 
		int count = 0;
		//定义变量记录key出现的位置。
		int index = 0;
		
		while((index = str.indexOf(key))!=-1){
			str = str.substring(index+key.length());
			count++;
		}
		return count;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值