java中字符串String的深入浅出

算法(Java)——字符串String String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 阅读详情

大家知道我们在java中定义一个字符串是这样定义的 String str=”abc”;

然而还可以这样来定义 String str=new String(“abc”);

那么这两者的区别是什么呢?

我们先来看看代码:

String str="abc";

       String str1=new String("abc");

       System.out.println(str);

       System.out.println(str1);

 

那么运行结果毋庸置疑:

abc

abc

 

那么在这里我们要牵涉到==和equal()方法

那么我们在写一段程序

String str="abc";

       String str1=new String("abc");

       System.out.println((str==str1));

       System.out.println(str.equals(str));

那么结果是:

false

true

通过这个结果我们知道==和equals输出的结果是不一样的,那么他们到底有什么不同呢?

那么java早起版本中“==”运算符只能用来测试两个字符串是否是相同的实例,而在新的jdk版本中“==”运算符和equals的效果是一样的注意这里的效果一样是只针对字符串(String str1=”123” String str2=”wsd” 因为一般都是这样定义的!),而不是对象。

那么具体有什么不同我们等会再分析

那么我们来分析上面的代码在jvm编译器中编译器为我们做了哪些我们不知道的工作。

 

那么在解释这些问题之前你必须弄明白两个概念:堆(heap)内存和栈(Stack)内存的问题,Java语言使用内存的时候,栈内存主要保存以下内容:基本数据类型和对象的引用,而堆内存存储对象,栈内存的速度要快于堆内存。总结成一句话就是:引用在栈而对象在堆。

那么我们还要弄明白这个函数(equals())这个函数的来源和意义

1,  equals的来源 你可以查询String的api文档 你会发现在String中式存在这个方法的 那么它给出的解释是:equals(Object anObject) 将此字符串与指定的对象比较。

单看这个我们还是很迷糊 到底这个函数比较内容还是对象 下面我们可以具体在String类中是怎么去定义的:

那么我怎么去看String这个类呢?我们只需要在eclipse中对准String 按“ctrl”单击进入String中就可以了!那么我们找到equals这个方法:看到的代码如下

   publicboolean equals(Object anObject) {

    if (this == anObject) {

        returntrue;

    }

    if (anObject instanceof String) {

        String anotherString = (String)anObject;

        int n = count;

        if (n == anotherString.count) {

       char v1[] = value;

       char v2[] = anotherString.value;

       int i = offset;

       int j = anotherString.offset;

       while (n-- != 0) {

           if (v1[i++] != v2[j++])

           returnfalse;

       }

       returntrue;

        }

    }

    returnfalse;

}

 

那么我们仔细看这个方法我们可以知道在这个方法一开始是这样写的

if (this == anObject) {

        returntrue;

    } 那么它在一开始就使用了==的运算符来判断这两个对象是否相等我们可想而知如果闯入的这个object跟自己String的对象是同一个对象的话那么他们的内容当然是一样的。那么直接返回true 而下面的代码就无需再执行了。

 

当时往往要比较的是不同的两个对象那么我们在看它下面做的代码我们可以知道这个方法传进来的是一个object类型而我本身是String.equals()的调用的方法那么就需要把这个object转化为String类型:

那么instanceof 这个关键字是什么意义呢!在这里我们就简单的说一下他的意思:

它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。可以用在继承中的子类的实例是否为父类的实现

我们且不去管他的意思,

String anotherString = (String)anObject;

        int n = count;

        if (n == anotherString.count) {

       char v1[] = value;

       char v2[] = anotherString.value;

       int i = offset;

       int j = anotherString.offset;

       while (n-- != 0) {

           if (v1[i++] != v2[j++])

           returnfalse;

       }

       returntrue;

        }

那么我们从这段代码就可以看出它是在比较内容

所以说归根结底这个String的equals的这个方法是比较内容 。

那么我们追根溯源 我们在api文档中去看看String的父类是否有这个方法

结果我们发现我们在String的父类 Object中也找到这个方法

而他是这样说明的:equals(Object obj)  指示其他某个对象是否与此对象“相等”。

