Vector
特有功能
// 添加功能
public void addElement(Object obj) // --add
// 获取功能
public Object elementAt(int index) // --get
public Enumeration elements() // --Iterator
boolean hasMoreElements() // hasNext()
Object nextElement() // next()
- 注:
上述vector的功能是JDK1.0的功能,JDK1.2以后就改成了后面标注的方法。 - JDK升级的原因:
A: 安全
B: 效率
C: 简化书写(vector的原因)
LinkedList
特有功能
// 添加功能
public void addFirst(Object e)
public void addLast(E e) // 意义不大
// 获取功能
public Object getFirst()
public Object getLast()
// 删除功能
public Object removeFirst()
public Object removeLast()
- 案例
ArrayList去除集合中字符串的重复值
- 创建一个新的集合,遍历原集合每次得到一个元素,若新集合中不存在该元素,就添加,否则不动。
- 两层for循环,若二层循环中存在和一层循环相同的元素,就删除。有一个问题是若集合中的元素连续相同,删除一个后,后面的相同元素补位,而遍历往后走,补位的元素就没删除掉。解决办法,删除之后y--,也就是回去再判断一次是不是相同的就好了。
自定义栈集合
// 请用LinkedList模拟栈数据结构的集合
import java.util.LinkedList;
/**
* 自定义的栈集合
*
* @author 风清扬
* @version V1.0
*
*/
public class MyStack {
private LinkedList link;
public MyStack() {
link = new LinkedList();
}
public void add(Object obj) {
link.addFirst(obj);
}
public Object get() {
return link.removeFirst();
}
public boolean isEmpty() {
return link.isEmpty();
}
}
泛型
定义
- 定义
是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型。把类型当做参数一样的传递。
说白了就是明确元素类型,解决了一个问题,就是集合添加不同类型的元素编译不出错,但是运行时把不同类型的元素转换成同一类型时会报错。 - 格式
<数据类型>
此处的数据类型只能是引用类型 - 好处
A: 把运行时期的问题提前到了编译期间
B: 避免了强制类型转换
C: 优化了程序设计,解决了黄色警告线
泛型类
- 定义:把泛型定义在类上
- 举例
public class ObjectTool<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
泛型方法
- 定义: 把泛型定义在方法上
- 举例:
public <T> void show(T t) {
System.out.println(t);
}
泛型接口
- 定义: 把泛型定义在接口上
- 举例:
public interface Inter<T> {
public abstract void show(T t);
}
- 实现类在实现接口时知道是什么类型
public class InterImpl implements Inter<String>{
@Override
public void show(String t) {
System.out.println(t);
}
}
- 实现类在实现接口时不知道是什么类型
public class InterImpl<T> implements Inter<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
泛型高级
?: 任意类型,如果没有明确,那么就是Object以及任意的java类
? extends E: 向下限定,E及其子类
Collection<? extends Animal> c11 = new ArrayList<Dog>();
? super E: 向上限定,E及其父类
Collection<? super Animal> c13 = new ArrayList<Object>();
JDK5的新特性
增强for
- 格式
for (元素数据类型 变量:数组或Collection集合) {
//使用变量即可,该变量就是元素
}
- 好处
简化了数组和集合的遍历 - 弊端
增强for的目标不能为null
如何解决呢?:对增强for的目标先进行不为null的判断,然后再使用 - 实质
增强for其实是用来替代迭代器的。
增强for遍历,修改某个元素,会报错–并发修改异常ConcurrentModificationException
静态导入
- 格式
import static 包名.类名.方法名
可以直接导入到方法的级别 - 注意事项
① 方法必须是静态的
② 如果有多个同名的静态方法,容易不知道使用谁,这个时候要使用,必须加前缀。
可变参数
- 定义
定义方法的时候不知道该定义多少个参数 - 格式
修饰符 返回值类型 方法名(数据类型... 变量名){
}
- 注意
①这里的变量其实是一个数组
②如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个。 - 方法
// 方法
public static <T> List<T> asList(T... a) //把数组转成集合
// 举例
List<String> list = Arrays.asList("hello","world");
// UnsupportedOperationException
// 虽然可以把数组转成集合,但是集合的长度不能改变,否则会报错
// list.add("java");
// list.remove(1);
list.set(1, "javaee");
举例
- 集合的嵌套遍历
ArrayList<ArrayList<Student>> arrayList = new ArrayList<ArrayList<Student>>
- 键盘录入多个数据,以0结束,在控制台输出这多个数据中的最大值
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
/*
* 键盘录入多个数据,以0结束,要求在控制台输出这多个数据
* 中的最大值
*
* 分析:
* A:创建键盘录入数据对象
* B:键盘录入多个数据,我们不知道多少个,所以用集合存储
* C:以0结束,这个简单,只要键盘录入的数据是0,我们
* 就不继续录入了。
* D:把集合转成数组
* E:对数组排序
* F:获取该数组中的最大索引的值
*/
public class ArrayListDemo {
public static void main(String[] args) {
//
Scanner sc = new Scanner(System.in);
ArrayList<Integer> array = new ArrayList<Integer>();
while (true) {
System.out.println("请输入数据:");
int number = sc.nextInt();
if (number != 0) {
array.add(number);
} else {
break;
}
}
// 把集合转成数组
// public <T> T[] toArray(T[] a)
Integer[] i = new Integer[array.size()];
// Integer[] ii = array.toArray(i);
array.toArray(i);
Arrays.sort(i);
System.out.println("数组是:"+arrayToString(i)+",最大值是"+i[i.length-1]);
// System.out.println(i);
// System.out.println(ii);
}
public static String arrayToString(Integer[] i) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int x=0;x<i.length;x++) {
if(x==i.length-1) {
sb.append(i[x]);
}else {
sb.append(i[x]).append(", ");
}
}
sb.append("]");
return sb.toString();
}
}