字符串创建于存储机制

字符串的声明和初始化的两种情形:
1. str1 = “abc”; str2 = “abc”;在JVM中存在着一个常量池,其中保存着很多的String对象,并且这些对象可以共享。因此此处的str1和str2是引用同一个常量池中的对象。由于String是不可变类,因此这种共享并不会造成混乱。
2. str1 = new String(“abc”); str2 = new String(“abc”); ,创建两个内容相同的字符串对象,他们的地址是不同的,因为new一定会创建对象。

无论是使用new还是直接赋值的创建String对象,其过程都是先检查常量池中是否已经有了这个字符串常量。对于第一种方法,如果常量池中存在,那么直接将其引用返回即可;对于第二种形式,如果存在,那么在堆中申请个内存并创建一个新的对象,如果不存在,那么先会在常量池中创建一个对象,然后再new一个对象(也就是String str = new String(“hello”); 实际上可能创建一个对象,也可能创建了两个对象)。

== 与equals以及hashCode的对比

  1. == 比较的是两个变量对应的内存中存储的值是否相等。因此对于基本类型,比如int型,那么就相当于值得比较,而对于引用类型,比较的实际效果就相当于是比较两个变量所引用的对象是否是同一个对象(因此也会出现两个不同对象,但是其值是相同的,但是 == 返回false)而不考虑两个变量所引用对象的内容是否是相等的,如果呀比较引用类型变量的内容是否是相等的,还需要使用equals方法,并且是重载后的equals方法。
  2. equals方法是Object提供的方法,默认返回的是两个对象 == 后的结果,所以一般该方法需要进行重载,否则是没有什么意义的。通过覆盖来实现比较两个引用对象的内容是否是相等的。
  3. hashCode()方法也是继承自Object,通常也是用来比较两个对象是否相等。Object的hashCode()方法是一个native方法,该方法返回的是i对象在内存中地址转换为的一个int值。

一般在覆盖equals()方法的时候也是建议覆盖hashCode()方法的,否则可能导致所建立的类在基于散列的集合类(hashMap hashSet等)之间不能正常运行。
equals和hashCode的重载约定如下:
1. 如果x.equals(y)返回true,那么x和y的hashCode方法的返回值必须是一样的。
2. 如果x.equals(y)返回false,那么x和y的hashCode方法的返回值可能相等也可能不相等
3. 如果x和y的hashCode返回值不相等,那么其equals必定不相等
4. 如果x和y的hashCode返回值相等,那么其equals可能相等也可能不相等

对于第一条最为重要,也很容易被忽略,对于equals和hashCode都是默认的情况下,因为前者是比较内存值,而后者是直接返回内存地址相关的一个int值,因此默认情况下,是一定满足规则1的。被忽略的倾向常常表现在重写了equals()但是却没有重写hashCode()或者hashCode()设计的不满足1.因此在新建一个类,如果重写equals,那么一定记得重写满足1的hashCode()

String StringBuffer StringBuilder StringTokenizer

Java 中常用的对字符串进行操作的类就是Character String StringBuffer StringBuilder和StringTokenizer。Character对单个字符操作,String对字符串操作的不可变类,StringBuffer和StringBuilder是对字符串操作的可变类。

StringBuilder和StringBuffer类似,但是区别在于StringBuffer是线程安全的,而StringBuilder不是线程安全的。效率上面StringBuilder是最高的,其次是线程安全的StringBuffer,最后是String类。应该根据自己的实际使用场景选择合适的类型。

Java中的数组及初始化方法

Java中除了基本数据类型之外,其他都可以看做是对象,那么数组是不是对象呢?在Java中的数组,不仅具有自己的属性,也具有自己的方法。这些特点符合对象的标准,因此在Java中数组可以看做是对象,还可以使用instanceof进行类型的判断。
例如:String[] ss = {“ac” , “bc”}; if(ss instanceof String[]) {}

数组的初始化方法:
对于一维数组,声明方式:
1. type array[];
2. type[] array;

注意:1.Java中数组被创建的时候会根据其数据类型进行值得初始化; 2.Java中在定义数组的时候并不会为其分配空间,因此[]中不需要指定长度,因此在使用前需要指定长度,如array = new type[5];

初始化方法:
1. int[] array = new type[5];
2. int[] array = {1, 2, 3};

或者:
1. int[] array; array = new int[5]; // 申请空间并初始化为0
2. int array[]; array = new int[]{1, 2, 3, 4, 5};

二维数组的声明和初始化:
1. type arrays[][];
2. type[][] arrays;
3. type[] array[];

