zoukankan      html  css  js  c++  java
  • java中的String

     

    what?

    why?

    how?

    主题一:

    what: String与char分别是什么类型,这两种类型是怎么存储的。以及他们的区别与联系?

    Ans:

    (1)首先String不属于8种基本数据类型(int,byte,short,long,boolean,char,float,double),String是一个对象。

    因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

    (2)new String()和new String("")都是申明一个新的空字符串,是空串不是null

    (3)String str=”kvill”; 

           String str=new String (“kvill”);的区别:  
         在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。  常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量

    看例1:

     1 String s0="kvill";
     2 
     3 String s1="kvill";
     4 
     5 String s2=new String("kvill");
     6 
     7 String s3="kv"+"ill";
     8 
     9 System.out.println(s0==s1);
    10 
    11 System.out.println(s0==s2);
    12 
    13 System.out.println(s0==s3);

    结果为:

    1 true
    2 
    3 false
    4 
    5 true

    首先,我们要知结果为Java会确保一个字符串常量只有一个拷贝。 
    因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;
    而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符
    串常量,所以s3也同样在编译期就被解析为一个字符串常量,所以s3也是常量池中“kvill”的一个引用。

    所以我们得出s0==s1==s3;

    用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
    

    s0和s1、s3在编译期就可以确定。他们是常量池中“kvill”的引用。 s2因为无法在编译期确定,所以是运行时创建的新对象“kvill”的引用,

    看例子2:

    1         String s0="kvill";
    2         String s1=new String("kvill");
    3         String s2="kv"+new String("ill");
    4         System.out.println(s0==s1);
    5         System.out.println(s0==s2);
    6         System.out.println(s1==s2);

    结果为:

    false
    false
    false
    例子2中,s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用; 
    这是因为每个字符串为一个对象,比较的是他们的引用地址,在堆分配的地址肯定是不一样的。 TT的思考:就是说s0,s1,s2比较的是对象的地址??o,不对,s0是一个常量。s1、s2是对象,比较的是他们的引用地址,
    就是堆分配中的地址,每个字符串是一个独立的对象,堆地址肯定不是一个喽。

     (4)String.intern():

    java APIs官方版本对intern的介绍是:


    intern

    public String intern()
    返回字符串对象的规范化表示形式

    一个初始为空的字符串池,它由类 String 私有地维护。

    当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回String 对象的引用

    (TT现在知道定义完String这个对象,String这个对象就是一个引用变量。当方法设置返回值是String类型时,设置的原来就是String对象的引用,其实说返回值是String对象,应该也不错吧?)

    它遵循以下规则:对于任意两个字符串 st,当且仅当 s.equals(t)true 时,s.intern() == t.intern() 才为 true

    所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义

    返回:
    一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池
    TT的观点:咋现在又不是返回对象的引用,而是返回字符串了呢?前面还说返回对象的引用。是不是返回对象的引用,可以由对象的引用取得到对象。对象就是字符串呢?

    再补充一点:存在于.class

    百度文库:

    http://wenku.baidu.com/view/e7b9c32ded630b1c59eeb556.html

    new String() 

    创建

    null

    所以

    String

    的默认值也是

    null

    但它又是一种特殊的对象,

    主题二:String与char一般都用在什么地方?以及他们的相互转换要怎么转换?

    1、java

  • 相关阅读:
    ethereum(以太坊)(六)--整型(int)
    pycharm升级pip20版本后,还是显示pip10的版本的问题
    Django2.2.7 邮箱重置密码
    django重置密码,填哪个用户的注册邮箱,就是重置的哪个用户的密码,和登陆记录没有关系。
    Django:重置用户密码,用第三方库Django-password-reset
    python_django_views文件中return render("XXXX/XXX.html") 显示 Template file not found
    Django添加templates目录
    django2.2 版本static静态文件路径配置出错的问题解决方案。
    pycharm无法新建django项目,报错timed out,需先建立pure项目,进入后建立django项目,最后调整目录层级。
    python读取大文件和普通文件
  • 原文地址:https://www.cnblogs.com/meihao1989/p/3177157.html
Copyright © 2011-2022 走看看