Java的String类在开发时经常都会被使用到,由此可见String的重要性。经过这次认真仔细的学习了java的String类。发现了自己以前开发中对String使用的不足,特写此博客来记录自己对String的学习总结。

首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

String实际上是使用字符数组来存储的数据的。从源码可以清晰看到定义的字符数组。

String在java/lang包下面,java默认导入lang包,所以使用String类时不用导入。

1.创建方式

(1)String ok1=new String(“ok”);
(2)String ok2=“ok”;
我相信很多人都知道这两种方式定义字符串,但他们之间的差别又有多少人清楚呢。画出这两个字符串的内存示意图:

      String ok1=new String(“ok”)。首先会在堆内存申请一块内存存储字符串ok,ok1指向其内存块对象。同时还会检查字符串常量池中是否含有ok字符串,若没有则添加ok到字符串常量池中。所以 new String()可能会创建两个对象.
     String ok2=“ok”。 先检查字符串常量池中是否含有ok字符串,如果有则直接指向, 没有则在字符串常量池添加ok字符串并指向它.所以这种方法最多创建一个对象,有可能不创建对象
所以String ok1=new String(“ok”);//创建了两个对象

String ok2=“ok”;//没有创建对象
 
来两题习题看你是否真的明白了
1.下面代码创建了多少个对象?

  1. String temp="apple";
  2. for(int i=0;i<1000;i++)
  3. {
  4. temp=temp+i;
  5. }

答案:1001个

2.下面代码创建了多少个对象?

  1. String temp=new String("apple")
  2. for(int i=0;i<1000;i++)
  3. {
  4. temp=temp+i;
  5. }

答案:1002个

 
2.匹配相等
       使用String类经常需要对两个字符串进行对比,看是否相等。这是又有==和equals两种选择,这两者方法区别很大,可能我们会弄错,下面我们对这两种方法进行详解。
      首先要明白这两种方法的用途:
比较类中的数值是否相等使用equals(),比较两个包装类的引用是否指向同一个对象时用==
equals()是看数值是否相等,比较好理解。而==是看是否属于同一个对象。下面来举例说明==的使用
先明白这个概念:常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。主要看编译  期字符串能否确定。
情况一:
  1. String ok="ok";
  2. String ok1=new String("ok");
  3. System.out.println(ok==ok1);//fasle

明显不是同一个对象,一个指向字符串常量池,一个指向new出来的堆内存块,new的字符串在编译期是无法确定的。所以输出false

情况二:
  1. String ok="apple1";
  2. String ok1="apple"+1;
  3. System.out.println(ok==ok1);//true

编译期ok和ok1都是确定的,字符串都为apple1,所以ok和ok1都指向字符串常量池里的字符串apple1。指向同一个对象,所以为true.

情况三:
  1. String ok="apple1";
  2. int temp=1;
  3. String ok1="apple"+temp;
  4. System.out.println(ok==ok1);//false

主要看ok和ok1能否在编译期确定,ok是确定的,放进并指向常量池,而ok1含有变量导致不确定,所以不是同一个对象.输出false

情况四:
  1. String ok="apple1";
  2. final int temp=1;
  3. String ok1="apple"+temp;
  4. System.out.println(ok==ok1);//true

ok确定,加上final后使得ok1也在编译期能确定,所以输出true

情况五:
  1. public static void main(String[] args) {
  2. String ok="apple1";
  3. final int temp=getTemp();
  4. String ok1="apple"+temp;
  5. System.out.println(ok==ok1);//false
  6. }
  7. public static int getTemp()
  8. {
  9. return 1;
  10. }

ok一样是确定的。而ok1不能确定,需要运行代码获得temp,所以不是同一个对象,输出false。

 
3.Intern()方法
前面已经介绍常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。
但我们可以通过intern()方法扩展常量池。
         intern()是扩充常量池的一个方法,当一个String实例str调用intern()方法时,java会检查常量池中是否有相同的字符串,如果有则返回其引用,如果没有则在常量池中增加一个str字符串并返回它的引用。
