rtt全民互助平台网站开发,域名解析ip138,请问聊城做网站,网站信息化建设总结文章目录 String类常用方法字符串查找转化字符串替换字符串拆分字符串截取其他操作方法 字符串的不可变性StringBuilder和StringBufferStringBuilder的介绍面试题 String类常用方法
字符串查找
方法功能char charAt(int index)返回index位置上字符#xff0c;如果index为负数… 文章目录 String类常用方法字符串查找转化字符串替换字符串拆分字符串截取其他操作方法 字符串的不可变性StringBuilder和StringBufferStringBuilder的介绍面试题 String类常用方法
字符串查找
方法功能char charAt(int index)返回index位置上字符如果index为负数或者越界抛出IndexOutOfBoundsException异常int indexOf(int ch)返回ch第一次出现的位置没有返回-1int indexOf(int ch, int fromIndex)从fromIndex位置开始找ch第一次出现的位置没有返回-1int indexOf(String str)返回str第一次出现的位置没有返回-1int indexOf(String str, int fromIndex)从fromIndex位置开始找str第一次出现的位置没有返回-1int lastIndexOf(int ch)从后往前找返回ch第一次出现的位置没有返回-1int lastIndexOf(int ch, int fromIndex)从fromIndex位置开始找从后往前找ch第一次出现的位置没有返回-1int lastIndexOf(String str)从后往前找返回str第一次出现的位置没有返回-1int lastIndexOf(String str, int fromIndex)从fromIndex位置开始找从后往前找str第一次出现的位置没有返回-1
注意上述方法都是实例方法。
转化
数值和字符串转化
数字转字符串String.valueOf字符串转intInteger.parseInt字符串转doubleDouble.parseDouble
class Student {String name;int age;public Student(String name, int age) {this.name name;this.age age;}
}
public class Test {public static void main (String[] args) {// 数字转字符串String s1 String.valueOf(1234);String s2 String.valueOf(12.34);String s3 String.valueOf(true);String s4 String.valueOf(new Student(Hanmeimei, 18));System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4);System.out.println();// 字符串转数字// 注意Integer、Double等是Java中的包装类型int data1 Integer.parseInt(1234);double data2 Double.parseDouble(12.34);System.out.println(data1);System.out.println(data2);}
}大小写转换
public static void main(String[] args) {String s1 hello;String s2 HELLO;// 小写转大写System.out.println(s1.toUpperCase());// 大写转小写System.out.println(s2.toLowerCase());
}字符串转数组
public static void main(String[] args) {String s hello;// 字符串转数组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, 2019, 9,14);System.out.println(s);
}字符串替换
方法功能String replaceAll(String regex, String replacement)替换所有的指定内容String replaceFirst(String regex, String replacement)替换首个内容
public static void main(String[] args) {String str helloworld ;System.out.println(str.replaceAll(l, _));System.out.println(str.replaceFirst(l, _));}注意事项: 由于字符串是不可变对象, 不修改当前字符串, 而是产生一个新的字符串
字符串拆分
方法功能String[] split(String regex)将字符串全部拆分String[] split(String regex, int limit)将字符串以指定的格式拆分为limit组
public static void main(String[] args) {String str hello world hello bit ;String[] result str.split( ) ; // 按照空格拆分for(String s: result) {System.out.println(s);}System.out.println(------------------);String[] result2 str.split( ,2) ;for(String s: result2) {System.out.println(s);}}split根据给定的正则表达式的匹配来拆分此字符串
有些特殊字符( [ { / ^ - $ | } ]) ? * . 作为分割符可能无法正确切分, 需要加上转义. 在其他语言中\\ 表示我想要在正则表达式中插入一个普通的字面上的反斜杠请不要给它任何特殊的意义。 在 Java 中\\ 表示我要插入一个正则表达式的反斜线所以其后的字符具有特殊的意义。 所以在其他的语言中如 Perl一个反斜杠 \ 就足以具有转义的作用而在 Java 的正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中\\ 代表其他语言中的 \这也就是为什么表示一位数字的正则表达式是\\d而表示一个普通的反斜杠是 \\。 public static void main(String[] args) {String str 192.168.1.1 ;String[] result str.split(\\.) ;for(String s: result) {System.out.println(s);}}如果分隔符是 “\” 那么就得写成 “\\\\”
public static void main(String[] args) {String str 192\\168\\1\\1 ;System.out.println(str);String[] result str.split(\\\\) ;for(String s: result) {System.out.println(s);}}如果一个字符串中有多个分隔符可以用|作为连字符
public static void main(String[] args) {String str namezhangsanage18 ;String[] result str.split(||) ;for (int i 0; i result.length; i) {System.out.println(result[i]);}}public static void main(String[] args) {String str namezhangsanage18 ;String[] result str.split() ;for (int i 0; i result.length; i) {String[] temp result[i].split() ;System.out.println(temp[0] temp[1]);}}字符串截取
方法功能String substring(int beginIndex)从指定索引截取到结尾String substring(int beginIndex, int endIndex)截取部分内容
public static void main(String[] args) {String str helloworld ;System.out.println(str.substring(5));System.out.println(str.substring(0, 5));}注意事项:
索引从0开始注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
其他操作方法
方法功能String trim()去掉字符串中的左右空格,保留中间空格
public static void main(String[] args) {String str hello world ;System.out.println([str]);System.out.println([str.trim()]);}trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等)
字符串的不可变性
String是一种不可变对象. 字符串不可被修改是因为 String类在设计时就是不可改变的String类实现描述中已经说明了 以下来自JDK1.8中String类的部分实现 String类中的字符实际保存在内部维护的value字符数组中该图还可以看出
String类被final修饰表明该类不能被继承value被final修饰表明value只能引用原来对象即不能引用其它字符数组但是其引用空间中的内容可以修改。
public static void main(String[] args) {final int array[] {1,2,3,4,5};array[0] 100;System.out.println(Arrays.toString(array));// array new int[]{4,5,6}; // 编译报错Error:(19, 9) java: 无法为最终变量array分配值
}所有涉及到可能修改字符串内容的操作都是创建一个新对象改变的是新对象
字符串不可变,不是因为String类自身或者其内部value被final修饰而不能被修改。 是因为String类不能被继承也没有提供方法拿到value,value还是被private修饰的,也不能引用其他对象,拿不到value,就没办法对value进行修改
为什么 String 要设计成不可变的?(不可变对象的好处是什么?)
方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.不可变对象是线程安全的.不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.
StringBuilder和StringBuffer
尽量避免直接对String类型对象进行修改因为String类是不能修改的所有的修改都会创建新对象效率非常低下。
public static void main(String[] args) {long start System.currentTimeMillis();String s ;for(int i 0; i 10000; i){s i;}long end System.currentTimeMillis();System.out.println(end - start);start System.currentTimeMillis();StringBuffer sbf new StringBuffer();for(int i 0; i 10000; i){sbf.append(i);}end System.currentTimeMillis();System.out.println(end - start);start System.currentTimeMillis();StringBuilder sbd new StringBuilder();for(int i 0; i 10000; i){sbd.append(i);}end System.currentTimeMillis();System.out.println(end - start);}可以看出在对String类进行修改时效率是非常慢的因此尽量避免对String的直接修改如果要修改的话建议尽量使用StringBuffer或者StringBuilder。
StringBuilder的介绍
由于String的不可更改特性为了方便字符串的修改Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的这里介绍 StringBuilder常用的一些方法
方法说明StringBuff append(String str)在尾部追加相当于String的可以追加boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量char charAt(int index)获取index位置的字符int length()获取字符串的长度int capacity()获取底层保存字符串空间总的大小void ensureCapacity(int mininmumCapacity)扩容void setCharAt(int index,char ch)将index位置的字符设置为chint indexOf(String str)返回str第一次出现的位置nt indexOf(String str, int fromIndex)从fromIndex位置开始查找str第一次出现的位置int lastIndexOf(String str)返回最后一次出现str的位置int lastIndexOf(String str, int fromIndex)从fromIndex位置开始找str最后一次出现的位置StringBuff insert(int offset, String str)在offset位置插入八种基类类型 String类型 Object类型数据StringBuffer deleteCharAt(int index)删除index位置字符StringBuffer delete(int start, int end)删除[start, end)区间内的字符StringBuffer replace(int start, int end, String str)将[start, end)位置的字符替换为strString substring(int start)从start开始一直到末尾的字符以String的方式返回String substring(int startint end)将[start, end)范围内的字符以String的方式返回StringBuffer reverse()反转字符串String toString()将所有字符按照String的方式返回
String和StringBuilder最大的区别在于String的内容无法修改而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。 注意String和StringBuilder类不能直接转换。如果要想互相转换可以采用如下原则:
String变为StringBuilder: 利用StringBuilder的构造方法或append()方法StringBuilder变为String: 调用toString()方法。
面试题
String、StringBuffer、StringBuilder的区别
String的内容不可修改StringBuffer与StringBuilder的内容可以修改.StringBuffer与StringBuilder大部分功能是相似的StringBuffer采用同步处理属于线程安全操作而StringBuilder未采用同步处理属于线程不安全操作
以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】
String str new String(ab); // 会创建多少个对象
String str new String(a) new String(b); // 会创建多少个对象