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. 从sql中image类型字段中导出图片

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  2. vim自动跳转到引用的函数

        安装:  yum install ctags 在你代码的根目录下执行:比如/data/www/test/trunkctags -R * 打开文件只能在根目录下打开就可以,比如 vim appl ...

  3. jQuery 选择器大全总结

    jQuery基础语法中规定的选择器有三种,分别是类选择器.ID选择器.标签选择器.如:$(“.aa”).$(“#id”).$(“div”),但中实际的应用中,DOM机构非常复杂,层级非常多.如和应对这 ...

  4. u-boot 2016.05 添加u-boot cmd

    记录一下如何在u-boot 添加一个自己想要的命令. 首先来看一下宏,include/command.h 218 #define U_BOOT_CMD(_name, _maxargs, _rep, _ ...

  5. 细数JDK里的设计模式<转>

    这也是篇老文了,相信很多人也看过.前面那些废话就不翻译了,直接切入正题吧~ 结构型模式: 适配器模式: 用来把一个接口转化成另一个接口. java.util.Arrays#asList() javax ...

  6. HTML——动画效果:左侧固定悬浮栏(图标控制)

    效果: 默认时: 点击按钮时 html: <!DOCTYPE html> <html> <head> <title>智能家居</title> ...

  7. 原生javascript星级评分

    写个最简单的原生js的星级评分: <div id="rank" class="pingfen"> <ul> <li>< ...

  8. 15 款优化表单的 jQuery 插件

    网页上的表单提供给用户的一种交互的方式,用户输入数据,提交到服务器,等待后续的处理.这些表单在我们浏览的网页中随处可见,也容易被我们忽略. 比如,“联系我们”页面会提供一个表单给用户填写他们的信息和想 ...

  9. 利用百度地图API根据地址查询经纬度

    传上来只是为了记录下三种jsonp方式,$.get(url, callback)方式不行,会出错 -- 必须指明返回类型为”json”才行. 或者使用$.getJSON()或者$.ajax({}). ...

  10. spring只是一个框架

    想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...