而我们在这里我们就知道了 原来在String类中的equals方法实际上就是重写了父类object中的equals方法 去实现了不一样的比较 我们不难看出 在object中equals的方法是用来比较两个对象是否相等,而在String中的equals这个方法是比较内容是否相等 而==也是比较两个对象是否相等 那么我们就解释了为什么:

tring str="abc";

       String str1=new String("abc");

       System.out.println((str==str1));

       System.out.println(str.equals(str));

那么结果是:

false

true

的输出结果是不相等的了!

下面我们来深入这个问题 看下面的代码:

        String str="abc";

       String str1=new String("abc");

       String str2="abc";

       System.out.println((str==str1));

       System.out.println((str==str2));

那么它的结果是:

false

true

 

那么我们会疑问 String str="abc";  String str1=new String("abc");

这样定义的区别在于什么地方?

String类的本质是字符数组char[],其次String类是final的,是不可被继承的,这点可能被大多数人忽略,再次String是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。

栈内存

String pool

还有一个String池的概念,Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。String池不属于堆和栈,而是属于常量池。下面分析上方代码的真正含义

  1. Str的引用

    Str2的引用

    abc对象

    String str = "abc";   
  2. String str2= "abc";  

对于以上的两句代码 编译器做了什么:

 

第一句的真正含义是在String池中创建一个对象”abc”,然后引用时str指向池中的对象”abc”。第二句执行时,因为”abc”已经存在于String池了,所以不再创建,则str==str2返回true就明白了。Str2==”abc”肯定正确了,在String池中只有一个”abc”,而str和str2都指向池中的”abc”,就是这个道理。

堆内存

栈内存

String pool

abc对象

Str1的引用

 

下面我们在来看这句话

对象(abc)

String str1=new String("abc");

 

其实这句话可以分解

String str1=new String();

Str1=”abc”;

 

 

 

 

单独这句话创建了2个String对象,一个是String池中创建了一个abc对象 在堆内存中创建了一个abc对象。

 

         而基于上面两句,只在栈内存创建str1引用,在堆内存上创建一个String对象,内容是”abc”,而str2指向堆内存对象的首地址。

String str="abc";

       String str2="abc";

String str1=new String("abc");

对象(abc)

堆内存

abc对象

String pool

栈内存

Str的引用

Str2的引用

Str1

 

 

 

 

 

 

 

 

 


因为编译器在创建String常量字符串的时候 会判断在池中是否存在这个常量字符串 如果存在的话 也就不在创建了!

 

下面就是str1==”abc”的问题了,显然不对,”abc”是位于String池中的对象,而str2指向的是堆内存的String对象,==判断的是地址,肯定不等了。

str1.equals(str2),这个是对的,前面说过,String类的equals重写了Object类的equals()方法,实际就是判断内容是否相同了。

 

 

既然说到这里 我们就往下在说说 String的intern()方法大家可以查询api文档 它是这么说的 intern()   返回字符串对象的规范化表示形式。那么我们怎么来理解这句话呢?百度,google 实际上过程是这样进行的:该方法现在String池中查找是否存在一个对象,存在了就返回String池中对象的引用。如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。

 

那么我看以下的代码

  1. String str1 = "a";    
  2. String str2 = "bc";    
  3. String str3 = "a"+"bc";    
  4. String str4 = str1+str2;    
  5.       
  6. System.out.println(str3==str4);    
  7. str4 = (str1+str2).intern();    
  8. System.out.println(str3==str4);

一个初始时为空的字符串池,它由类 String 私有地维护当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 §3.10.5 中已定义。

他么它返回的是什么呢!从哪里来呢?它返回一个字符串,内容与此字符串相同,但它保证来自字符串池中的。

 

字符串对象的创建方式有两种

String s1 = new String("");   //第一种

String s2 = "";               //第二种

第一种始终不会入池的.

第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)

String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.

String s4 = s1 + "b";   //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.

一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.

例如:

String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.

 

String str ="a"+"b"完全等同于String str="ab";

 

下面有个网上的例子:

public class Mud {   

