`
Supanccy2013
  • 浏览: 224013 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java中String类型深度解析

    博客分类:
  • java
阅读更多
   java虚拟机中有两种内存区域:堆内存、占内存。
   栈内存主要保存以下内容:基本数据类型和对象的引用。
   堆内存存储对象,栈内存的速度要快于堆内存。
   总结成一句话就是:引用在栈而对象在堆


  String类的本质是字符数组char[],其次String类是final的,是不可被继承的,String是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。还有一个String池的概念,Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。String池不属于堆和栈,而是属于常量池。
  所以:通知直接赋值例如:String str1 = "chenchaoyang" 就是先在string池中寻找chenchaoyang,有则返回,没有则创建。而通过new创建就是重新在堆区创建了一个新的对象

   == 比较的是引用对象的内存地址(堆内存对象的地址)
   当调用 intern 方法时,如果string常量池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定), 则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
   String的直接赋值,先检查池中是否有生成的对象,如果有就直接指向
   String 是字符串常量。是不可改变对象。如果使用str+ = “hello”的形式,其实是先通过new StringBuffer()对象,然后再进行字符串的append,然后在使用new String()的方式转化为String对象。因此效率比较的慢,而且是新开辟的对象。
   hashCode()方法是返回字符串内容的哈希码,既然内容相同,哈希码必然相同,那他们就相等了,这个容易理解。所以不管是string常量池中的还是堆中的只要内容相同hashCode都是相同的。

实例:
   	   public void testString(){
		   String s1 = "hello";
		   String s2 = "hello";
		   String s3 = new String("hello");
		   String s4 = s3.intern();
		   System.out.println(s1.equals(s2));
		   System.out.println(s1.equals(s3));
		   System.out.println(s1 == (s3));
		   System.out.println(s1 == s2);
		   System.out.println(s1 == s4);
		   System.out.println(s2 == s4);
		   System.out.println(s1.hashCode() == s3.hashCode());
	   }

输出:
true
true
false
true
true
true
true

String的equals源码:
  public boolean equals(Object anObject)
{
       //如果是同一个对象
        if (this == anObject)
        {
            return true;
        }
        //如果传递进来的参数是String类的实例
        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++]) 
                        return false;
                }
                return true;
            }
        }
        return false;
}


HashCode方法源码:
   private final char value[];//定义一个字符数组value,用于存储字符串里面的字符  
   private final int offset;//定义offset变量表示字符串第一个字符的下标索引  
   private final int count;//定义count变量表示字符串中字符的个数    
   private int hash; // Default to 0,默认值为0  
	 public int hashCode() {  
	        int h = hash;  
	        if (h == 0 && count > 0) {  
	            int off = offset;  
	            char val[] = value;  
	            int len = count;   
	            for (int i = 0; i < len; i++) {  
	                h = 31*h + val[off++];  
	            }  
	            hash = h;  
	        }  
	        return h;  
    }  






 
分享到:
评论

相关推荐

    java内存分配和String类型的深度解析Java开发J

    接下来,我们转向String类型的深度解析。String在Java中被广泛使用,它具有不可变性,意味着一旦创建,其值就不能改变。这是为了保证线程安全和提高性能。String对象有两种创建方式:字面量(如`"hello"`)和`new ...

    Java内存分配和String类型的深度解析

     在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是本文将要涉及到的一些问题,...

    Java中常见异常类型及分析.pdf

    ### Java中常见异常类型及分析 #### 一、概述 在Java编程中,异常处理是一项重要的技术,它有助于开发者在程序运行过程中及时发现并处理错误,确保程序的稳定性和健壮性。Java语言中提供了丰富的异常处理机制,...

    java深度解析xml

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在软件开发、网络传输、数据存储等领域。...通过上述步骤,我们可以深入理解和应用DOM4J解析XML的精髓,为Java项目中的XML处理提供强大支持。

    迭代大师的修炼之道:Java中Iterator与增强for循环的深度解析

    ### 迭代大师的修炼之道:Java中Iterator与Enhanced for loop的深度解析 #### 一、引言 在Java编程的世界里,迭代是处理集合数据的重要手段之一。本文将重点探讨两种常用的迭代方式——`Iterator`接口和`Enhanced ...

    静态的魔力:Java中静态方法和变量的深度解析

    ### 静态的魔力:Java中静态方法和变量的深度解析 #### 一、引言 Java作为一门强大的编程语言,在软件开发领域占据着举足轻重的地位。其面向对象的特性、跨平台的能力以及强大的标准库,使得Java成为开发企业级...

    探索Java EE的企业心脏:EJB的深度解析

    # 探索Java EE的企业心脏:EJB的深度解析 Java是一种广泛应用的编程语言,它由Sun Microsystems公司在1995年首次推出,后被Oracle公司收购。Java的设计初衷是面向对象,具备跨平台性、网络编程能力、健壮性、安全性...

    Java方法的艺术:重载与重写的深度解析

    ### Java 方法的艺术:重载与重写的深度解析 在 Java 编程语言中,方法的重载(Overloading)和重写(Overriding)是面向对象编程的重要概念。这两种技术使得方法能够在不同的上下文中表现出不同的行为,从而增强了...

    深度解析Java中的5个“黑魔法”完整源代码

    在Java编程语言中,有些独特的特性或技巧常常被开发者戏称为“黑魔法”,因为它们可能在初学...以上就是Java中的五个“黑魔法”知识点的详细解析和示例代码。理解并熟练掌握这些特性,将使你的Java编程技能更上一层楼。

    Apache的java解析sql工具包

    它提供了丰富的API,允许开发者对SQL语句进行深度解析,如访问查询中的表名、列名、条件表达式等元素。通过这些API,我们可以构建复杂的SQL操作逻辑,例如动态生成SQL、修改SQL结构或者提取查询信息。 使用...

    java解析Pcap文件获取五元组(可执行)

    本教程将深入探讨如何使用Java解析Pcap文件,以提取其中的五元组信息。 五元组是网络数据包分析中的基本概念,它由源IP地址、目的IP地址、源端口号、目的端口号和传输层协议(通常是TCP或UDP)组成。这五个元素唯一...

    探索Java数据库连接的奥秘:JDBC的深度解析与实践

    ### 探索Java数据库连接的奥秘:JDBC的深度解析与实践 #### Java的特点及其在数据库连接中的作用 Java作为一种强大的编程语言,在其发展过程中不断优化和改进,旨在为开发者提供一个高效、灵活且安全的开发环境。...

    Java抽象类和接口的深度解析.pptx.pptx

    接口则是Java中另一种抽象类型,它仅包含抽象方法(没有方法体)和常量。接口不能包含任何实现,但可以被多个类实现。通过实现接口,类必须实现接口中定义的所有抽象方法,从而确保类遵循接口所定义的行为规范。接口...

    Java深度解析:CSDN博客x-ca-nonce与x-ca-signature生成机制.zip

    这篇深度解析将聚焦于这两个参数的生成机制,帮助开发者理解如何在Java环境中实现它们。 首先,x-ca-nonce(通常称为nonce,即“一次性的随机数”)是一种用于防止重放攻击的安全措施。在每次请求时,服务器会生成...

    Java异常处理的四大金刚:try、catch、finally和throw的深度解析

    ### Java异常处理的四大金刚:try、catch、finally和throw的深度解析 #### Java异常处理概述 异常处理机制是程序设计中的一个重要组成部分,它能够帮助程序员有效地管理程序运行过程中可能出现的各种错误情况。...

    java关于BMP位图文件解析的分析与实现[源码][附图]

    在Java编程语言中,解析BMP(Bitmap)位图文件是一项常见的图像处理任务。BMP是一种无损的图像文件格式,广泛应用于Windows操作系统和许多其他软件中。它以未经压缩的二进制形式存储图像数据,因此解析BMP文件可以...

    Java利用FFmpeg解析视频,截图,获取视频播放时间

    在Java中集成FFmpeg,可以实现对视频的深度操作,例如获取元数据、截图以及计算视频播放时间。 首先,我们要理解FFmpeg如何工作。FFmpeg通过命令行接口执行各种任务,例如转换视频格式、提取音频、调整视频质量等。...

    Spring源码解析.pdf

    - `containsBean(String name)`:判断容器中是否存在指定名称的Bean。 - `isSingleton(String name)`:判断指定Bean是否为单例模式。 ##### 2. DefaultListableBeanFactory - **功能**:作为`BeanFactory`的一个...

Global site tag (gtag.js) - Google Analytics