hello,大家好,今天为大家带来String类的相关知识
在C语言中,没有字符串类,在Java中有字符串类,举个例子,String ret="hello"; 这就是一个字符串类型的变量,
下面我们来说一下String 类在创建的时候的三种形式
public class Test { public static void main(String[] args) { String string="hello"; String ret=new String("wyb520"); char[] ch={'a','b','c'}; String str=new String(ch); } }
一种是直接写
还有一种是new一个对象
最后一种是通过创建一个数组,然后new一个数组对象
大家看我的这个截图,我们要注意到其实String这个对象在创建一个变量时有value和hash两个内存,我们转到String的源码看一下
从这个源码当中就可以看出来,有hash和value,value是一个引用
一定有同学对String直接new了一个新对象有疑问,其实真正的原因就是String类继承了object类,object类默认是所有类的父类,所以可以直接new实例化对象
现在用图来更好的理解一下String类的对象的创建
string与ret两个变量的创建如上图,比较特殊的是数组那一块,先创建数组然后new String时拷贝了一份数组。
Java当中没有所谓的\0结尾。
String 是引用类型,内部并不存储字符串,其实字符串保存在数组中
String s1 = new String("hello"); String s2 = new String("world"); String s3 = s1; System.out.println(s1.length()); System.out.println(s1.isEmpty());
在计算字符串的长度时一定要.length(),这个括号不能忘
下面继续画图让大家更好的理解这几个对象的创建
🐶String字符串的比较
字符串排序。Java中总共提供了4中方式
1.用==来判断. ==比较是否引用同一个对象
对于基本类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址。
public static void main(String[] args) { int a = 40; int b = 20; int c = 40; System.out.println(a == b); // false System.out.println(a == c); // true }
public static void main(String[] args) { String s1=new String("wyb"); String s2=new String("wyb"); System.out.println(s1==s2);//false }
对于这个引用类型
两个变量的地址不一样。所以答案是false
🐷2.用equals方法比较
public static void main(String[] args) { String s1 = new String("hello"); String s2 = new String("hello"); String s3 = new String("world"); System.out.println(s1 == s2); // false System.out.println(s1.equals(s2));//true System.out.println(s2 == s3); // false System.out.println(s2.equals(s3)); // false }
3.使用compare to
System.out.println(s1.compareTo(s2)); //compaer to 的源码 public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
compare to 返回的是int类型的值,看一下源码大家就能 明白了,长度相等返回0,不等返回两长度差值
🐷4.int compareToIgnoreCase
这个函数与compare to 其实是一样的,就是忽略了大小写
public static void main(String[] args) { String s1 = new String("WYB"); String s2 = new String("wyb"); System.out.println(s1.compareToIgnoreCase(s2));//0 }
String类提供的字符串查找方法
public static void main(String[] args) { String s = "aaabbbcccaaabbbccc"; System.out.println(s.charAt(3)); // 'b' System.out.println(s.indexOf('c')); // 6 System.out.println(s.indexOf('c', 10)); // 15 System.out.println(s.indexOf("bbb")); // 3 System.out.println(s.indexOf("bbb", 10)); // 12 System.out.println(s.lastIndexOf('c')); // 17 System.out.println(s.lastIndexOf('c', 10)); // 8 System.out.println(s.lastIndexOf("bbb")); // 12 System.out.println(s.lastIndexOf("bbb", 10));// 3 }
💚char charAt(int index):返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常
💚int indexOf(int ch) 返回ch第一次出现的位置,没有返回-1
💚int indexOf(int ch, intfromIndex):从fromIndex位置开始找ch第一次出现的位置,没有返回-1
💚int indexOf(String str) 返回str第一次出现的位置,没有返回-1
💚int indexOf(String str, intfromIndex):从fromIndex位置开始找str第一次出现的位置,没有返回-1
💚int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1
💚int lastIndexOf(int ch, intfromIndex):从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
💚int lastIndexOf(String str) 从后往前找,返回str第一次出现的位置,没有返回-1
💚 int lastIndexOf(String str, intfromIndex):从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1
🐷数值和字符串转换
用valueof
public static void main(String[] args) { //把其他的数据类型 变成字符串 String s = String.valueOf(123); String s2 = String.valueOf(12.5); System.out.println(s); System.out.println(s2); }
结果
public static void main(String[] args) { //字符串转数字 int data1 = Integer.parseInt("199785"); double data2 = Double.parseDouble("1997.85"); System.out.println(data1); System.out.println(data2); }
public static void main(String[] args) { int a = Integer.valueOf("64");//6*8^1 + 4*8^0 = 52//默认十进制 System.out.println(a); int a2 = Integer.parseInt("100");//默认十进制 System.out.println(a2); }
public static void main(String[] args) { String s1 = "abondon"; String ret = s1.toUpperCase(); System.out.println(ret); System.out.println("s1-> " + s1); String s2 = "ABANDON"; ret = s2.toLowerCase(); System.out.println(ret); }
这里要注意,使用这个大小写的时候要记得本身并没有改变
public static void main(String[] args) { String s = "happy"; // 字符串转数组 char[] ch = s.toCharArray(); for (int i = 0; i < ch.length; i++) { System.out.print(ch[i]); } System.out.println(); // 数组转字符串 String s2 = new String(ch); System.out.println(s2); }
格式化
public static void main(String[] args) { String s = String.format("%d-%d-%d", 2003 ,2,14); System.out.println(s);//2003-2-14 }
public static void main(String[] args) { String s1 = "ababcabcdabcde"; String ret = s1.replaceFirst("ab","qquuuuu");//代表用qquuuuu替换第一个ab System.out.println(ret); System.out.println("s1-> "+s1);//就算替换,但是它本身是没有改变的 }
字符串拆分 public static void main(String[] args) { String s1 = "hello wyb happy everyday"; String[] ret = s1.split(" ",4);//以空格的形式分开,分成4组 for (String s : ret) { System.out.println(s);//打印 } }
public static void main(String[] args) { String str = "192.168.1.1"; String[] ret = str.split("\\.",4); for (String s : ret) { System.out.println(s); } }
以\.的形式分为4组打印,\需要两条\\来编译,那么两条\\就需要4条\\\\来编译
public static void main16(String[] args) { String str = "197\\168\\1\\1"; String[] ret = str.split("\\\\"); for (String s : ret) { System.out.println(s); } }
public static void main(String[] args) { String str = "abcdef"; String ret = str.substring(1,4);//[1,4)//字符串截取//结果为bcd默认范围为左闭右开 System.out.println(ret); System.out.println("============="); String s = " we are happy "; System.out.println(s.trim());//当前字符串的左右的空格去掉 //trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等). System.out.println(s); }
字符串替代
public static void main(String[] args) { String str="we%are%happy"; String ret=str.replaceAll("%"," "); System.out.println(ret); }
用空格替代所有的%
今天的分享就到这里,我们下期再见,886