    public static String hello(String[] strs, String s2) {   

        strs[0] = "<" + strs[0] + ">";   

        s2.toUpperCase();   

        return s2;   

    }   

    /**  

     * @param args  

     */  

    public static void main(String... args) {   

        String a = new String("t");   

        String[] b = new String[] { "t" };   

        String c = a.intern();   

        if (a.equals(b[0])) {   

            System.out.print("1");   

        }   

        if (b[0] == c) {   

            System.out.print("2");   

        }   

        if (a == c) {   

            System.out.print("3");   

        }   

        a = hello(b, c);   

        System.out.print(a);   

        System.out.print(b[0]);   

        System.out.print(c);   

    }   

}

那么它的结果是:12t<t>t

大家可以分析分析!来夯实基础吧!

 

下面我们来讲一讲hashcode的这个东西!我们翻看了api文档 他是这么说的:

hashCode()
          返回该对象的哈希码值。那么我们要知道什么事哈希吗呢?

我们首先看了object的文档中hashcode:

hashCode

public int hashCode()

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

·         在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

·         如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

·         如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:

此对象的一个哈希码值。

这么一大堆文字到底告诉了我们什么呢?那么我们主要看红色字的意思 也就是说 两个对象是相等的,那么两个对象的hashcode返回的值一定是相等的,如果两个对象不是相同的对象 那么它说不要求hashcode生成不同的结果 那么就是说存在允许两个不同对象生成相同的hashcode 那么为什么呢!为什么是这样定义的呢!如果你知道hash是根据一个算法来的 散列表 是存在相同的可能性的!这里就不在细细的为大家讲解了!
由上述的结论我们来看下面的代码以及执行的结果:

       StringTest a=new StringTest();

       StringTest b=new StringTest();

       System.out.println(a.hashCode());

       System.out.println(b.hashCode());

       System.out.println((a.hashCode()==b.hashCode()));

结果:

12677476

33263331

False

 

 

 

那么这里的运行结果是符合上述所说的原理的!两个不同对象的hashcode是不同的输出了false

 下面我们在来看以下的代码:

        String str="abc";

       String str2="abc";

       String str1=new String("abc");

       System.out.println(str.hashCode());

       System.out.println(str2.hashCode());

       System.out.println(str1.hashCode());

       System.out.println((str.hashCode()==str2.hashCode()));

       System.out.println((str.hashCode()==str1.hashCode()));

       System.out.println((str1.hashCode()==str2.hashCode()));

 

结果:

96354

96354

96354

true

true

true

 

大家看到这个结果我们应该怎么解释呢?为什么都是一样的 在前面我们已经知道了一些知识,所以str和str2指向的是常量池里的一个对象 所以他们的hashcode相等 我们可以理解 但是 str和str1 以及str2和str1分明指向的不是一个对象啊!为什么会出现相w同的hashcode呢?难道是api文档中所学的可能性么?那么你们可以在程序中多次尝试 如果你尝试了 你就会发现 事实上当我们尝试了很多次以后我们发现他们的hashcode还是相等的 为什么呢?

那么我们再次来查询api文档,我们知道了object中存在了这种方法 那么我们的祖先都存在这种方法  那么我们会发问为它的后代是不是也会继承这种方法或是会重写了这种方法呢?

我们上面的程序是针对String来调用hashcode来操作的 我们就自爱api中查询String这个类吧!

查询之后我们会惊喜的发现 String中定义了一个hashcode方法 这说明什么呢?这说String这个类没有继承祖先的hashcode方法 而是在祖先的基础上“青出于蓝而胜于蓝”自己定义了(重写)了这个方法 他们它就不是和祖先的方法的思想一样了 而是有自己的定义和自己的思想!

它是这样定义的:  hashCode()
          返回此字符串的哈希码。

那么我们进入深度定义:

public int hashCode()

返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:

 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 

使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

覆盖:

类 Object 中的 hashCode

返回:

此对象的哈希码值。

另请参见:

Object.equals(java.lang.Object), Hashtable

???我们会发现Stiing中的hashcode的方法的实现和object中的完全不一样 他是根据一个算法来计算出来的数值。它是根据字符串来算出的 注意这里的字符串!

