zoukankan      html  css  js  c++  java
  • 7.Java中的字符串

    • 1.String的特性

    • 特性一:不可变性
    • String s=new String(“yangyun")
    • s=s.toUpperCase();
    • 这里的s,s占用的空间是不一样的(地址不相同),前提是toUpperCase函数确实改变了原始s的内容。

      为什么String是不可变对象?-----cankai 

    • 1.效率问题
    • 如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。
    • 2.安全性
    • 不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。
    • 3.字符串常量池的需要-----后续介绍
    • String s1= "ab" + "cd";  

      String s2= "abc" + "d";

    • s1,s2指向的地方是相同的,hashCode值也相同(可以缓存HashCode的值),如果String可以改变,那么s1改变会影响到s2,会带来安全问题。



    • 特性二:重载"+"
    • 操作符重载的含义:特定的操作符在特殊的类中有特别的含义;
    • “+”,”+=“是Java 中仅有的两个重载运算符;java不允许程序员重载任何的运算符
    • 连接的时候如果发现不是String,会尝试调用对象的toString 方法
    • //Object类的hashCode函数
      public
      String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }


    • 特性三:字符串的连接
    • 方法一:使用+=对字符串进行连接
    • 使用+,+=链接字符串的后果: (会产生一大堆需要垃圾回收的中间对象,从而效率低下)
    • JVM优化--自动的使用StringBuilder进行连接--不会产生不被引用的中间对象
    • 但是每连接一个String对象,JVM虽然不会创建一个没有办法引用的String对象,但是他会每次都创建一个StringBuilder对象---也是浪费
    • 方法二:使用StringBuilder的append函数对字符串进行连接---------推荐
    • 只需要创建一个StringBuilder进行连接
     

    • 特性四:"字符串常量"
    • 说明:字符串是不可变的,但是字符串引用(指向)是可以改变的,字符串常量是指字符串与常量进行绑定之后,指向就不能发生变化
    • 举例:
    • final String a=new String("a");//这里的a就不能改变指向
     

    • 特性五:重要的String函数(不熟悉的)
    • String.intern()—加入字符串常量池,并返回该字符串
    • String.equalsIgnoreCase()—忽略大小写比较
    • String.indexof(string1)------是否存在包含string1,存在返回index,不存在返回-1
    • string.lastIndexof(string)---从后向前查找
    • string.contains(string)------是否存在,返回boolean类型
    • string.trim()-----------------删除前后的空白符号


    • 2.StringBuilder类学习
    • 说明:用于连接字符串,对字符串进行处理
    • 构造函数:
    • StringBuilder sbuilder=new StringBuilder();//缓冲区16
    • StringBuilder sbuilder=new StringBuilder(20);//缓冲区为20
    • StringBuilder sbuilder=new StringBuilder(“Hello”);//初始字符Hello
    • 功能函数:
    • append();//向末尾添加字符串
    • reverse();//逆向装置字符串
    • insert(index,value);//从index开始处开始插入字符串
    • delete(startindex,endindex);//删除index在startindex~endindex-1的字符
    • replace(startindex,endindex,String);//使用String代替startindex~endindex之间的字符,长度自行调整,String不够用空格添加,长了就截取
    • toString();转为String
    • 无意识的递归-对象toString函数的调用
    • List<Person> list=new ArrayList(Arrays.asList(new Person(“Yangyun”),new Person(“Tim")));
    • System.out.println(list);
    • 如果:Person没有toString()对象——会自动调用每一个对象的super.toString()—Object的toString函数
    • 调用对象的toString()函数,若对象没有toString函数,调用对象的父类的toString()函数


     
    • 3.字符串pool与heap(重要)
    • 阶段一:编译阶段
    • 字符串常量放到一个字符串池(pool of literal strings)中,而运行时字符串常量池成为常量池的一部分。
    • 这里的字符串常量指的是String string="yangyun",String string="abc"+"def";
    • 阶段二:程序员使用intern方法可以改变字符串池的大小。
    • 当调用intern()方法时,如果字符串池中已经包含一个等于此String 对象的字符串 (用equals(Object)方法确定),则返回字符串池中的字符串。否则,将此String 对象添加到字符串池中,并返回此String 对象的引用。
    • 字符串的比较:
    • 1.String.equals(String)--比较字符串的
    • 2.==(实际比较的是String对象地址)
    • 举例:
    • String str1 = "java"; // str1指向字符串池
    • String str2 = "blog"; // str2指向字符串池
    • String s = str1 + str2;//这条语句会创建多少个对象
    • s是指向堆中值为"javablog"的对象,+ 运算符会在堆中建立起来两个String对象,这两个对象分别是"java","blog",也就是说从字符串池中复制这两个值,然后在堆中创建两个对象,然后再建立对象s,然后将"javablog"的堆地址赋给s。 // 这条语句总共创建了多少个对象?(三个吧)
    • 如果改成以下两种方式:
    • 1.s是常量池中的字符串
    • String s = "java" + "blog";  // 直接将"javablog"放入字符串池中
    • System.out.println(s == "javablog");  // 结果为true
    • 2.s是堆中的字符串
    • String s = str1 + "blog"; // 不放入字符串池,而是在堆中分配
    • System.out.println(s == "javablog"); // 结果为false
    • 总结:
    • 三种创建String对象的方式
    • String string=“abc”;//pool中有则不创建直接引用,否则创建并加入pool
    • final String string=“abc”;//pool中
    • String string=new String(“abc”);//heap分配内存创建对象
    • String string=“abc”+s1;//s1为new创建—那么string也是使用heap

    参考文献:

    http://www.codeceo.com/article/why-java-string-class-static.html

  • 相关阅读:
    洛谷P3003 [USACO10DEC]苹果交货Apple Delivery
    洛谷P1576 最小花费
    洛谷P1821 [USACO07FEB]银牛派对Silver Cow Party
    洛谷P1948 [USACO08JAN]电话线Telephone Lines
    洛谷P3371【模板】单源最短路径
    洛谷P2384最短路
    FirstOfAll
    Proxy模式:管理第三方API
    Abstract Server模式,Adapter模式和Bridge模式
    Observer模式
  • 原文地址:https://www.cnblogs.com/yangyunnb/p/6061657.html
Copyright © 2011-2022 走看看