ArrayList,LinkedList,equals,hashcode,String的介绍

1、字符串池注意事项:

1String str0 = "aaa";

String str1 = "aa";

String str2 = new String("aaa");

String str3 = "a";

String str4 = str1 + str3;

String str5 = "aaa";

String str6 = new String("aaa");

System.out.println(str0 == str2); //false

System.out.println(str0 == str4); //false

System.out.println(str0 == str5); //true

System.out.println(str2 == str6); //false

字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中,就返回池中的实例引用。如果字符串不在池中,就会实例化一个字符串并放到池中。

JVM中有一个常量池,任何字符串至多维护一个对象。字符串常量总是指向字符串池中的一个对象。通过new操作符创建的字符串对象不指向字符串池中的任何对象,但是可以通过使用字符串的intern()方法来指向其中的某一个。java.lang.String.intern()返回一个保留池字符串,就是一个在全局字符串池中有了一个入口。如果以前没有在全局字符串池中,那么它就会被添加到里面。

在运行时通过连接计算出的字符串是新创建的,因此是不同的。如例子的str0 == str4false

Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同, 对于两个对象来说,则是判断其地址是否相同,所以a == b返回 true

至于Stringequals方法,因为它比较的不是对象的地址,而是对象的值。

2String str = “mashen”;

在这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用

String str = new String(“mashen”);

new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享

 

2、ArrayList注意事项:

我们可以将ArrayList看作是能够自动增长容量的数组。

①集合中存放的依然是对象的引用而不是对象本身。

ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10Object类型数组

③如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。

④对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。

⑤集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。

⑥集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。

⑦ 关于ArrayListLinkedList的比较分析

a) ArrayList底层采用数组实现,LinkedList底层采用循环双向链表实现。

b) 当执行插入或者删除操作时,采用LinkedList比较好。

c) 当执行搜索操作时,采用ArrayList比较好。

 

3、equals方法与hashcode方法:

①特点

a) 自反性:x.equals(x)应该返回true

b) 对称性:x.equals(y)true,那么y.equals(x)也为true

c) 传递性:x.equals(y)为 true并且y.equals(z)true,那么x.equals(z)也应该为true

d) 一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也应该为true,前提条件是在比较之间没有修改x也没有修改y

e) 对于非空引用xx.equals(null)返回false

hashCode()方法的特点:

a) Java应用的一次执行过程当中,对于同一个对象的hashCode方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化)。

b) 对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的。

c) 对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。

d) 对于Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode值表示的是对象的地址)。

③当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

④如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。

 

4、集合框架中的接口:

Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。

Set:不能包含重复的元素。SortedSet是一个按照升序排列元素的Set

List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。

Map:包含了key-value对。Map不能包含重复的keySortedMap是一个按照升序排列keyMap

 

5、LinkedList

1LinkedList类扩展AbstractSequentialList并执行List接口。它提供了一个链接列表数据结构。它具有如下的两个构造函数,说明如下

①–LinkedList( ):–第一个构造函数建立一个空的链接列表。

②–LinkedList(Collection c):–第二个构造函数建立一个链接列表,该链接列表由类集c中的元素初始化

2)当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层所维护的数组当中;当向LinkedList中添加一个对象时,实际上LinkedList内部会生成一个Entry对象,该Entry对象的结构为:

Entry

{

Entry previous;

Object element;

Entry next;

}

其中的Object类型的元素element就是我们向LinkedList中所添加的元素,然后Entry又构造好了向前与向后的引用previousnext,最后将生成的这个Entry对象加入到了链表当中。换句话说,LinkedList中所维护的是一个个的Entry对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值