String字符串
不可被继承;实现了Comparable、Serializable
String的不可变性
String的实例化方式
方式一:使用字面量方式。 String s = “hello”方式二:String s = new String(“hello”);【面试题】String s = new String(“hello”)在内存中创建了几个对象? 两个!内存解析:
jdk6时,字符串常量池是存放在永久代jdk7时,字符串常量池改为存放在堆空间jdk8时,取消了永久代,取而代之的是元空间(使用直接内存)
连接 *** 作:+
String的常用方法
String与其他相关结构的转换:包装类、字符数组、字节数组
String的常用算法题目
二、String、StringBuffer、StringBuilder 2.1 String 与其他类之间的转换String与包装类、基本数据类型之间的转化
@Test public void test1(){ //String-->包装类、基本数据类型:调用包装类Xxx的parseXxx() String str = "123"; int num = Integer.parseInt(str); System.out.println(num); // 包装类、基本数据类型--> String:调用String的valueOf() String str1 = String.valueOf(num); System.out.println(str1); String str2 = num + "";//底层需要创建SringBuilder,并调用append()导致效率第一valueOf() System.out.println(str2); }
String与char[]之间的转化
@Test public void test2(){ String str1 = "hello"; //String--->char[]:调动String的toCharArray() char[] arr1 = str1.toCharArray(); for(int i = 0;i < arr1.length;i++){ System.out.println(arr1[i]); } //char[] ---> String:调用String的构造器 String str2 = new String(arr1, 0, arr1.length);//new String(arr1); System.out.println(str2); }
String与byte[]之间的转化
@Test public void test3() throws Exception{ String str1 = "hello中国"; //编码:String--->byte[]:getBytes() byte[] arr1 = str1.getBytes();//使用默认的字符集:UTF-8 System.out.println(Arrays.toString(arr1)); byte[] arr2 = str1.getBytes("gbk");//显式指定字符集。 System.out.println(Arrays.toString(arr2)); //解码:byte[] ---> String:使用构造器 String str2 = new String(arr1);//使用默认的字符集:UTF-8 System.out.println(str2); String str3 = new String(arr2); System.out.println(str3);//因为编码集和现在的解码集不一致,导致出现乱码! String str4 = new String(arr2,"gbk"); System.out.println(str4);//因为编码集和现在的解码集都是使用gbk,没有乱码 }
String、StringBuffer、StringBuilder
//String --> StringBuffer、StringBuilder String str = "hello"; StringBuffer s1 = new StringBuffer(str); StringBuilder s2 = new StringBuilder(str); //StringBuffer、StringBuilder --> String String str1 = s1.toString(); String str2 = s2.toString(); String str3 = new String(s1); String str3 = new String(s2);2.3 String、StringBuffer、StringBuilder三者对比
@Test public void test1() { String str1 = "hello"; str1 += "world";// 新建一个内存空间保存helloworld StringBuffer str2 = new StringBuffer("hello"); str2.append("world");// 与创建对象中的char[]数组是同一个 }
面试题:String、StringBuffer、StringBuilder的异同
对比三者的执行效率:
@Test public void test3() { // 初始设置 long startTime = 0L; long endTime = 0L; String text = ""; StringBuffer buffer = new StringBuffer(""); StringBuilder builder = new StringBuilder(""); // 开始对比 startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { buffer.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuffer的执行时间:" + (endTime - startTime)); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { builder.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuilder的执行时间:" + (endTime - startTime)); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { text = text + i; } endTime = System.currentTimeMillis(); System.out.println("String的执行时间:" + (endTime - startTime)); }2.4 StringBuilder和StringBuffer的常用方法
@Test public void test2() { StringBuffer s1 = new StringBuffer(); s1.append("abc").append("def").append("123");// 方法链的调用 System.out.println(s1); s1.replace(3, 6, "hello"); System.out.println(s1); s1.insert(3, "123"); System.out.println(s1); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)