那么我们就不能理解了看一下代码:

       String str="abc";

       String str2="abc";

       String str1=new String("abc");

      

       System.out.println(str);

       System.out.println(str2);

       System.out.println(str1);

       System.out.println(str.hashCode());

       System.out.println(str2.hashCode());

       System.out.println(str1.hashCode());

      

       StringTest a=new StringTest();

       StringTest b=new StringTest();

      

       System.out.println(a.toString());

       System.out.println(b.toString());

       System.out.println(a.hashCode());

       System.out.println(b.hashCode());

他们结果是:

abc

abc

abc

96354

96354

96354

test.StringTest@c17164

test.StringTest@1fb8ee3

12677476

33263331

对于字符串类型来说他们的String的字符串值都是“abc”所以他们调用的是String.hashCode()的根据字符串算出的哈希值

 

所以他们是一样的而大家要注意

System.out.println(a.toString());

       System.out.println(b.toString());

        System.out.println(a.hashCode());

       System.out.println(b.hashCode());

红色的部分其实在这里是没有说明作用的 因为绿色的的部分的hashcode()方法不是String的方法 而是object的 所以其实他们不是根据String的实现思想来得到哈希值的 所以在一度程度上a的哈希值是有机率等于b的哈希值的!

所以哈希值相等 对象就是同一个对象 这句话是有歧义的 我们应该说object的hashcode()得到的哈希值相等,基本上可以说是同一个对象(也存在几率) 这里这样说是因为String的hashcode的计算方式和object的计算方式是不一样的!

其实到底有什么不一样我们只能看到表面而java中是怎样具体规定的 我们不得其知!

深入api文档中的继承、接口 重写 重构、多态的定义和意义!又便于我们分析问题!快速得到答案!

 

 

在实际应用中,经常要对字符串做某些操作,比如字符串的拼接。下面代码演示了关于字符串拼接的过程。

  String s4 = "hello";

  String s5 = "world";

  String s6 = s4 + s5;

  为了得到s6,对s4和s5做了拼接,结果不仅在strings pool里生成了内容分别为hello和world的两个对象,又在堆里生成了一个新的对象,它的内容为helloworld,这个新对象不会在constant table中保存引用,但在我们的代码里,用s6来引用它。拼接后的两个对象(s4和s5),如果不重用,就没有存在的必要了,但是Java仍然要在 constant table 中维护它们的引用,它们在堆里也要占用空间,系统开销就出现了,而当strings pool里的此类对象过多时,必然要影响程序的性能。这还有一个问题,执行下面的代码

  s4=null;

  s5=null;

  这样gc是否会回收s4和s5引用的对象呢?当然不能,因为在constant table中还保留一个我们看不到的对这两个对象的引用,所以gc无能为力了。

为了解决"垃圾"对象泛滥的问题,我们需要一个可变的字符串对象,操作该对象而不导致新的对象产生,只是让该对象做些适当的改变而已。StringBuffer类就这样应运而生了。

至此!谢谢 !

java深入浅出 本书适合于java初学者学习;书中详细了介绍了java相关概念以及如何去学习java这门语言 立即下载

相关推荐

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 265

java String

大家知道我们在java中定义一个字符串是这样定义的 String str=”abc”; 然而还可以这样来定义 String str=new String(“abc”); 那么这两者的区别是什么呢? 我们先来看看代码: String str="abc"; String str1=new String("abc"); System.out.println(str); System.out

u013758961的专栏 507

RC电路(一):微分|积分

