精华内容
下载资源
问答
  • 在jdk1.7和jdk1.8,intern实现就不是复制一份实例了,而是把首次遇到字符串引用放入方法区中 以下引用深入理解Java虚拟机里一个例子 String str1 = new StringBuilder("计算机").append("软件")....
    1. 在jdk1.6,intern的实现是,将首次遇到的字符串复制一份到方法区中,并返回指向方法区的新字符串的引用
    2. 在jdk1.7和jdk1.8,intern的实现就不是复制一份实例了,而是把首次遇到的字符串的引用放入方法区中

    以下引用深入理解Java虚拟机里的一个例子

     String str1 = new StringBuilder("计算机").append("软件").toString();
     System.out.println(str1.intern() == str1); // "计算即软件"是第一次出现,所以str1.intern()返回的就是str1在堆里的引用,所以这里输出true
    
     String str2 = new StringBuilder("ja").append("va").toString();
     System.out.println(str2.intern() == str2); // "java"是已经存在方法区常量池的字符串,所以str2.intern()返回的是其它的引用,所以这里输出false
    
    展开全文
  • String类

    2020-06-03 21:57:47
    String类表示字符串,Java 程序中的所有字符串都作为此类的对象。String类不是基本数据类型...String类的概念 首先要定义并初始化字符串。String类包括以下常用的构造方法。 String(String s):初始化一个新创建的Stri

    String类表示字符串,Java 程序中的所有字符串都作为此类的对象。String类不是基本数据类型,它是一个类。因为对象的初始化默认值是null,所以String类对象的初始化默认值也是null。String是一种特殊的对象,具有其他对象没有的一些特性。

    String字符串是常量,字符串的值在创建之后不能更改。

    String类是最终类,不能被继承。

    String类的概念
    首先要定义并初始化字符串。String类包括以下常用的构造方法。

    String(String s):初始化一个新创建的String对象,使其表示一个与参数相同的字符序列。
    String(char[] value):创建一个新的String对象,使其表示字符数组参数中当前包含的字符序列。
    String(char[] value, int offset, int count):创建一个新的String对象,它包含取自字符数组参数的一个子数组的字符序列。offset参数是子数组第一个字符的索引(从0开始建立索引),count 参数指定子数组的长度。
    String stuName0 = "王云";

    String stuName1 = new String("王云");

    char[] charArray = {'刘','静','涛'};

    String stuName2 = new String(charArray);

    String stuName3 = new String(charArray,1,2);//从'静'字开始,截取2个字符,结果是“静涛”

    在实际编程过程中,需要在一个字符串后面增加一些内容, String类提供了一个concat(String str)的方法,可以在String类字符串后面增加字符串。

    class TestString2 
    {
        public static void main(String[] args) 
        {
            String stuName1 = new String("王云");
            stuName1.concat("同学");
            System.out.println(stuName1);//输出结果是“王云”,而不是“王云同学”
        }
    }
    字符串的值在创建之后不能更改。concat(String str)方法的输出是,创建了一个新String字符串,用来存stuName1字符串加上“同学”的结果,而不是在原来stuName1字符串的后面增加内容,对于stuName1而言,它是常量,内容并没有变化。所以,如果想输出“王云同学”,可以将stuName1.concat(“同学”)表达式的结果赋给一个新的字符串,然后再输出该字符串即可。

    class TestString3 {
        public static void main(String[] args) {
            String stuName1 = new String("王云");
            System.out.println(stuName1);//王云
            stuName1 = "刘静涛";
            System.out.println(stuName1);//刘静涛
        }
    }
    不是说String字符串是不可变的常量吗?怎么两次输出stuName1,却发生变化了呢?究其原因,主要是这里说的不可变是指在堆内存中创建出来的String字符串不可变。事实上,stuName1 = “刘静涛”;语句已经新创建了一个String字符串,并让stuName1指向了这个新的String字符串,原来存放“王云”的这个String字符串没有发生变化。

    String类的使用
    连接字符串
    采用public String concat(String str)方法连接字符串。事实上,采用最多的方法是使用“+”进行String字符串连接.

    public class TestStringConcat {
        public static void main(String[] args) {
            //使用"+"进行字符串连接
            String s1 = "您好";
            s1 = s1 + ",蒋老师!";//创建一个新字符串用来连接两个字符串,并让s1指向这个新字符串
            System.out.println(s1);//您好,蒋老师!
            
            //使用public String concat(String str)方法连接
            String s2 = "您好";
            //创建一个新字符串用来连接两个字符串,但没有变量指向这个新字符串
            s2.concat(",田老师!");
            //创建一个新字符串用来连接两个字符串,并让s3指向这个新字符串
            String s3 = s2.concat(",田老师!");
            System.out.println(s2);//您好
            System.out.println(s3);//您好,田老师!
        }
    }

    比较字符串
    比较字符串常用的两个方法是运算符“==”和String类的equals方法。

    使用“==”比较两个字符串,是比较两个对象的地址是否一致,本质上就是判断两个变量是否指向同一个对象,如果是则返回true,否则返回false。

    而String类的equals方法则是比较两个String字符串的内容是否一致,返回值也是一个布尔类型。

    public class TestStringEquals {
        public static void main(String[] args) {
            String s1 = "Java基础";
            String s2 = "Java基础";
            System.out.println(s1 == s2);     //返回true
            System.out.println(s1.equals(s2));//返回true
            String s3 = new String("前端技术");
            String s4 = new String("前端技术");
            System.out.println(s3 == s4);     //返回false
            System.out.println(s3.equals(s4));//返回true
        }
    }
     

    展开全文
  • 以下方法都是java内置类String类的内置方法(不是构造方法哦,就是普通的方法),不需要我们写,直接拿过来用即可。 substring方法对应Api介绍 查找字符串中的 从int beginIndex及其以后的字符串:...

    以下方法都是java内置类String类的内置方法(不是构造方法哦,就是普通的方法),不需要我们写,直接拿过来用即可。

     

    substring方法对应Api介绍

     

     

    查找字符串中的 从int beginIndex及其以后的字符串:substring(int beginIndex)

    public class Demo {
        public static void main(String[] args)  {
            String Str="MyNameIsDsh";
            String substr=Str.substring(8);//截取字符串Str第8位之后的字符
            System.out.println("截取后的新字符串是:"+substr);
        }
    }

    截取后的新字符串是:Dsh

     

     

    查找字符串中的 从int beginIndex-int endIndex之间的字符串:substring(int beginIndex,int endIndex)

    public class Demo {
        public static void main(String[] args)  {
            String Str="MyNameIsDsh";
            String substr=Str.substring(8,10);//截取字符串Str第8-10位之间的字符串
            System.out.println("截取后的新字符串是:"+substr);
        }
    }

    截取后的新字符串是:Ds

     

     

    如果超出查找字符串本身长度核报异常:String index out of range

    转载于:https://www.cnblogs.com/dshvv/p/5096850.html

    展开全文
  • String到底在内存中是如何存储

    千次阅读 2018-03-19 11:49:00
    String会出现在哪些地方 方法局部string 类内字段String static string 容器中存储string String数组 那么String位置会影响其...以下来自String类 源码,一些无关紧要实现被我省略了: private fina...

    String会出现在哪些地方

    • 方法内的局部string
    • 类内的字段String
    • static string
    • 容器中存储的string
    • String数组
      那么String的位置会影响其存储方式吗?
      显然是不会的,类永远只会储存在堆上。
      但是实际上类的字段并不是一直在堆上的。

    String的构造方法

    以下来自String类 源码,一些无关紧要的实现被我省略了:

     private final char value[];
        private int hash; // Default to 0
        private static final long serialVersionUID = -6849794470754667710L;
        private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];
       public String() {
            this.value = "".value;
        }
      public String(String original) {
            this.value = original.value;//底层char[]指向了同一位置!
            this.hash = original.hash;
        }
        public String(char value[]) {
            this.value = Arrays.copyOf(value, value.length);//底层char[]指向不同位置!下面的截取也是如此
        }
        public String(char value[], int offset, int count) { ... }
    
        public String(int[] codePoints, int offset, int count) {...}
    
        public String(byte ascii[], int hibyte, int offset, int count) {...}
    
        public String(byte ascii[], int hibyte) {...}

    我们可以发现String的构造器并不关注是否将char[]指向同一位置,之所以有一些没有指向同一位置完全是为了保证char[]是immutable的。
    这并不能说明调用构造器构造的String的内存位置有什么特别之处。

    String另一种构造方式--为包装类型提供的专有构造方式

    运行如下代码:

    class StringPointerTest{
        String g="gh",h="gh";
    }
    public class StringTest {
        public static void main(String[] args) {
            String a="abc";
            String b="abc";
            System.out.println(a==b);//true使用简写的构造能够复用创建的string类
            String c=new String("abc");
            System.out.println(a==c);//false是用构造器则不能
            String d=new String("def");
            String e="def";
            System.out.println(d==e);//false即使先构造器再使用简化构造也不行。
            StringPointerTest spt=new StringPointerTest();
            System.out.println(spt.g==spt.h); //true与String的属于方法局部变量还是类字段也无关
        }
    }
    class IntegerPointTest1{
        Integer a=1;
    
    }
    class IntegerPointTest2{
        Integer b=1;
    }
    public class IntegerTest {
        public static void main(String[] args) {
           System.out.println(new IntegerPointTest1().a==new IntegerPointTest2().b);//true!
        }
    }

    原理

    需要存储的代码元素有:

    • Class类文件
    • 方法,类的所以实例应该共用一段方法
    • static字段
    • 字符串常量
    • 值常量
    • 类实例
    • 各种引用
    • 基本变量
      他们各自有各自的存储位置,方法内的引用存在方法栈,类内的引用存在堆,类存储在堆上,方法中的局部基本变量存于栈但是类字段的基本变量存在堆上(方法区内)。
      值得一提的是方法区(又叫静态区),其存储值常量、字符串常量、方法、静态字段、.class文件,等只用一个备份的数据。
      栈和方法区都有共享数据的功能。
      因此使用简化方法构造String类的时候,在方法内和类内会将字符串存于栈/方法区,这无关紧要,重要的是,
      使用这种构造方法,如果没有所构造的字符串常量存在于内存中,那么会在栈/方法区中存上一份,然后再堆中新建一个String类,把String类的char[]引用指向在栈/方法区中的字符串常量;
      如果所构造的字符串常量已经存在于内存中,那么则会检索关联与之对应的堆中String实例,并直接使用这个String类实例。
      只有使用简化方法构造才能被栈/方法区记录下来,如果使用new则不行,这也是为什么上例即使先new,再使用简化构造相同字符串也不会引用相同。
      因为new出来的String实例的字符串常量存储在堆上,和栈/方法区无关。

    拓展到所有包装类型---可以吗?

    完全不可以。
    他们都没有像String那样实现缓存。
    但是实现了类似的缓存,它们的自动包装机制也提供缓存功能,
    但是是基于valueof方法的,该方法会对一定范围内进行缓存。
    而且实现方式非常暴力,是在对应类里存一个静态的类数组,并静态初始化全部填充。

    可以缓存的范围:
    byte Byte -128–127
    short Short -128–127
    int Integer -128—127
    long Long -128—127
    char Character 0–127
    boolean Boolean TURE,FALSE
    String
    不缓存的:
    float Float
    double Double

    可见不是所有的自动包装机制都实现了全缓存。

    展开全文
  • 16~标准C++ 接口string类

    2019-04-21 10:50:16
    一、 string 是C++ 标准库提供的字符串方法,它不是STL的一部分...使用类的关键是要知道它的公有接口(私有部分无法访问),以下代码以及文本表述都是针对string 的公有接口(public) 部分 1、string 的构造函数 丰...
  • 以下方法都是java内置类String类的内置方法(不是构造方法哦,就是普通的方法),不需要我们写,直接拿过来用即可。 indexOf方法对应Api介绍 lastIndexOf方法对应Api介绍 --------------indexOf方法对应Api...
  • 要想使用标准C++中string类,必须要包含#include <string>// 注意是<string>,不是<string>,带.h的是C语言中的头文件。Char * 专门用于指以’\0’为结束的字符串. 以下方法来进行转换: // CharConvert.cpp : 定义...
  • c++ string 常用方法

    2016-09-16 20:12:18
    要想使用标准C++中string类,必须要包含 #include // 注意是,不是,带.h的是C语言中的头文件 using std::string; using std::wstring; 或 using namespace std; 下面你就可以使用string/wstring了,它们两...
  • * (2)判断该数字字符串数组中数字字符串是否是对称(第一个数字和最后一个数字相等,第二个数字和倒数第二个数字是相等,依次推),并逐个输出 * (3)如:010 是对称,3223 是对称,123123 不是
  • 首先解释下三者的含义CString 是一种很有用的数据类型。...要想使用标准C++中string类,必须要包含#include // 注意是,不是,带.h的是C语言中的头文件。Char * 专门用于指以'\0'为结束的字符串.以下方法来进行...
  • 以下针对引用数据类型:在内存中,类是静态的概念,它存在于内存中的CodeSegment中。...但是同一个类的对象和对象之间并不是没有联系的,看下面的例子:1 classStudent{2 staticString schoolName;3 String name;4 ...
  • Java中,对象,方法的内存分配

    千次阅读 2017-06-09 10:22:01
    重新理解类,对象,内存分配以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的Code...但是同一个类的对象和对象之间并不是没有联系的,看下面的例子:class Student{ static String schoolName;
  • 方法的重载

    2017-08-09 15:00:35
    方法的重载:方法的名字相同,但参数的个数或类型不一样。在调用方法时程序根据参数的情况自动识别应该调用哪个方法。方法的重载是多态的一种情况。...//但要特别注意以下这种情况不是方法的重载: public
  • java中String相关面试题

    2021-02-25 10:10:23
    1.String 表示字符串类型,属于引用数据类型,不是基本数据类型。 2,.在java中用“”扩起来的都是String对象,例如“hello world”,“ABCD”。 3.java中规定用字符串括起来的字符串是不可变的,也...关于string类的
  • 大家都应该了解以下几点: 1、在java中字符串是一个 final 类型的类,也就是说它不可以被继承 2、一旦一个字符串对象被创建,那么这个字符串长度,串内某个字符都是固定。字符串中如求子串,替换字符串等...
  • 我创建的是Child对象,而它有父类的方法,且可以返回父类中定义的变量。 那Child继承Father,是不是相当于JVM加载时,保存的信息中不仅仅是Child的信息,还包括Father的那些对子可见的信息? 比如,其实JVM...
  • 1:在泛型和泛型方法中产生一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型。 如果 T 为值类型,则它是数值还是结构。 给定参数化类型 T 一个变量 t...
  • 最近老是有小伙伴问类和Object相关的问题,感觉还是很多人对此不是很明白,...以下类的定义:public class User {//私有属性private Long userId;private String name;private Integer age;// 构造方法public User...
  • JavaScript 在 1997 年被标准化时,就有 6 种数据类型,直到 ES6 出现之前,程序中变量一定是以下 6 种数据类型之一:  Undefined  Null  Boolean  Number  String  Object 每种数据类型都是一系列值组合...
  • JVM中翻译字符串常量池(StringTable)为“String类型常量表”更合适,常量表它存储以双引号包住String对象地址引用,而不是String对象本身。通过StringTable可以实现相同内容字符串共享。 在Java 8,String...
  • 以下针对引用数据类型:  在内存中,类是静态的概念,它存在于内存中的CodeSegment中。...但是同一个类的对象和对象之间并不是没有联系的,看下面的例子:   class Student{ static String schoolName; Strin...
  • 以下类的定义: public class User { //私有属性 private Long userId; private String name; private Integer age; // 构造方法 public User() { } //有残构造方法 public User(Long userId, Strin
  • java基本类型数据的包装及装箱...包装主要提供了一系列的方法,因为集合不允许存放基本类型数据,存放数字时,要使用包装类型。 String不是基本数据类型。 以下是基本数据类型和其对应的包装 基本数据类型 ...
  • 最近老是有小伙伴问类和Object相关的问题,感觉还是很多人对此不是很明白,...以下类的定义:public class User {//私有属性private Long userId;private String name;private Integer age;// 构造方法public User...
  • Java中clone方法的使用

    2013-09-09 21:49:39
    Java语言取消了指针概念,导致了许多程序员在编程...比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子: Java代码  1. public class A {  2. public String name; 
  • 泛型,即“参数化类型”,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在、接口和方法的创建中,分别称为泛型、泛型接口、泛型方法。 泛型时jdk 1.5 ...
  • 我想把得到结果Student直接传出去,再用get方法调用,而不是先取出Student中数据再传递数据。 所以我直接把得到Student作为属性值添加进了request。 ``` request.setCharacterEncoding("utf-8"); int...
  • //建立自己新建的类的对象my1 if(my1.exec()==QDialog::Accepted) //利用Accepted 信号判 断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else ...
  • 下列关于基本类型和包装类的叙述中错误的是(多选)B C A. Java中的数据类型包括基本数据类型和引用类型 B. Byte是基本数据类型 C. 基本数据类型可以调用方法 D. 每个基本数据类型都有对应的包装类 Double 类,Math...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 209
精华内容 83
关键字:

以下不是string类的方法的是