package cn.itcast2;
import java.util.ArrayList;
/*
* 1:List的子类
(1)List的子类特点
ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector:
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList:
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
(2)ArrayList
没有特有功能需要学习
(3)Vector
有特有功能
a:添加
public void addElement(E obj) – add()
b:获取
public E elementAt(int index) – get()
public Enumeration elements() – iterator()
(4)LinkedList
A:有特有功能
a:添加
addFirst()
addLast()
b:删除
removeFirst()
removeLast()
c:获取
getFirst()
getLast()
2:泛型
(1)泛型概述
是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。
(2)格式:
<数据类型>
注意:该数据类型只能是引用类型。
(3)好处:
A:把运行时期的问题提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计,解决了黄色警告线问题,让程序更安全
(4)泛型的前世今生
A:泛型的由来
Object类型作为任意类型的时候,在向下转型的时候,会隐含一个转型问题
B:泛型类
C:泛型方法
D:泛型接口
E:泛型高级通配符
?
? extends E
? super E
(5)一般是在集合中使用。
3:增强for循环
(1)是for循环的一种
(2)格式:
for(元素的数据类型 变量名 : 数组或者Collection集合的对象) {
使用该变量即可,该变量其实就是数组或者集合中的元素。
}
(3)好处:
简化了数组和集合的遍历
(4)弊端
增强for循环的目标不能为null。建议在使用前,先判断是否为null。
4:静态导入
(1)可以导入到方法级别的导入
(2)格式:
import static 包名….类名.方法名;
(3)注意事项:
A:方法必须是静态的
B:如果多个类下有同名的方法,就不好区分了,还得加上前缀。
所以一般我们并不使用静态导入,但是一定要能够看懂。
5:可变参数
(1)如果我们在写方法的时候,参数个数不明确,就应该定义可变参数。
(2)格式:
修饰符 返回值类型 方法名(数据类型… 变量) {}
注意:
A:该变量其实是一个数组名
B:如果一个方法有多个参数,并且有可变参数,可变参数必须在最后
(3)Arrays工具类的一个方法
asList()把数组转成集合。
注意:这个集合的长度不能改变。
*/
public class Demo {
/*
* 去除集合中字符串的重复值(字符串的内容相同) ArrayList,不能新建集合.
*
* 思路:
* 1. 从0索引开始,依次让1,2,3….的元素依次比较,有相同的就从集合删除后面的.
* 2. 从1索引开始,依次与2,3,4….的元素依次比较,有相同的就从集合删除后面的
*
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList list = new ArrayList();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
list.add("hello");
list.add("world");
list.add("world");
list.add("world");
list.add("android");
list.add("android");
//选择排序
for (int x = 0;x < list.size() - 1; x++) {
for (int y = x + 1; y < list.size();y++) {
//比较两个值,相等就删除后面的
if (list.get(x).equals(list.get(y))) {
list.remove(y);
y--;
}
}
}
//输出集合
System.out.println("list:" + list);
}
}