注:资料有书为证,大伙可放心翻阅并熟记,由本人亲自总结!
1、字符串创建于存储的机制是什么?
字符串的声明和初始化主要有两种,如图所示:
s1和s2是一种,s3和s4是另一种。
前者,当创建一个字符串常量时,会首先在字符串常量池中查找是否已经有相同的字符串被定义,其判断依据就是String类的equals(Object obj)方法的返回值。若已经定义,则直接获取对其的引用,此时不再需要创建新的对象;若没有,则首先创建这个对象,然后把它加入到字符串池中,在将它的引用返回。。
后者,存在两个引用对象S3和s4,两个内容相同的字符串对象,它们在内存中的地址是不同的。只要用到new总会生成新的对象。
拓展:对于Stirng类型的变量s,赋值语句s=null与s=" "是否相同?
对于赋值语句s=null,其中s是一个字符串类型的引用,它不指向任何一个字符串。而赋值语句s=" “中的s是一个字符串类型的引用,它指向另外一个字符串。这个字符串为” "(空)。因此两者不同!
2、"=="、equals和hashCode有什么区别?
①、"=="运算符用来比较两个变量的值是否相等。
②、equals是Object类提供的方法之一。Object类中定义的equals(object)方法是直接使用"=="运算符比较的两个对象,所以在没有覆盖equals(object)方法的情况下,equals(object)与" == "运算符一样,比较的是引用。
如果一个类没有自己定义equlas()方法,那么它将继承Object类的equals()方法。
③、hashCode()方法是从Object类中继承过来的,它也用来鉴定两个对象是否相等。
一般在覆盖equals()方法的同时也要覆盖hashCode()方法,否则,就会违反Object.hashCode的通用约定。
hashCode()方法的返回值和equals()方法的关系如下:如果x.equals(y)返回true,即两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode()方法都必须产生同样的整数效果。如果x.equals(y)返回false,即两个对象根据equals()方法比较是不相等的,那么x和y的hashCode()方法的返回值有可能相等,也有可能不相等。反之,hashCode()方法的返回值不相等,一定能推出equals()方法的返回值也不相等,而hashCode()方法的返回值相等,equls方法的返回值则可能相等,也可能不相等。
3、String、StringBuffer、StringBuilder和StringTokenizer有什么区别?
Java中有4个类可以对字符或字符串进行操作,它们分别是Character、String、StringBuffer和StringTokenizer。其中Character用于单个字符操作,String用于字符串操作,属于不可变类,而StringBuffer也是用于字符串操作,不同之处是StringBuffer属于可变类。
String是不可变类,也就是说,String对象一旦被创建,其值将不能被改变,而StringBuffer是可变类,当对象被创建后仍然可以对其值进行修改。
当一个字符串需要经常被修改时,使用StringBuilder比使用String要好很多。
StringBuilder也是可以被修改的字符串,它于StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的。
因此,只有单线程访问时可以使用StringBuilder,当有多个线程访问时,最好使用线程安全的StringBuffer
在执行效率方面,StringBulider时最高的,StringBuffer次之,String最低,鉴于这种情况,一般而言,如果要操作的数据量比较小,应优先使用String类;如果实在单线程下操作大量数据,应优先使用StringBuilder类;如果实在多线程下操作大量数据,应优先考虑StringBuffer类。
StringTokenizer是用来分割字符串的工具类。
4、Java中的数组是不是对象?
在Java中,数组不仅有自己的属性,也有一些方法可以被调用。而对象的特点时封装了一些数据,同时提供了一些属性和方法,所以从这个角度来看,数组是对象。
5、数组的初始化方式有哪几种?
一维数组声明方式:type[] arrayName或者type arrayName[]
如果需要分配空间,则还可以这样定义type[] arrayName=new type[arraySize];
二维数组有三种声明方式:type[][] arrayName
、type arrayName[][]
、type[] arrayName[]
需要注意的是,在声明二维数组中,其中[]必须为空!
二维数组分配空间,格式如下:type arrayName[][] = new type[行数][列数]
与C语言不同,在Java中,二维数组的第二维的长度可以不同,
6、length属性与length()方法有什么区别?
数组提供了length属性来获取数组的长度;length()方法是针对字符串而言的。
此外,Java中还有一个计算对象大小的方法——size()方法,该方法时针对泛型集合而言的,用于查看泛型中有多少个元素。
拓展:泛型是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类
转载麻烦请附录地址,感谢大家配合!!!
https://blog.youkuaiyun.com/HOLLOWYANG/article/details/119986430