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 list = new ArrayList();
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;
}