Java基础知识(字符串与数组)

5. 字符串与数组

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

字符串声明与初始化主要有如下两种情况:
1.对于Strng s1=new String(“abc”)与String s2=new String(“abc”),存在两个引用对象s1,s2,两个内容相同的字符串对象“abc”,在内存中的地址不同,只要用new总会生成新的对象。
2.对于String s1=“abc”和String s2=“abc”,在JVM中存在一个字符串池,保存多个String对象,并可以被共享使用,s1和s2引用得是同一个常量池中的对象。
可以将String s1=new String(“abc”)分为两个过程,一个是新建对象的过程,即new String(“abc”);第二个是赋值的过程,String s1=。在第二个过程中只定义一个名为s1的String类型的变量,将一个String类型对象引用赋给s1。第一个过程会调用String类的构造函数:
在这里插入图片描述
在调用这个构造函数时,传入一个字符串常量,new String(“abc”)与abc和new String相等。如果字符串池不存在“abc”,则会创建一个字符串常量“abc”,并将其添加到字符串池中;若存在,则不创建,然后new String()会在堆中创建一个新的对象。
Java基础知识(字符串与数组)_第1张图片
String类型的变量s,赋值语句s=null和s=“ ”的区别:
s=null,s是一个字符串类型的引用,不指向任何一个字符串。s=“ ”中的s是一个字符串类型的引用,指向另一个字符串。

5.2 “==”、equals、hashCode的区别

1.“==”比较两个变量的值是否相等。比较变量对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,用“==”
如果要比较两个变量是否指向同一个对象,要看这两个变量所对应内存中的数值是否相等,可以用“==”进行比较。如果要比较两个对象的内容是否相等,则用“==”无法实现。
2.Object类中的equals直接使用“==”运算符进行比较两个对象,与“==”运算符一样,比较引用。该方法的不同处是可以通过覆盖的方法比较数据内容。例如:
在这里插入图片描述在这里插入图片描述
两条new语句创建两个对象,用s1和s2这两个变量分别指向一个对象,这是两个不同的对象。首地址不同,但是这两个对象中的内容是相同的,则a.equals(b)为true。
当编写的类希望比较该类创建的两个实例对象的内容是否相同,必须覆盖equals方法。
==equals():
(1)“==” 用于比较基本数据类型时比较的是值,用于比较引用类型时比较的是引用指向的地址。
(2)Object 中的equals() 与 “==” 的作用相同,但String类重写了equals()方法,比较的是对象中的内容。
3.hashCode从Object中继承过来的,用来鉴定两个对象是否相等。Object类中的hashCode返回对象在内存中地址转换成的一个int值,如果没有重写hashCode方法,任何对象的hashCode方法不相等。
hashCode方法的返回值与equals的关系:当x.equals(y)返回true,即两个对象根据equals方法比较是相等的,调用这两个对象中任意一个对象的hashCode方法必须产生相同的结果。如果x.equals(y)返回false,两个对象根据equals比较不相等,则x和y的hashCode方法的返回值可能相等,可能不相等。

5.3 String、StringBuffer、StringBuilder、StringTokenizer的区别

1.String用于不可变字符串,StringBuffer用于可变字符串,Character用于单字符。
String适用于在需要被共享的场合使用,StringBuffer适用于当一个字符串经常被修改时。
2.另一个区别是在于当实例化String时,利用构造函数(String s1=new String(“world”))方法对其进行初始化,也可用赋值(String s=“hello”)方式初始化。StringBuffer只能使用构造函数(StringBuffer s=new StringBuffer(“hello”))初始化。
3.StringBuilder可以被修饰的字符串,与StringBuffer类似,都是字符串缓冲区,但是线程不安全。在单线程时使用StringBuilder的效率能高一点,但是在多线程使用StringBuilder是安全的。
4.执行效率:StringBuilder>StringBuffer>String。
如果操作的数据量小,优先用String;当单线程下操作大量数据,优先用StringBuilder;当在多线程下的大数据,优先使用StringBuffer类。
5.StringTokenizer用来分割字符串。

5.4 Java中的数组是不是对象

数组时有相同类型的数据的集合,有固定的长度,在内存中占据连续的空间。java中的数组有自己的属性和方法。因为对象的特点是封装一些数据,提供属性和方法,因此Java中的数组是对象。

5.5 数组的初始化方法

java一维数组声明如下:
type arrayName[] 或type[] arrayName
其中,type可以是类或基本数据类型。Java数组被创建后会根据数组存放的数据类型初始化对应的初始值,并且在定义时不会给数组元素分配存储空间,所以[]不需要指定数组长度。
完成数组声明后,进行初始化:
1.int [] a=new int[5]
2.int [] a={1,2,3,4,5}
二维数组初始化和声明的方法:
1.type arrayName[][];
2.type [][] arrayName;
3.type[] arrayName[];
初始化方法:
1.在这里插入图片描述
2.在这里插入图片描述
二维数组的第二维长度可以不同,例如定义一个两行的二维数组,第一行有两列,第二行有三列,定义方法如下:
在这里插入图片描述

5.6 length属性和length()方法的区别

length属性获得数组的长度,length方法针对字符串而言,计算字符串长度。
Java基础知识(字符串与数组)_第2张图片
Java基础知识(字符串与数组)_第3张图片

你可能感兴趣的:(程序员面试笔试宝典笔记,java,编程语言,字符串)