Java学习第一阶段

1.如下代码在编译的时候不会出错,但是在运行的时候报错。因为list的get方法获取到的就是一个object对象。
List list = new ArrayList();
list.add(new Integer(3));
String str = (String) list.get(0);


2.在如上代码的基础上加入list.add(3)代码是不行的,因为集合只能加入对象,要实现加入数字的功能必须采取包装类,这也是为什么要有包装类的原因。


3.如下代码在编译的时候不出错,但是在执行的时候却出错了,可以解释如下:a,Integer[]是一个对象,继承了object对象,但是并没有继承object数组,当然不能强转;
  b,在往集合中添加对象元素的时候返回的数组一定是object数组,因为如何类型的对象都可以往集合里面添加。
List list = new ArrayList();
list.add(new Integer(3));
list.add("name");
Integer[] intArr = (Integer[]) list.toArray();

4.如下代码在常规的认为中应该答应对象对应的类名@+对象的内存地址用16进制表示,但是在打印集合对象的时候却没有这样输出,原因是重写了toString方法。
public class test
{
public static void main(String[] args)
{
List list = new ArrayList();
list.add(new Student());
System.out.println(list.toString());
}
}


class Student
{
}
5.集合中存放的依然对象的引用而非对象本身。
6.ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会生成一个长度为10的Object类型数组,当往数组中添加元素超过10个的时候,
那么Arraylist底层会新生成一个数组,长度为原来的1.5倍+1,把原数组中的内容复制到新数组中,并且后续增加的元素会放到新的数组中。


7.对Arraylist元素的删除操作代价是非常高的,需要将删除元素的后续元素往前移动。




2015-05-28


LinkedList是通过双向列表来实现的,而ArrayList是通过数组来实现的,当要频繁往集合中做插入或删除操作时应该使用LinkedList.只要改变元素的前驱和后驱引用;
但是Arraylist涉及大量元素的移动。但是对于只涉及查询时应该采用Arraylist。因为LinkedList要一个一个往后面找,而Arraylist很容易根据底层实现数组的下标定
位到要找的元素。


ArrayList里面维护的加入的元素应用,而LinkedList里面维护的是节点引用,维护的是节点。节点维护加入的元素、前驱和后继元素的关系。形成一个链式结构。




2015-05-29
栈:后进先出  队列:先进先出。栈和队列的实现都可以通过LinkedList来实现。


在某些时候,我们需要判断两个对象是否相等。Java的每个类都继承于Object类。它使用equals()及hashCode()这两个方法来判断两个Object是否相等。 




1.  equals() 
需要满足5点: 
1 自省:对于任一非null引用x,x.equals(x)应返回true; 
2 反射:对于任一非null引用x及y,仅在y.equals(x)返回true时,x.equals(y)才返回true; 
3 传递:对于任一非null引用x、y及z,如果x.equals(y)为true,而且y.equals(z)为true,则x.equals(z)应返回true;
4 稳定:对于任一非null引用x及y,如果用于比较的信息没有改变,无论多少次调用x.equals(y)都会恒定地返回true或false; 
5 对于任一非null引用x,x.equals(null)应返回false。 


Object的默认实现是只要在两个Object的引用相等时,才会返回true,即return x == y; 


如果要覆盖(override)此方法,需要同时覆盖hasCode(),要求是:两个相等的对象必须有相等的hash code。 


2. hashCode() 
其必须遵循的约定是: 
1 如果对象equals, 则hashCode一定相等; 
2 如果equals()返回false,这两个对象的hashCode()可能相同。但不等的两个对象返回不同的int值可以提高hashtables的运行效率。 


   作为常理,不相等的对象的hasCode()应可能地返回不同的int值。 


3. 对象是否相等的规则 
1 判断两个对象的hashCode是否相等; 如果不相等,认为两个对象也不相等, 完毕. 
2 如果相等, 再调用equals方法. 


4. hashCode最大的用处是什么呢? 
Java中的集合(Collection)有两类,一类是List,再有一类是Set。 
你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。
在取集合元素的时候List可以通过如下形式,因为Arraylist和Linkedlist都是有顺序的,可以通过第一个下标一个一个往下找自己想要的,但是set不允许,需要通过
迭代器来循环。在使用set的时候,我们可以通过set.iterator()返回一个迭代器,迭代器是接口类型的。具体返回了一个怎么样的迭代器实现我们不需要关心,我们只需要
通过查看迭代器接口有哪些方法即可。迭代器的原理就是返回一个包含了所有集合元素的引用,这个引用指向第一个元素的前面,通过判断hashnext来断定是否有下一个
元素,如果有则通过next来获取,并把引用依次往后移,它的二种使用方法如下:


for(int i=0;i<list.size();i++)
{
list.get(i);
}
 
Iterator<Person> it = set.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
for(Iterator<Person> it = set.iterator();it.hasNext();)
{
System.out.println(it.next());

 
那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 
这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。 
Java采用了哈希表的原理, 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上. 初学者可以这样理解,
hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 
有了hashCode,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 
就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 
所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次. 


5. 为什么在HIBERNA里要重写hashCode和equals这两个方法? 
在hibernate中,经常使用set集合来保存相关对象,而set集合是不允许重复的, so, 道理同4. 





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值