String 字符串创建的底层原理
String str=“hello”
- 1. 这种方式创建字符串的时候,jvm首先检查字符串常量池中是否存在该字符串的对象,如果已经存在,那么就不会再字符串的常量池中再次创建了,直接返回该字符串在字符串常量池中的内存地址如果该字符串还不存在字符串常量池中,那么就会在字符串的常量池中先创建该字符串的对象在返回字符串对象的内容>
String str=new String (“hello”);
- 2.如果以这种方式创建字符串对象的时候,jvm首先会检查字符串常量池中是否存在"hello"的字符串,如果已经存在,那么就不会在字符串的常量池中创建了,如果还没有存在,那么就会在字符串常量池中创建"hello"的字符串对象,然后会在堆中再创建一份字符串的对象,把字符串常量池中的"hello"字符串内容拷贝到堆内存中的字符串对象,然后返回堆内存中字符串对象的内存地址>
String的构造方法
-
String 构造方法
-
String() 创建一个空数组
-
String(byte[] bytes)使用一个字节数组构建一个字符串对象
-
String(byte[] bytes//要解码的数组, int offset//指定从数组的索引值开始解码, int length//要解码多少个元素)
*s使用字节数组和字符数组都可以构建数组 -
String (char[] value)使用一个字符数组组建一个字符串,
-
String(char[] value//要解码的数组, int offset//指定数组索引值开始解码, int count//要解码的次数)
-
String(int[] codePoints, int offset, int count)
-
String(String original)//以字符串组建一个字符串
-
String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = new String("hello"); String str5="lll"; System.out.println("str1==str2?" + "\t" + (str1 == str2));//true System.out.println("str2==str3?" + "\t" + (str2 == str3));//fasle System.out.println("str3==str4?" + "\t" + (str3 == str4));//fasle System.out.println("str3.equals(str2)?" + "\t" + (str3.equals(str2)));//true System.out.println("str3.equals(str4)?" + "\t" + (str3.equals(str4)));//true System.out.println("str4.equals(str5)?" + "\t" + (str4.equals(str5)));//false //"=="用于比较引用数据类型的时候比较的是两个对象的内存地址,equals方法默认情况下比较的是两个对象的内存地址
String普通的方法
String的获取方法>
-
int length();获取字符串的长度
-
char charAt(int index)获取特定的位置的字符
-
int indexOf(String str)//找找字符串第一次出现的索引值,如果没有那就后返回-1
-
int indexOf(String target, int fromIndex)从指定的index下标开始查找目标字符串target,如果没有那就返回-1
-
int lastIndexOf(String str)//查找子串最后一次出现的索引值,如果没有那么就返回-1
-
public class Dome03 { public static void main(String[] args) { String str=new String("我爱你中国,,中国"); System.out.println(str.charAt(2)); System.out.println(str.length()); System.out.println(str.indexOf("中国")); System.out.println(str.lastIndexOf("中国")); } }
String的判断方法
-
boolean endsWith(String str)//是否以指定的字符串结束
-
boolean isEmpty()是否长度为0
-
boolean contains(ChaSequence)是否包含指定序链的应用搜索
-
boolean equals(Object anObject)是否相等
-
boolean equalsIgnoreCase(String anotherString)比较时忽略大小写
-
String str=new String("我爱你中国"); String str2=new String("ABC"); String str3=""; String str4=null; System.out.println(str.endsWith("中国"));//判断是否为"中国"结尾 System.out.println(str.isEmpty());//判断字符串是否为空 System.out.println(str.contains("我爱你"));//判断是否包含指定序链的字符串 System.out.println(str2.equalsIgnoreCase("abc"));// System.out.println(str3.isEmpty());判断为空 // System.out.println(str4.isEmpty());//没有指向对象所以会出现空指针的异常
String的转换方法
-
char[] tocharArray() 将字符串转化为字符数组
-
byte[] getBytes();将字符出转化为字节数组
-
字符数组和字节数组和字符串之间是可以互相转换的
-
String str="我爱你中国"; char [] chararr=str.toCharArray(); System.out.println(Arrays.toString(chararr));//转换为字符数组 byte[] bytearr=str.getBytes(); System.out.println(Arrays.toString(bytearr));//转换为字节数组 }
String的其他方法
-
String replace(CharSequence target, CharSequence replacement)//指定内容替换旧内容
-
String substring(int beginIndex)指定开始的索引值开始截取字符串
-
String substring(int beginIndex, int endIndex)指定开始的索引值到结束得索引值截取字符串
-
获取上传文件名"D:\\20201112\\day\\Dome01.java" */ public class Dome08 { public static void main(String[] args) { String str = "D:\\2020111\\day\\Dome01.java"; System.out.println(getFileName(str)); } public static String getFileName(String str) { //将是字符串转换为字符型数组 char[] arr = str.toCharArray(); //确定开始的下标 int startindex = str.lastIndexOf("\\")+1; int endindex = arr.length - 1; //(包头不包尾) String s = str.substring(startindex, endindex + 1); return s; }
-
String toUpperCase()转大写
-
String toLowerCase()转小写
-
String trim()去除字符串首尾的空格
-
String 的练习题 * 1.自己实现一个trim()的方法 * * */ public class Dome07 { public static void main(String[] args) { String str = " woaini中国 "; System.out.println(cleanSpace(str)); } public static String cleanSpace(String str) { //将字符串转换为字符执行数组 char[] arr = str.toCharArray(); System.out.println(Arrays.toString(arr)); //定义字符型数组的开始下标 int startindex = 0; //定义字符型数组的结束下标 int endindex = arr.length-1; //确定开始的索引值 while (true) { if (arr[startindex] == ' ') { startindex++; } else { break; } } //确定结束的索引值 while (true) { if (arr[endindex] == ' ') { endindex--; } else { break; } } //截取索引值开始到结束的字符串打印输出 String str1 = str.substring(startindex,endindex+1); return str1; }
-
String str=" 我爱你中国 ,I love you China "; System.out.println(str.replace("爱","很爱")); //指定内容替换旧内容 System.out.println(str.substring(4));//指定开始的索引值开始截取字符串 System.out.println(str.substring(3,5));//指定开始的索引值到结束得索引值截取字符串 System.out.println(str.toUpperCase());//转大写 System.out.println(str.toLowerCase());//转小写 System.out.println(str.trim());//去除字符串首尾的空格
笔试题目:使用StringBuffer无参构造函数创建了一个对象时,默认的容量为多少?如果长度不够用了,自动增张多少倍
- 答案:StringBuffer底层就是依赖一个祖父数组才能存储字符数据的该字符串数组的默认长度为16,
- 如果在字符串数组长度不够用自动增长一倍+2