Java基础知识

  • 字符串与数组
    • 1. 字符串的创建与存储的机制是什么
    • 2. “==”、equals和hashCode有什么区别
    • 3. String、StringBuffer、StringBuilder 和 StringTokenizer有什么区别
    • 4. Java数组的初始化方式有哪几种
    • 5. length属性与length()方法有什么区别

上一篇:Java基础知识(四) 基本类型与运算

字符串与数组

1. 字符串的创建与存储的机制是什么

在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况:

  1. 对于 String s1 =new String(“abe”)语句与 String s2 =new String(“abe”’)语句,存在两个引用对象s1、s2,两个内容相同的字符串对象"abe",它们在内存中的地址是不同的。只要用到 new 总会生成新的对象。
  2. 对于 String s1 ="abe"语句与 String s2 ="abe"语句,在 JVM 中存在着一个字符串池,其中保存着很多 String 对象,并且可以被共享使用,s2、s2 引用的是同一个常量池中的对象。

由于 String 的实现采用了 Flyweight 的设计模式,当创建一个字符串常量时,例如 String s =“abe”,会首先在字符串常量池中查找是否已经有相同的字符串被定义,其判断依据是 String 类equads(Object obj)方法的返回值。若已经定义,则直接获取对其的引用,此时不需要创建新的对象;若没有定义,则首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

由于 String 是不可变类,一旦创建好了就不能被修改,因此 String 对象可以被共享而且不会导致程序的混乱。

2. “==”、equals和hashCode有什么区别

  1. “ == ” 运算符用来比较两个变量的值是否相等。也就是说,该运算符用于比较变量对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能使用 “ == ”运算符。
    具体而言,如果两个变量是基本数据类型,可以直接使用“ == ”运算符来比较其对应的值是否相等。如果一个变量指向的数据是对象(引用类型),那么,此时涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如,对于赋值语句 Sting s = newString(),变量s占用一块存储空间,而 new Sitring()则存储在另外一块存储空间里,此时,变量s所对应内存中存储的数值就是对象占用的那块内存的首地址。如果要比较这两个对象的内容是否相等,那么用“ == ”运算符就无法实现了。
  2. equals 是 Object 类提供的方法之一。每一个 Java 类都继承自 Object 类,所以每一个对象都具有 equals 这个方法。Object 类中定义的 equals(Object)方法是直接使用“ == ”运算符比较的两个对象,所以在没有覆盖 equals(Object)方法的情况下,equals(Object)与“ == ”运算符一样,比较的是引用。相比 “== ”运算符,equals(Object)方法的特殊之处就在于它可以被覆盖,所以可以通过覆盖的方法让它不是比较引用而是比较数据内容,例如 String 类的 equals 方法是用于比较两个独立对象的内容是否相同,即堆中的内容是否相同。
  3. hashCode()方法是从 Object 类中继承过来的,它也用来鉴定两个对象是否相等。Object类中的 hashCade()方法返回对象在内存中地址转换成的一个 int值,所以如果没有重写 hashCode()方法,任何对象的 hashCode()方法都是不相等的。
    虽然 equals()方法也是用来判断两个对象是否相等的,但是它与 hashCode()方法是有区别的。一般来讲,equals()方法是给用户调用的,如果需要判断两个对象是否相等,可以重写equals()方法,然后在代码中调用,这样就可以判断它们是否相等了。对于 hashCode()方法,用户一般不会去调用它,例如在 hashmap 中,由于 key是不可以重复的,它在判断 key 是否重复时就判断了 hashCode()这个方法,而且也用到了 equals()方法。此处“不可以重复”指的是equals()和 hashCode()只要有一个不等就可以了。所以,hashCade()方法相当于是一个对象的编码,就好像文件中的 md5,它与 equals()方法的不同之处就在于它返回的是 int型,比较起来不直观。
    一般在覆盖 equals()方法的同时也要覆盖 hashCode()方法,否则,就会违反 Object. hashCode 的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类(HashMap、HashSet 和 Hashtable)结合在一起正常运行。
    hashCode()方法的返回值和 equals()方法的关系如下:如果 x.equals(y)返回 true,即两个对象根据 equals()方法的返回值相等,那么调用这两个对象中任意一个对象的 hashCode()方法,都必须产生同样的整数结果。如果 x.equals(y)返回 false,即两个对象根据 equals()方法比较是不相等的,那么x和y的 hashCode()方法的返回值有可能相等,也有可能不相等。

3. String、StringBuffer、StringBuilder 和 StringTokenizer有什么区别

Java 语言有 4 个类可以对字符或字符串进行操作,它们分别是 Character、String、StringBuffer 和 StringTokenizer,其中 Character 用于单个字符操作,Siring 用于字符串操作,属于不可变类,而 StringBuffer 也是用于字符串操作,不同之处是 SitringBuffer 属于可变类。

String 是不可变类,也就是说,String 对象一旦被创建,其值将不能被改变,而 StringBuffer是可变类,当对象被创建后仍然可以对其值进行修改。由于 String 是不可变类,因此适合在需要被共享的场合中使用,而当一个字符串经常需要被修改时,最好使用 StringBuffer 来实现。如果用 String 来保存一个经常被修改的字符串时,在字符串被修改时会比 StringBuffer 多很多附
加的操作,同时生成很多无用的对象,由于这些无用的对象会被垃圾回收器来回收,因此会影响程序的性能。在规模小的项目里面这个影响很小,但是在一个规模大的项目里面,这会对程序的运行效率带来很大的影响。