的取值不同,会导致输出波形和输入波形之间的关系也不同,由此也会产生不同的应用。输出为0,随着电容充满电,运放-输入端得到的分压为正最大值,可等效成一个电压源,且电压不可突变,此时电流反向为最大值,开始充电时的容抗为0,电压不可突变则电压差为0,运放。开始充电时的容抗为0,电压不可突变则电压差为0,运放。输入端得到的分压也不可突变,随着电容放完电,于是。,因电容上电压不能突变(来不及充电,相当于短路,由上分析可得积分运算电路中,输出为运放的负最大峰值,随着电容充满电,输出为运放的正最大峰值,随着电容放完电,

既有随处可栖的江湖,也有追风逐梦的骁勇! 1万+

Java基础 学习笔记6

1.Java中的字符串 在 Java 中,字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中。默认情况下,该包被自动导入所有的程序。 创建 String 对象的方法: 2.Java中字符串的不变性 String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。如下所示: 运行结果: 注意点: a.通过 Str...

weixin_43684054的博客 322

具有I2S输出的多模数字麦克风ICS-43434咪头LR引脚接地或电源WS接LRCLK

ICS-43434 是一款数字 IS 输出底部收音孔麦克风。完整的 ICS-43434 解决方案包括 MEMS 传感器、信号调理、模数转换器、抽取和抗混叠滤波器、电源管理以及行业标准的 24 位 12S 接口。12S 接口允许 ICS-43434 直接连接到数字处理器,例如 DSP 和微控制器,而无需系统中的音频编解码器。

易板 5665

Android逆向分析

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。Android应用 Java编写的,利用Android SDK编译代码,并并且把所有的数据和资源文件打包成一个APK(Android Package)文件这是一个后缀名为.apk的压缩文件,apk文件中包含了一个Anddroid应用程序的所有内容,是Android平台用于安装应用程序的文件。

qq_51598534的博客 6294

JNI中java类型的简写

在JNI中,当我们使用GetFieldID/GetStaticFieldID或GetMethodID/GetStaticMethodID及定义JNINativeMethod等时,我们需要表示成员变量的类型,或函数传入参数或返回的类型。JNI把Field的类型,或函数传入参数或返回值的类型进行简写以char*的形式进行表示。 对于成员变量,直接用java类型的简写表示成员变量的类型就可以 比

Robin Hu的专栏 2958

利用 Openocd 和 FT2232H 实现 ARMv8(Coretex-A53)高效调试方案

本文详细介绍了如何利用开源工具OpenOCD与高性能USB转接芯片FT2232H,构建一套针对ARMv8架构(如Cortex-A53)的高效、低成本调试方案。内容涵盖从环境搭建、驱动配置、核心调试架构解析到实战问题排查的全过程,帮助开发者实现对多核处理器的透明、可控调试,是嵌入式Linux及底层开发的实用指南。

weixin_29163581的博客 280

String类常用方法

个人笔记,仅供参考

Muskok的博客 1006

第十一届全国大学生GIS应用技能大赛——广西区域发展布局示意图

我们需要制作一幅广西区域发展布局示意图,最终成图参考“数据”文件夹中的广西区域发展布局示意图.png。地图使用的投影坐标系是 Asia_North_Albers_Equal_Area_Conic,其中地理坐标系是China_Geodetic_Coordinate_System_2000,中央经线东经 105°,标准纬线是北纬 25°和北纬 47°,出图比例尺 1:4,780,000。

@HNUSTer的博客 7800

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8368

String类

String类 描述 String 类描述的是文本字符序列,同时 String 类被 final 关键字所修饰,意味着 String 类不能够继承,而且它的成员方法默认是 final 方法,所以当字符串一旦被创建就无法被修改。 String str1 = "小明"; String str2 = new String("小明"); 比较这两条语句: 第一条 第一条语句会检查字符串常量池中是否存有“小...

weixin_43932553的博客 1002

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 1万+

java之string类用法详解

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓String 类,做好准备了么,那么开始吧 🌲🌲🐴🐴

weixin_62275996的博客 1122

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java 字符串

Java 字符串 Java 中有两大数据类型:一个是基本数据类型,另一个是引用数据类型。 字符串(String)便属于引用数据类型。字符串在 Java 程序中无处不在,其实我们在第一个 Java 程序中就已经使用过了字符串,打印语句中双引号中的Hello World就是一个字符串:System.out.println("Hello World"); 本文我们将介绍字符串的基础知识,告诉你如何创建一个字符串,也会讲到 Java 13支持的多行字符串的创建方法和注意事项,还会介绍很常用的字符串的连接操作,最后我

雨易辰木的博客 1118

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java基础之String类 总结

1】最多人使用的一个方法,直观,方便,但效率很低(后来跟主管讨论说不让使用第一种,原因是==和equals比根本上的不同,一个是比较内存地址一个是比较内容,如果在使用云服务和搭建集群的时候有可能会出问题,虽然性能上会差几ms,但还是让使用第一种,第四种适合简单一般的比较)replace(intstart,intend,Stringstr)使用给定String中的字符替换此序列的子字符串中的字符。//2.使用Double.valueOf()方法。可变的字符序列,线程安全的,效率低。...

m0_57140509的博客 251

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java】字符串

参考书籍资料:《零基础学Java》——明日科技 编著 部分内容来自百度百科 文章目录1. String 类1.1 声明字符串1.2 创建字符串2. 字符串的连接2.1 连接字符串2.2 连接其他数据类型3. 提取字符串信息3.1 获取字符串长度3.2 获取指定位置的字符3.3 获取子字符串索引位置3.4 判断字符串首尾内容3.4.1 startsWith(String prefix) 方法3.4.2 endsWith(String suffix) 方法3.5 获取字符数组3.6 判断子字符串是否存在4..

Nebula的博客 336

Java-常用API-String类

1.API 1.1API概述【理解】 什么是API ​ API (Application Programming Interface) :应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。 1.2如何使用API帮助文档【应用】 2.String类 2.1String类概述【理解】 ​ String 类代表字符串,

L1ak的博客 208

(转)java string的==操作

初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉但是发现很多困惑和疑问而且均来自于最基础的知识折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟大家先来看看一段奇怪的程序:public class TestString {    public static void main(String[] args) {        String s1 = "Monday";...

凤凰涅磐 126

java中的String类常量池详解

test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[] args){ String a = "a1"; String b = "a"+ 1; ...

weixin_30924087的博客 116

饿猫学java——String深入浅出

String String表示字符串,所谓字符串,就是一连串的字符; String是不可变类,一旦String对象被创建,包含在对象中的字符序列(内容)是不可变的,直到对象被销毁;   常量池:JVM中一块独立的区域存放字符串常量和基本类型常量(publicstatic final)。 String使用privatefinal char value[]来实现字符串的存储,也就是说Stri

翟乃玉 1103

走进Java:String字符串的基本使用

String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表示。在Java中,String像是一个很大的char数组,我们在定义字符串的时候,不需要再去像上方代码一样去定义,而是直接可以使用String去定义。String就像是很大的char数组,但相比于char数组而言,String可以做字符串拼接操作,而char数组并不能直接去做字符串的拼接,如下代码。

2201_76027234的博客 3717

JAVA关于String字符串

可以看作是一个容器,创建之后里面的内容是可以改变的作用:提高字符串的操作效率public StringBuilder append(任意类型) //添加数据,并返回对象本身public StringBuilder reverse()//反转容器中的内容从头到尾public int length() //返回长度(字符出现的个数)public String toString()//通过toString()就可以把StringBuilder转换成String。

Darling02zjh的博客 2229

Java中的字符串String

尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下,尽量避免对String的直接修改,如果要修改建议尽量使用StringBuffer或者StringBuilder。2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。和StringBuffer的区别也是。原因是s1和s2是引用类型,使用上述表达式进行比较,比较的是两个对象的地址,两个对象是不同的,地址自然也是不同的。

cool_tao6的博客 2253

Java String字符串

Java String核心知识点摘要 String是特殊的final引用类型,不可变特性提供线程安全、哈希缓存优化。字符串常量池存储字面量,JDK7后移至堆内存。常用方法包括indexOf、substring、equals等。 StringBuilder/StringBuffer更适合频繁修改,前者线程不安全但高效,后者线程安全但较慢。StringJoiner提供简洁拼接方式。 基本类型与封装类区别在于封装类具备类特征,支持null值。自动装箱/拆箱指基本类型与包装类间的自动转换。

weixin_74894450的博客 1158
上一篇: 使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
下一篇: Java HashMap的工作原理
Java我人生
博客等级 码龄15年 2147粉丝 132原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值