常见的String定义形式
public class Demo1 {
public static void main(String[] args) {
String a=new String("1231");
String b="123123";
char[] array={'z','x','c'};
String c=new String(array);
}
}
String中存在Hash和value两个值,Hash的值一般默认为0,value的值一般存放地址的作用。
Length
String str1="";
System.out.println(str1.isEmpty());
String str2=null;
System.out.println(str2.isEmpty());
用到null的时候会出现空指针异常的情况。所以String中为空和空指针是两种不同的形式。
String类型的比较
String a="123123";
String b="123123";
System.out.println(a==b);
System.out.println(a.equals(b));
String s1 = new String( "hello");
String s2 = new String( "hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));//被String重写了
要用equals方法来进行一一判断。
为什么上面的运行结果都为True
因为他们是直接赋值在堆中公用同一个地址。
而new String中创造两个不同的地址,导致他们在比对的时候会出现false和true两种不同的方法。
Compare方法
public static void main(String[] args) {
String a="223123";
String b="123123";
System.out.println(a.compareTo(b));
}
比较大小的时候
对应最小字符串中的字符进行比较
1.对应字符不一样 就看对应字符的ASCII码值。
2.当前面相同时,看对应字符长度不一样,长则大
保证它们是同一类。
返回值是ACSSLL码的差值。
IoIgonreCase方法
基于compare和equals方法用
System.out.println(a.equals(b));
System.out.println(a.equalsIgnoreCase(b));
System.out.println(a.compareTo(b));
System.out.println(a.compareToIgnoreCase(b));
字符串的查找
返回对应下标的字符。
public static void main(String[] args) {
String a="223123";
char ch=a.charAt(1);
System.out.println(ch);
}
返回对应字符出现的下标位置
public static void main(String[] args) {
String a="223123";
char ch=a.charAt(1);
System.out.println(ch);
int index=a.indexOf('1');
System.out.println(index);
}
从指定位置开始找某个字符出现的位置。
int index1=a.indexOf('1',3);
System.out.println(index1);
从后面往前面找这个字符
public static void main(String[] args) {
String a="223123";
System.out.println(a.lastIndexOf('3'));
}
从那个位置开始找哪个字符
public static void main(String[] args) {
String a="223123";
System.out.println(a.lastIndexOf('3',3));
}
转换大小写
public static void main(String[] args) {
String a="sadA";
System.out.println(a.toLowerCase());
System.out.println(a.toUpperCase());
}
转换为大小写,字符串改变后,都产生了字符串的转变。
字符串的转换
可以用valueof方法
public static void main(String[] args) {
//整数转换为字符串
String str=String.valueOf(123);
System.out.println(str);
}
包装类:类中有更多的方法 以便使用
字符串转换数组
public static void main(String[] args) {
String str="hello";
char[]chars=str.toCharArray();
for(char ch:chars){
System.out.println(ch);
}
}
字符串的替换
public static void main(String[] args) {
String a="sadA";
System.out.println(a.replace('a','c'));
}
replaceFirst()直替换第一个。
字符串的拆分
用spilt函数
public static void main(String[] args) {
String a="sadA&sadsa";
String[]ret=a.split("&");
for (int i=0;i<ret.length;i++)
System.out.println(ret[i]);
}
字符”|","*"+"世都得加上转义字符,前面加上"\\"
public static void main(String[] args) {
String str = "name=zhagnsan&age=10";//实现多次分割
String[] ret = str.split( "&");
for(String x : ret) {
System.out.println(x);
String[] s = x.split( "=");
for(String ss : s) {
System.out.println(s);
}
}
字符串的截取
public static void main(String[] args) {
String str="aasdasds";
String ret=str.substring(1,3);
System.out.println(ret);
}
省略左右空格
public static void main(String[] args) {
String str = " aa sdasds";
System.out.print(str.trim());
}
字符串连接
public static void main(String[] args) {
String a="asasd";
for (int i=0;i<1000;i++) {
a = a + "asd";
}
StringBuffer str=new StringBuffer("asasd");
for (int i=0;i<1000;i++) {
str.append("asd");
}
StringBuilder str2=new StringBuilder("asasd");
for (int i=0;i<1000;i++) {
str2.append("asd");
}
str2.reverse();
}
第一种不建议循环,每次创建对象,时间过长
第三种 sb方式 str2.reverse();调换字符串的前后次序
StringBuffer使用在多线程的情况下,(含有synchronized),在进行append函数时,不会被干扰,
(会过多消耗资源)
StringBuilder使用在单线程的情况下
stringBuilder22 = new StringBuilder(str2);
应用
public class Main {
//回文
public static void main(String[] args) {
char a='3';
System.out.println(Character.isDigit(a));//判断是否是数字
System.out.println(Character.isLetter(a));//判断是否是字母
}
}
public static void main3(String[] args) {
//回文问题
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
boolean b = true;
int left = 0;
int right = str.length() - 1;
while (left < right) {
char leftChar = str.charAt(left);
char rightChar = str.charAt(right);
if (!Character.isLetterOrDigit(leftChar)) {
left++;
} else if (!Character.isLetterOrDigit(rightChar)) {
right--;
} else if (Character.toLowerCase(leftChar) != Character.toLowerCase(rightChar)) {
b = false;
break;
} else {
left++;
right--;
}
}
if (b) {
System.out.println("是回文");
} else {
System.out.println("不是回文");
}
}
public boolean isCharnum(char ch){
if(Character.isDigit(ch)&&Character.isLetter(ch)) {
return true;
}
else {
return false;
}
}
public static void main2(String[] args) {
//打印最后一个数组的长度
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
String [] arr=str.split(" ");
System.out.println(arr[arr.length-1].length());
}
public static void main1(String[] args) {
//找出数组中第一个不重复出现的字符
int[] count = new int[26];
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
for (int i = 0; i < str.length(); i++) {
count[str.charAt(i) - 'a']++;
}
for (int i = 0; i < str.length(); i++) {
if ( count[str.charAt(i) - 'a']==1) {
System.out.println(str.charAt(i));
}
}
}