列表化的初始化: type arrays[][] = {{a11, a12, a13}, {a21, a22, a23}, {a31, a32, a33}};

new关键字申请空间: type arrays[][] = new type[row][col];

注意:
Java语言中,二维数组的第二维可以不相等。例如:
1. int array[][] = {{1, 2}, {3, 4, 5}};
2. int array[][] = new int[2][]; array[0] = new int[2]; array[1] = new int[3];

之所以这么任性是因为在遍历二维数组的时候,可以不根据固定的行列下标,而是根据维度的length属性来实现遍历的。注意length属性和length()方法是不一样的,前者是数组的维数属性,后者多是字符串的长度获取方法

【Java基础】字符串与数组相关推荐

  1. Java基础篇4——数组

    Java基础篇4--数组 1.数组的概念 当需要在Java程序中记录单个数据内容时,则声明一个变量即可 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数 组即可,一维数组本质上就是 ...

  2. JAVA关于字符串字符数组处理的小题目

    JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...

  3. java基础-字符串String

    今天要介绍的知识点为String,也叫字符串.这是个应用的比较广泛并且充满神奇色彩的知识点.为什么说神奇呢?因为它涉及了好些个看起来高深莫测的概念.并且,这个知识点其实已经属于java中引用类型的知识 ...

  4. Java基础语法(数组)

    第4天 Java基础语法 今日内容介绍 u 流程控制语句(switch) u 数组 第1章 流程控制语句 1.1 选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句 ...

  5. java中字符串和数组如何比较_[Java教程]javascript中数组和字符串的方法比较

    [Java教程]javascript中数组和字符串的方法比较 0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的 ...

  6. java基础5 (一维)数组和二维数组

    本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等))     二维数组(二维数组的遍历.排序.查找.定义 ...

  7. java基础——什么是数组(一维数组、二维数组)

    文章目录 1_Java语言基础(数组概述和定义格式说明)(了解) 1.2_Java语言基础(数组的初始化动态初始化)(掌握) 1.3_Java语言基础(Java中的内存分配以及栈和堆的区别) 1.4_ ...

  8. Java基础总结之数组

    软件151,牟俊 一)数组的基本概念 1.数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 2.数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 3.数组的 ...

  9. 【java基础】——一维数组和二维数组存储占用内存大小问题

    问题:在java中,一维数组和二维数组在数据量一样的情况下,开辟的内存大小是怎样的? 一.尝试阶段: 1.代码一: public class OneArrayMemory{public static ...

  10. java中字符串转数组,数组转字符串,集合转字符串

    一.字符串转数组 这里使用的是split()方法. String ids = "1,2,3,4"; String[] idArray = ids.split(",&quo ...

最新文章

  1. STM32堆和栈(Heap Stack)及SRAM存储使用
  2. 赋茶计算机基础知识,计算机基础知识选择题_new解析.doc
  3. Spring AOP编程-传统aop开发总结
  4. boost::outcome_v2::std_result用法的测试程序
  5. mysql单表备份语句 +多表
  6. Oracle SQL中实现indexOf和lastIndexOf功能
  7. 实例14:python
  8. 扩充swap空间的两种方法
  9. 《Windows驱动开发技术详解》之HelloDDK
  10. html转换jquery,将html字符串转化为jquery对象
  11. Get!程序员成为高级管理者的三次跃升
  12. php 密匙加密解密,带密匙的php加密解密示例分享
  13. verilog中signed的使用
  14. python中capital是什么意思_Capital是什么意思?
  15. ValueError: Shapes () and (1, 1) are incompatible
  16. 使用字符串修改彩票程序
  17. OMRON欧姆龙驱动器维修R88D-KT06F-Z过压故障处理
  18. 一图看懂ADSL拨号服务器
  19. 「Codeforces 643D」Bearish Fanpages
  20. 春运在即 360又抢了12306的风头

热门文章

  1. mysql数据库技术实验小结_Mysql数据库事务实验以及总结
  2. r 语言计算欧氏距离_一文搞懂常用R语言统计值计算:打倒描述性统计拦路虎
  3. java模拟器未载入,由于“活页夹线程池”,应用程序未在模拟器上运行
  4. measure_profile_sheet_of_light算子说明
  5. Java渐变进度条_Android ProgressBar自定义图片进度,自定义渐变色进度条
  6. python发送微信消息_用python批量发送微信消息
  7. Spring3.x与jdk8兼容问题
  8. 用Docker镜像搭建ELK环境
  9. 关于封装了gevent的request grequest库的使用与讨论
  10. 使用getopts处理选项