java编程自学记录(day13)

昨天的复习:
泛型:
 泛型可以在我们使用某个类时向传递参数一样来想类中的某些内容传递一个类型,动态的决定这一个被创建出来的类的实例的
方法和返回值、属性的类型,从而提高程序的灵活性。这个特性是Java1.5之后出来的新特性。

新知识:
增强型for循环
 1)Java1.5的另一个新特性:新循环(增强型for循环),其作用是专为遍历数组和集合使用的。
  for(ElementType element : ArrayOrCollection){
   ... ...
  }
  遍历数组或集合,将每一个元素以此赋值给element后进入循环体,直到所有元素均被迭代完毕后退出循环。
  自动维护循环次数,自动获取每次迭代的元素
 2)注意事项:使用新循环,element的类型应与循环迭代的数组和集合中的元素类型一致,至少要是兼容类型。
 3)新循环内部实现是使用迭代器完成的Iterator,因此新循环不能提供循环时元素的位置

List的其他操作:
 1)取子集subList(int formIndex, int toIndex);
  在获取子集后,若对子集元素进行修改,会影响原来的集合

队列:
 1)JDK提供Queue接口,使用LinkedList实现该接口。选择LinkedList实现Queue的原因在于Queue需要经常进行插入
 和删除操作,而LinkedList在这方面的效率比较高
 2) 使用LinkedList定义队列
  Queue<String> list = new LinkedList<String>();
  入队:offer()方法 出队:poll()方法 取队首元素:peek()
 3)若poll()方法返回null,说明队列中没有元素了
 
栈:
 1)Queue接口的子类实现:LinkedList(也是List的子类实现)
 2)我们在使用pop获取栈顶元素之前,应该首先使用peek方法获取钙元素,确定钙元素不为null的情况下才应该将该元素从
 栈中弹出。否则栈中没有元素后,我们调用pop会排除异常“NoSuchElementException”,这一点跟Queue不同

List的其他算法
Comparable接口
 1)若我们定义的类想在数组或集合中可以排序,我们需要将当前类实现Comparable接口,并重写compareTo()定义规则
 写好了之后,compareTo()方法会被数组或集合工具类中的排序方法调用,不需要显式地调用。
 2)需要注意的是,这个compareTo方法应该与equals保持一致
  即:equals方法返回true时,compareTo方法返回值应该是0。反过来也应该是一样的
 3)若一个集合的元素没有继承Comparable接口,则该集合不能进行排序相关操作

Comparator比较器
 1)它是一个接口,实现该接口的类需要实现一个抽象方法
  int compareTo(E o1, E o2)
  返回值>0:o1比o2大
  返回值<0:o1比o2小
  返回值=0:o1与o2一样大
 2)比较器可以用于比较数组或集合中的元素。
  Collections提供sort的重载方法,支持传入一个比较器对集合进行比较排序,即使用外界提供的比较规则,而不是使用
 集合中元素本身的继承了Comparable接口后重写的compareTo方法
 3)自定义的比较规则实现需要实现以下步骤
  a.定义一个类并实现Comparator接口
  b.实现接口中的抽象方法compareTo(E o1, E o2)
  c.实例化这个比较器
  d.调用Collections的重载方法sort(Collection c, Comparator comparator)进行排序
 4)使用比较器的方法可以对数组或 集合中没有继承Comparable的元素进行排序


Collections类
 是集合的工具类,提供二楼对集合操作的若干方法。类似Arrays类的作用
 1) sort()方法会调用compareTo方法,默认调用元素自带的,也可以使用其重载方法调用自定义的比较器。
  sort()方法会将小的排在前面。
  
  
Set集合
 1)Set特性:
   a.是不重复集 ,即同一个对象不能在集合中出现两次 。
  b.无序 , 没有下标,没有get()方法   。可以使用Iteratord迭代
 2) 常用实现类
   HashSet:使用散列算法实现的Set集合
HashSet类
 1)使用散列算法实现的Set集合
 2)实例化一个HashSet集合
  Set<String> set = new HashSet<String>();
 3)向集合添加元素也使用add(),但是这里的add方法不是向集合末尾追加元素,因为无序,所以谈不上头尾
 4)Set中没有get(int index)方法,因此不能像是用List那样,根据下表获取元素,想要获取元素只能使用Iterator

HashSet和hashCode方法的关系
 HashSet是Set接口的实现类,在将对象加入HashSet集合中时,需要获取对象的hashCode值通过hash算法索引到对应
 的存储空间
hashCode()方法
 1)是Object定义的方法。所以每个类都会有该方法。若我们定义的类重写了equals方法,就要重写hashCode()方法。因为
 API中有此要求:
  若equals方法返回true,那么这两个对象应该有相同的hashCode值。反过来不是必须的,但最好可以相同。可以提高
 诸如HashSet这样的数据结构的效率
 2)若不重写hashCode没那么使用的就是Object提供的该方法是返回句柄!也就是说,不同的对象的hashCode不同
 
  
其他知识:
(1)数组初始化:
 引用类型数组初始化时,每个元素的默认值为null!
 基本数据类型数组初始化时,每个元素的默认值为基本类型数据的默认值。如,int为0,boolean为false
(2)当创建一个子类的实例并将其赋值父类的引用变量,则该引用变量不能调用父类中没有声明的方法和属性。
 若子类中有重写方法,则该引用变量调用的是子类中重写后的方法。
(3)赋值表达式将最终的计算结果作为整个表达式的结果,
 eg:  a = 1 + 1; 运算结果是a=2,整个表达式的结果也是2
(4)Collection 和 Collections的区别
 Collection是集合的父接口
 Collections是集合的工具类,提供对集合操作的若干方法,如排序等。
( 5)数组打印不能直接像下面这样调用
 System.out.println(points); 这样调用的是Point[]的toString方法,打印出来是hashcode
 应该像下面这样调用,使用Arrays工具类进行字符串转换
 System.out.println(Arrays.toString(points));
(6)String类型继承了Comparable接口,可以直接进行排序

知识补充:
Object类中的方法介绍:
 1)protected Object clone()
  创建并返回此对象的一个副本。  
 2)boolean equals(Object obj)
  指示其他某个对象是否与此对象“相等”。根据需要重写
 3)protected void finalize()
  当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。  
 4)Class<?> getClass()
  返回此 Object 的运行时类。
 5)int hashCode()
  返回该对象的哈希码值。
 6)void notify()
  唤醒在此对象监视器上等待的单个线程。  
 7)void notifyAll()
  唤醒在此对象监视器上等待的所有线程。
 8)String toString()
  返回该对象的字符串表示。根据需要重写
 9)void wait()
  在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
 10)void wait(long timeout)
  在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
 11)void wait(long timeout, int nanos)
  在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个
 实际时间量前,导致当前线程等待。

疑问:
 Set的contains()方法到底有没有调用元素的equals方法,API中说有,但是实际效果看则是没有?

猜你喜欢

转载自blog.csdn.net/zou8944/article/details/52345945
今日推荐