String 与 StringBuffer 的另外一个区别在于当实例化 String 时,可以利用构造函数(String s1=new String(“world”))的方式来对其进行初始化,也可以用赋值(String s =" Hello")的方式来初始化,而 StringBuffer 只能使用构造函数(StringBuffer s = new StringBuffer(“Hello”))的方式来初始化。

在执行效率方面,StringBuilder 最高,StringBuffer 次之,String 最低,鉴于这一情况,一般而言,如果要操作的数据量比较小,应优先使用 String 类;如果是在单线程下操作大量数据,应优先使用 StringBuilder 类;如果是在多线程下操作大量数据,应优先考虑 StringBuffer 类。

4. Java数组的初始化方式有哪几种

一维数组:

// 动态创建了一个包含5个整型值的数组,默认初始化为0
int[] a = new int[5];
// 声明一个数组类型变量并初始化
int[] a = {1,2,3,4,5};

二维数组:

int[][] arr = {{1,2,3},{},{1,2,3,5}} int[][] a = new int[2][];
a[0] = new int[]{1,2};
a[1] = new int[]{3,4,5};

5. length属性与length()方法有什么区别

在Java语言中,数组提供了length属性来获取数组的长度,而length()方法是String提供的用来计算字符串长度的方法。除了length属性和length()方法外,Java中还有一个计算对象大小的方法——size()方法,它是针对泛型集合而言的,用于查看泛型中有多少个元素。

参考:《Java程序员面试笔试宝典》 何昊、薛鹏、叶向阳 编著

Java基础知识(五) 字符串与数组相关推荐

  1. java基础知识五、六、七、八

    第五章 在较大的数之前先增加较小数是减小误差的一种方法. 第六章 方法签名(Method Signature)指方法名称.参数类型和参数数量.java编译器根据方法签名决定使用哪个方法. 调用方法时, ...

  2. Java基础(五):数组和Java方法

    一.Java数组: 1.声明数组变量: 首先必须声明数组变量,才能在程序中使用数组.下面是声明数组变量的语法:注意: 建议使用 dataType[] arrayRefVar 的声明风格声明数组变量. ...

  3. 八门神器java版本_【修改教程】java基础知识字符串处理_八门神器

    [Java基础知识]字符串处理1.获取字符串的长度 String s = "AIDE"; System.out.println(s "长度为:" s.lengt ...

  4. 【Java基础知识 1】Java入门级概述,让阿里架构师告诉你为什么要分库分表

    1998年12月8日,第二代Java平台的企业版J2EE发布. 1999年4月27日,HotSpot虚拟机发布. 2005年6月,在Java One大会上,Sun公司发布了Java SE 6.此时,J ...

  5. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  6. java 数组 字符串 编程_Java语言基础知识之字符串数组

    Java语言基础知识之字符串数组 java语言中,数组是一种最简单的复合数据类型.数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来唯一地确定数组中的元素.数组有 ...

  7. 【java json基础】字符串转json json转字符串 json数组转换 【java基础知识】【实用】【一看就会】

    原文:[java json基础]字符串转json json转字符串 json数组转换 [java基础知识][实用][一看就会] 读书就是:从薄读厚,再从厚读薄的过程. 文比较长,各讲述如下: 若是新手 ...

  8. java里面string什么意思_「Java基础知识」Java中的字符串是什么

    原标题:「Java基础知识」Java中的字符串是什么 字符串顾名思义就是一些字符组合在一起组成的一串数据,称作字符串,在Java中字符串用双引号包围起来,格式为String string = &quo ...

  9. 【转】Java基础知识整理

    本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...

最新文章

  1. 解决Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0问题
  2. python getcwd 与dirname_python慎用os.getcwd() ,除非你知道【文件路径与当前工作路径的区别】...
  3. anki 插入表格_anki|建造师选择题制作的方法
  4. VTK:vtkDelaunay2D用法实战
  5. jQuery新版本加载json注意事项。
  6. char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...
  7. Python len函数 - Python零基础入门教程
  8. java word转pdf_java里实现Word转PDF的几种方案
  9. miui9android8.0xp框架,MIUI9MIUI10官方8.0/8.1刷入xp框架
  10. 《精通linux设备驱动程序开发》——USB
  11. Select2使用经验及多Jquery版本处理
  12. 再谈留数定理计算实积分
  13. U盘文件乱码?修复后U盘文件消失,但仍占有U盘空间?
  14. 华为路由TC7102实现一根网线分离同时支持路由器无线网络使用和电信IPTV机顶盒播放的方法步骤
  15. OpenCV中关于各种颜色的定义以及RGB值
  16. Kotlin笔记27--使用Intent传递数据
  17. 听说Python成为世界性语言了? Python是怎么构建世界?字符串在哪里?(三)
  18. 走近Harvest Moon:Moonbeam DeFi狂欢会
  19. 22.03.10【随便写写】
  20. c语言识别按了esc键_c语言输入esc

热门文章

  1. 将cocos2dx项目从VS移植到Eclipse - CoolJie
  2. iphone6s html5没声音,iphone6s没有声音了怎么办(解决苹果机来电没声音的3种方式)...
  3. ASP VBSCRIPT VBA RSA 公钥加密 私钥解密 私钥签名 公钥验签
  4. 公众平台 php,微信公众平台PHP开发
  5. php 微信 公众 平台,微信公众平台代码详解-php语言(一)
  6. 2020张宇1000题【好题收集】【第四章:多元函数微分学】【第五章:二重积分】
  7. Python爬取码市项目
  8. 基于图像特征点匹配的三维立体重建
  9. IRF(智能弹性架构)
  10. 阿里云云计算工程师ACA认证(Alibaba Cloud Certified Associate - Cloud Computing)考试大纲-V3.0