每日心得
今天学的还不错,学的东西基本上明白了,就是感冒挺难受的。
1、Stcak类(栈,FILO先进后出)
继承了Vector
类,pop()
方法:弹出(使用remove
方法移除最后一个元素);
2、Queue接口(队列,FIFO先进先出)
LinkedList
是它的实现类,boolean offer(Object o)
:将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
3、Iterable接口(java.lang内)
Collection
继承了Iterable
接口,要获取Iterator
对象,就要实现Iterable
接口,重写Iterator()
。
Iterator方法
迭代器,用来实现foreach循环,只是一个工具,单独的一个迭代器并没有任何意义,依赖于一个类来使用,通过什么生成的迭代器,就只能迭代什么,一次性用品,想要再次使用必须重新定义,代码如下:
while(iter.hasNext()){
obj=iter.next();
System.out.println(obj);
}
使用循环时,不需要获取其位置,把所有元素遍历一遍,若遍历结束后再调用next()
,将会报错;迭代时,如果要进行删除的操作,只能使用迭代器接口中的remove()
方法,而不能使用集合的remove()
方法;
若一个自定义的类想要使用foreach循环,需要继承迭代器的接口,重写hasNext()
与`next()方法,迭代遍历的使用,与foreach循环效果一样。
4、泛型
直接上代码:
public class test4 <T>{
private T t;
public static <S> void main(String[] args) {
}
}
可以在类,接口上定义,也可使用在方法,属性上;Map
接口就是很好的例子:
public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
T可以为任意类型,但不能是基本数据类型,T表示一个不确定类型,其目的是为了在使用时填写需要的数据类型进行替换,若是尖括号里不填,默认类型为Object
。为了统一规范某种数据类型,定义的时候类型不确定,使用时会固定其替换的数据类型。例如:
List<String>list=new ArrList;
list.add(String);//括号里只能是String,因为类型已经进行了限制
Map<String.String>map=new HashMap<>();//钻石语法,后方<>中的类型可省略。
泛型边界
边界上限
可以直接在括号里继承某个类或接口,也可以实现某个接口,
边界下限
这个把我们老师还坑了一下,并不能像上限一样直接写在括号里,老师也没明白这个原因是什么,官方文档里并没有明确解释,老师猜测可能是实际意义不大。在类、接口上使用时,必须继承某个类或接口,接口中有泛型,在使用时再次进行约束,例如:
interface ITest2<W extends ITest<? super String>>{}
interface ITest<S>{}
泛型(类型)擦除
用下面这串代码来解释一下:
List<String>list=new ArrayList();
list.add("abc");//括号里只能是String类型
其泛型擦除的含义是编译器经过编译后,会把泛型的类型即<String>
擦除掉。这个时候我们疑惑为什么擦除了后,后面的添加中编译器还是进行了类型限制呢?这是因为编译器在编译之前会进行自动检查,识别其类型的约束,不过这只限于直接调用,如果间接调用则不会识别这个类型限制(这个原理与地铁的安检类似,进去时检查,出来进行安检也就失去了意义,但是如果你不是从正门进的,而是以其他方式进入的,则不会遇到安检);编译后会变为List
类型,即原始类型,所以Java中的泛型也称之为伪泛型。
Collections类(学习上用得多,工作上很难用上)
类中大部分方法为静态,.sort()
:按自然顺序进行排序;老师为了做一个例子,还提了一个类UUID
,实际上是一种算法,里面的.randomUUID()
方法能够生成一个不重复的字符串。若是要按照自定义类型中的某个属性进行排序,要制定一个比较规则,需要继承Compare接口,compareto()方法(输出-1,0,1分别表示小于,等于,大于),数据量小的时候可用。