字符串分为可变字符串和不可变字符串。
不可变: String
可变:
1. StringBuilder 适用于单线程
2. StringBuffer 适用于多线程

使用可变字符串类的原因是:如果之前一直使用不可变的String,通过+拼接,会对内存造成负担,且一旦使用过多,会频繁的进行内存的分配和释放,降低效率。

字面量的创建方式:

(1)存放在堆里

(2)有string独立管理的字符串常量池内存区,JDK1.8 开始字符串常量区放在堆里

Ios 创建一个串行队列进行网络请求 实现串的创建_Ios 创建一个串行队列进行网络请求


Intern()方法,只针对两个字符串内容相等时,调用intern方法会先判断常量池中是否存在相同的字符串内容,如果存在,则返回该字符串对象的引用,如果不存在,就先将字符串对象存放到字符串常量池中,然后返回该字符串对象的引用。


对字符串的操作方法:

尤其注意下面代码中第11部分 trim去除的是半角空格,以及如何去除全角空格的解决办法

使用new创建对象,和不使用new创建对象的区别:使用new创建对象,会直接在堆的字符串常量池内存区申请一块内存空间,使用完毕后会被GC回收。而不使用new创建对象,首先在字符串常量池内存区中查找是否有该字符串,如果有,那么创建的变量即为该字符串的引用,不会开辟新的内存空间。

Ios 创建一个串行队列进行网络请求 实现串的创建_java_02

/**
 * 
 */
package com.zhi.stringdemo;

import java.util.Arrays;

//* 计算机属于通配符  *代表lang所有的java类都导入过来。
//lang是java的基础包,所以默认已经导入过的。 一般情况下,使用某一个工具类
//会只导入该类,不会导入整个包的所有类。
//import java.lang.*;

/**
 * @author Administrator
 *
 */
public class StringTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

//      1 字面量创建字符串对象的方式  iterals   推荐使用方式
        String str1 = "hello";
//      2 传统的创建方式  
//      从内存分析:参数"hello" 是匿名字符对象,在下面代码执行完毕之后依旧会被回收
        String str2 = new String("hello").intern();

        String str3 = str1;

//      如果字符串常量池中之前有hello字符串对象,则str4直接指向这个字符串对象。
//      不用重新开辟新的内存空间,如此,可节省内存资源。
        String str4 = "hello";//str4 = str1;

        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str1 == str4);

//      "laosun" 匿名字符串  执行完毕下面一条代码,laosun字符串对象就会当做垃圾被GC回收。
        System.out.println("laosun");


//      intern()
//      A pool of strings, initially empty, is maintained privately by the class String. 



//      3 避免nullPointerException
        String str5 = null;

//      str5.equals("laosun");
//      字符串常量会放在前面,调用方法。
        "laosun".equals(str5);

//      4 接下来字符串的API方法  API  看类的结构,看类中有哪些属性和方法供调用
//      Application Program Interface
//      应用程序接口

//      charAt(index) 根据索引获得对应的字符
        String str6 = "hello world";
        char char1 = str6.charAt(str6.length() - 1);
        System.out.println(char1);

//      5 indexOf(char) 返回某个字符的索引值
        int index = str6.indexOf('w');
        System.out.println(index);

//      6 前缀 后缀  返回值为boolean
        boolean isStart = str6.startsWith("heli");
        boolean isEnd   = str6.endsWith("orld");
        System.out.println(isStart + "==="+isEnd);

//      7 拼接  concat
//      String str7 = "laosun" + " is a handsome man";
        String str7 = str6.concat(" this is a java ");
        System.out.println(str7);

//      8 截取 substring
        String subStr1 = str7.substring(5);
        String subStr2 = str7.substring(5, 15);
        System.out.println(subStr1+"---"+subStr2);

//      9 替换  replace  返回一个String
        String replaceStr = str7.replace("java", "C++");
        System.out.println(replaceStr);

//      10 分割  split  String[]
//      开发过程中:分割URL,文件地址C:/zhiyou/java/a.txt
        String[] splitArr = str7.split(" ");
        for (String string : splitArr) {
            System.out.println(string);
        }

        String packageStr = "com.zhiyou.string.laosun.demo";
//      \\. 代表.符号
        String[] array = packageStr.split("\\.");
        System.out.println(array.length);
        for (String string : array) {
            System.out.println("----"+string);
        }

//      11 trim 去除字符串两边的空格
        System.out.println("  lao  sun ".trim());

//      注意:trim去除的是半角的空格,对于全角的空格(Unicode为12288)是无效的,
//      解决 方法是先用半角的空格替换,然后再用trim方法

//      12 向上向下取整
       System.out.println(str7.toUpperCase());
       System.out.println(str7.toLowerCase());

       char spaceCh = 12288;//全角空格
       char spaceCh1 = 32;  //半角空格  
       String laosunStr = spaceCh +"laosun"+spaceCh1;
       System.out.println(laosunStr.length());

       System.out.println("++++"+laosunStr.trim()+"++++");

       String newLaosunStr = laosunStr.replace(spaceCh, spaceCh1);
       System.out.println("++++"+newLaosunStr.trim()+"++++");

    }

}