Java——String类
学习Java,可考取Oracle的Java SE或EE认证 #生活技巧# #工作学习技巧# #技能培训认证#
String类:引用类型
eg1:
public static void main(String[] args){ String str1 = "abcde"; //直接赋值 System.out.println(str1); String str2 = new String("abcde"); System.out.println(str2); char[] array = {'a','b','c','d','e'}; String str3 = new String(array); System.out.println(str3); System.out.println(str1 == str2); //false System.out.println(str1 == str3); //false } 1234567891011121314 双引号中的内容都放在常量池;
eg2:
public static void main(String[] args){ String str = "abcde"; //直接赋值 String str2 = new String("abcde"); char[] array = {'a','b','c','d','e'}; String str3 = new String(array); String str4 = "ab"+"cde"; //编译期已经确定是"abcde" String str5 = "ab"+ new String("cde"); System.out.println(str == str2); //false System.out.println(str == str3); //false System.out.println(str == str4); //true System.out.println(str == str5); //false System.out.println(str2 == str3); //false } 1234567891011121314 String使用比较并不是在比较字符串内容, 而是比较两个引用是否是指向同一个对象;
eg3:
String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1.equals(str2)); //true 123
eg4:
String str = new String("Hello"); // 方式一 System.out.println(str.equals("Hello")); //如果str为空,就会抛出空指针异常 // 方式二 System.out.println("Hello".equals(str)); 12345 intern()方法手动入池
// 该字符串常量并没有保存在对象池之中 String str1 = new String("hello") ; String str2 = "hello" ; System.out.println(str1 == str2); // 执行结果:false String str1 = new String("hello").intern() ; String str2 = "hello" ; System.out.println(str1 == str2); // 执行结果:true 123456789
面试题:
请解释String类中两种对象实例化的区别
intern()方法手工入池。 修改字符串 借助原字符串,创建新的字符串
eg:
String str = "Hello"; str = "h" + str.substring(1); //substring() 提取一个子串; //substring(1):从1号下标开始提取子串 System.out.println(str); // 执行结果:hello 123456 使用 “反射” 操作破坏封装, 访问一个类内部的 private 成员.
反射:
Java的自省过程;
指在程序运行过程中,获取/修改某个对象的详细信息(类型、属性等),相当于让一个对象更好的“认清自己”;
eg:
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { String str = "Hello"; // 获取 String 类中的 value 字段. 这个 value 和 String 源码中的 value 是匹配的. Field valueField = String.class.getDeclaredField("value"); // 将这个字段的访问属性设为 true valueField.setAccessible(true); // 把 str 中的 value 属性获取到. char[] value = (char[]) valueField.get(str); // 修改 value 的值 value[0] = 'h'; System.out.println(str); } 123456789101112
copyValueOf(); //将数组转换成字符串
@Deprecated 是一个注解,表示此方法已经被弃用,但是仍然可以正常使用;
字节与字符串eg:
public static void main(String[] args) throws UnsupportedEncodingException { byte[] bytes = {97,98,99,100}; String str = new String(bytes,1,2); System.out.println(str); String str2 = "abc"; byte[] bytes1 = str2.getBytes(); System.out.println(Arrays.toString(bytes1)); String str3 = "高"; byte[] bytes2 = str3.getBytes("utf8"); System.out.println(Arrays.toString(bytes2)); } 12345678910111213
??? 那么何时使用 byte[], 何时使用 char[] 呢?
byte[] :
char[] :
把String按照一个字符一个字符的方式处理;更适合针对文本数据来操作,尤其是包含中文的时候。(打开后认识的文件就是文本数据) 字符串比较 equals:区分大小写;equalsIanoreCase:不区分大小写;compareTo:比较字符串的大小关系;A.compareTo(B):A和B比较;
>0:A>B
=0:A=B
<0:A<B 字符串查找 contains(CharSequence s):判断一个字符串是否存在;
String str = "helloworld" ; System.out.println(str.contains("world")); // true 12 indexOf(String str):从头开始查找指定字符串的位置,找到了返回其下标,找不到返回-1;
如果有多个,返回第一个的下标;
String str = "helloworld" ; System.out.println(str.indexOf("world")); // 5,w开始的索引 System.out.println(str.indexOf("bit")); // -1,没有查到 if (str.indexOf("hello") != -1) {System.out.println("可以查到指定字符串!"); } 123456 indexOf(String str,int fromIndex):从指定位置开始查找;
String str = "helloworld" ; System.out.println(str.indexOf("l")); // 2 System.out.println(str.indexOf("l",5)); // 8 System.out.println(str.lastIndexOf("1")); //8 1234 lastIndexOf(String str):从后往前找;lastIndexOf(String str,int fromIndex):从指定位置从后往前找;startsWith(String prefix):判断字符串是否以指定字符开头;startsWith(String prefix,int toffest):从指定位置判断是否以指定字符开头;endsWith(String suffix):判断字符串是否以指定字符结尾;
String str = "**@@helloworld!!" ; System.out.println(str.startsWith("**")); // true System.out.println(str.startsWith("@@",2)); // ture System.out.println(str.endsWith("!!")); //true; 1234 字符串替换 replaceAll(String regex,String replacement):替换所有的指定内容;replaceFirst(String regex,String replacement):替换首个内容;
String str = "helloworld" ; System.out.println(str.replaceAll("l", "_")); System.out.println(str.replaceFirst("l", "_")); 123
(字符串是不可变对象,所以字符串的替换并不修改当前字符穿,而是产生一个新的字符串)
字符串拆分 split(String regex):将字符串全部拆分;String str = "hello world hello bit" ; String[] result = str.split(" ") ; // 按照空格拆分 for(String s: result) {System.out.println(s); } 12345 split(String regex,int limit):将字符串部分拆分,该数组的长度就是limit极限;
String str = "hello world hello bit" ; String[] result = str.split(" ",2) ; for(String s: result) {System.out.println(s); } 12345 字符串截取 substring(int beginIndex):从指定索引截取到结尾;substring(int beginIndex,int endIndex):截取部分内容;
String str = "helloworld" ; System.out.println(str.substring(5)); System.out.println(str.substring(0,5)); 123
(KMP算法:查找子串在主串当中的位置)
其他操作方法 trim():去掉字符串中的左右空格,保留中间的空格;String str = " hello world " ; System.out.println("["+str+"]"); System.out.println("["+str.trim()+"]"); 123 toUpperCase():字符串转大写;toLowerCase():字符串转小写;
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.toUpperCase()); System.out.println(str.toLowerCase()); 123
(native) intern():字符串入池操作;
concat(String str):字符串连接,等同于"+",不入池;
length():取得字符串长度;
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.length()); 12 isEmpty():判断是否为空字符串,但不是null,而是长度为0;
System.out.println("hello".isEmpty()); System.out.println("".isEmpty()); System.out.println(new String().isEmpty()); 123
StringBuffer和StringBuilder
两者大部分的功能是相同的,这里主要介绍StringBuffereg:观察StringBuffr的使用
public class Test{ public static void main(String[] args) {StringBuffer sb = new StringBuffer();sb.append("Hello").append("World");fun(sb);System.out.println(sb); } public static void fun(StringBuffer temp) {temp.append("\n").append("www.bit.com.cn");} } 1234567891011
String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的
情况考虑使用StingBuffer。
synchronized:被synchronized修饰——》线程安全;
StringBuffer适用于多线程;(被synchronized修饰)
StringBuilder适用于单线程;
注意:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:String变为StringBuffer:利用StringBuffer的构造方法或append()方法;StringBuffer变为String:调用toString()方法;字符串反转:reverse();
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.reverse()); 12 字符串删除:
delete(int beginIndex,int endIndex):删除指定范围的内容
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.delete(5, 10)); 12 插入数据:
insert(int offset, 各种数据类型 b)
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.delete(5, 10).insert(0, "你好")); 12
面试题:请解释String、StringBuffer、StringBuilder的区别:
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.StringBuffer与StringBuilder大部分功能是相似的StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作网址:Java——String类 https://www.yuejiaxmz.com/news/view/110459
相关内容
String类的equals方法和==方法的比较经典String str = new String(“abc”)创建了几个对象?(转)
【Java数据结构】字符串常量池
037基于java+springboot的课外学习生活活动平台系统
格力空调智能控制:Java编程实现家居自动化系统
基于java web个人财务管理系统
【网站项目】java智慧生活分享平台初步设计和实现
基于java+ssm+jsp的个人财务管理系统
Java=NIO,AIO详解
基于Java个人财务管理系统设计实现(源码+lw+部署文档+讲解等)