Java中String类、字符数组、StringBuffer三者的相互转换(包含检查字符串是否是回文等小算法)

String变量的定义方式

//先定义
		String aString = “this is a aString”;
//输出结果为“this is a aString”
		System.out.println(aString);

字符数组其实就是数组了,只不过存的是字符所以叫字符数组,这不是废话嘛…

		char[] stringArray = {'a','b','c','d','e'};
//可以直接输出,也可以使用循环按个输出
		System.out.println(stringArray);
		for (char c : stringArray) {
			System.out.println(c);
		}

StringBuffer

//StringBuffer,开个玩笑,这样子是不行的
		StringBuffer sBuffer = "a";
//需要new的帮助
//StringBuffer是线程安全的,所以效率比较低,因为多线程是使用的时候需要排队
		StringBuffer stringBuffer = new StringBuffer("i am stringbuffer");
		System.out.println(stringBuffer);

正式开始

1.String和StringArray之间相互转换
1.1String—>StringArray

		String aString = “this is a aString”;
		char[] ch = aString.toCharArray();
//直接输出得到“this is a aString”
		System.out.println(ch);
//循环输出
		for (char c : ch) {
			System.out.println(c);
		}

1.2StringArray—>String

//利用String类的**构造函数**,直接构造String时完成转换
		String bString = new String(stringArray);
//调用String类的**valueOf**函数
		String cString = String.valueOf(stringArray);

2.String和StringBuffer之间相互转换
2.1String—>StringBuffer

//利用构造函数
		StringBuffer bBuffer = new StringBuffer(aString);
//调用append函数
		StringBuffer bBuffer = new StringBuffer();
		cBuffer.append(aString);

2.2StringBuffer—>String

//调用StringBuffer类成员函数toString
		StringBuffer aBuffer = new StringBuffer("i am stringbuffer");
		String dString = aBuffer.toString();
//通过String类中的构造函数,这里和StringArray--->String一样
		String eString = new String(aBuffer);

3.StringArray和StringBuffer之间相互转换
在Java中不支持直接StringBuffer到StringArray之间的互转,所以中间需要String做一个过渡

ps:数遍说一下数组的事情

			String aString1 = "this is a aString";
			char[] ch = aString1.toCharArray();
	//直接输出得到“this is a aString”
			System.out.println(ch);
			byte[] bs = new byte[]{1,2,3,4,5};
	//byte数组输出数组首地址
			System.out.println(bs);

cookies甜点时间String和byte[]字节数组互转
String—>byte[]

		String a = "this is a string";
		byte[] bt = a.getBytes();
		//输出字节数组首地址
		System.out.println(bt);
		//输出的为byte数组数字形成
		for (byte b : bt) {
			System.out.println(b);
		}

byte[]—>String

		//当然不能这么输出了,因为之前说了bt对象保存的是数组的首地址,将首地址tostring也只是首地址的字符串
		String b = bt.toString();
		System.out.println(b);
		//通过b.charAt(2)就可以获得这段字符串中指定的字符
		//那怎么办?还是老样子,通过String的构造函数进行初始化,这样输出的结果就是this is a string
		String c = new String(bt);
		System.out.println(c);

byte[]的范围是-128~127
a是97asicⅡ码
判断一个字符串是否是回文
依稀记得第一次遇到这个问题应该是上大学的时候,机械工业出版社C++的教材里面的一道课后练习题
之前一直想的是按照顺序操作字符串,按照一定的规则比较,但是好像这样有点麻烦,直到遇到了StringBuffer里面的reverse这个方法

	public static boolean Moslems(String string){
		//三行代码就可以搞定了
		StringBuffer sBuffer = new StringBuffer(string);
		String reverseString = new String(sBuffer.reverse());
		if (reverseString.equals(string)) {
			System.out.println("yes");
			return true;
		}
		System.out.println("no");
		return false;
	}

下面重点来了,几个常见的String字符串操作的算法:
1.最长不含重复字符的子字符串
在字符串中找出一个最长的不包含重复字符串的子字符串,计算该最长子字符串的长度
使用LIst

	public static int lengthOfLongestSubstring(String string){
		if (string.length() == 0) {
			return 0;
		}
		int maxLength = 1;
		//定义一个List,字符类型
		//用list保存最长的字串
		List<Character> list = new ArrayList<Character>();
		list.add(string.charAt(0));
		for (int i = 1; i < string.length(); i++) {
			//如果list中包含已经添加到list中的元素,则进入if条件,if语句中是对list进行截取重新定义大小的操作
			if (list.contains(string.charAt(i))) {
				//定义一个index保存与当前字符相同字符的索引
				int index = list.indexOf(string.charAt(i));
				//重新定义一个list,与string = string.substring(begin,end)相同
				list = list.subList(index + 1, list.size());
				
				//截取之后,把下一个字符装到list中
				list.add(string.charAt(i));
				
				maxLength = Math.max(maxLength, list.size());
			}else {
				//如果没有重复的字符就直接加在这个list中
				list.add(string.charAt(i));
				maxLength = Math.max(maxLength, list.size());
			}
			System.out.println("每次循环之后的list为: " + list);
		}
		System.out.println(list);
		System.out.println(list.size());
		return maxLength;
	}

注意这里只能返回该字符串的长度,因为没有保存当前最长的字符串的对象

查找字符串数组中最长都公共前缀

	public static String longestCommonPrefix(String[] strings){
		if (strings == null || strings.length == 0) {
			return "";
		}
		//如果只有一个元素
		if (strings.length == 1) {
			//返回第一个
			return strings[0];
		}
		//假设,先取第一个字符串座位公共前缀
		String prefix = strings[0];
		//从第二个元素开始遍历
		for (int i = 1; i < strings.length; i++) {
			//通过while循环,选出第一个与遍历的每个N字符串的公共部分
			//如果这个元素前缀不是prefix,下面的判断是strings[i]中不包含prefix
			while (strings[i].indexOf(prefix) != 0) {
				//删除最末尾的字符串,通过substring函数
				prefix = prefix.substring(0, prefix.length() - 1);
				//在整个while循环中,prefix已经被缩短为空了,就跳出查找
				if (prefix.isEmpty()) {
					return "";
				}
			}
		}
		return prefix;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值