如:
  1. String ok="apple";
  2. String ok1=new String("apple");
  3. System.out.println(ok==ok1);//false
  4. ok1=ok.intern();//获取常量池ok的引用
  5. System.out.println(ok==ok1);//true--指向同一个对象

 
4.String常用方法
(1)length() 字符串的长度 
  例:char chars[]={'a','b'.'c'}; 
    String s=new String(chars); 
    int len=s.length();

(2)charAt() 截取一个字符 
  例:char ch; 
    ch="abc".charAt(1); 返回'b'

(3)getBytes()获取对应字节数组
        例:String ok="apple";
               byte[]bytes=ok.getBytes();
               for(int i=0;i<bytes.length;i++)
                     System.out.println(bytes[i]);//输出字节数组,范围为-128---127
(4)indexOf()和lastIndexOf() 
      indexOf() 查找字符或者子串第一次出现的地方。 
      lastIndexOf() 查找字符或者子串是后一次出现的地方。
(5)substring()  
           它有两种形式,第一种是:String substring(int startIndex) 
         第二种是:String substring(int startIndex,int endIndex)
(6)concat()     连接两个字符串
(7)replace() 替换 
  它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下: 
  String replace(char original,char replacement) 
  例如:String s="Hello".replace('l','w'); 
  第二种形式是用一个字符序列替换另一个字符序列,形式如下: 
  String replace(CharSequence original,CharSequence replacement)
(8)trim() 去掉起始和结尾的空格

(9)valueOf() 转换为字符串

(10)toLowerCase() 转换为小写

(11)toUpperCase() 转换为大写

(12)startsWith()和endsWith()  
        startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束
更多方法请参考String的API
总结
         String类具有immutable(不能改变)性质,当String变量需要经常变换时,会产生很多变量值,应考虑使用StringBuffer提高效率。在开发时,注意String的创建方法。
 
    转自http://longpo.iteye.com/blog/2199493

Java的String详解的更多相关文章

  1. Java字符串String详解

    1.String字符串 实例化String对象: (1)直接赋值,如:String str="hello"; (2)使用关键字 new,如:String str=new Strin ...

  2. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  3. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  4. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

  5. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  6. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  7. JAVA命令参数详解

    JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...

  8. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  9. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

随机推荐

  1. JS自动爆炸案例

    学习到了: setTimeout函数的灵活运用. 案例实现讲解: 1.先定义一个全局的变量,赋值为null. 2.然后使用timeout调用bang函数,以达到自动自动调用函数的功能. 3.bang函 ...

  2. plsql 只能识别32位的oracle解决办法

    http://www.cnblogs.com/ymj126/p/3712727.html#undefined

  3. 爬取千万淘宝商品的python脚本

    import time import leveldb from urllib.parse import quote_plus import re import json import itertool ...

  4. 【WPF】动态设置Binding的ConverterParameter转换器参数

    问题:XAML中,想要在一个Bingding语句中再次Bingding. Source="{Binding Path=Image,Converter={StaticResource UMat ...

  5. Codeforces 558C Amr and Chemistry 暴力 - -

    点击打开链接 Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input stan ...

  6. DataGridView使用技巧十一:DataGridView用户输入时,单元格输入值的设定

    通过DataGridView.CellParsing事件可以设定用户输入的值.下面的示例:当输入英文文本内容的时候,立即被改变为大写.DataGridView.CellParsing在离开编辑的单元格 ...

  7. DataTable的AcceptChanges()和RejectChanges()方法

    一.DataTable.AcceptChanges()方法 提交自上次调用AcceptChanges()方法以来对该表进行的所有更改.调用AcceptChanges()时,任何扔处于编辑模式的Data ...

  8. 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了

    服务端渲染(SSR) 简述:     又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML.     鼠标右击点击查看源码时,页 ...

  9. EasyUI-datagrid中load,reload,loadData方法的区别

    EasyUI比较常用,其中的datagrid比较复杂,它有其中有load,reload,loadData这三个方法,它们都有相同的功能,都是加载数据的,但又有区别. load方法,比如我已经定义一个d ...

  10. C++ 类的隐式转换

    所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话. 这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象. 下面的代码,类Person ...