<span style="color:#000000;">package com.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
// 创建对象
// Collection c = new Collection();//接口不能被实例化
Collection c = new ArrayList();
// 添加元素
// boolean add(Object obj):一个是添加,一个是返回添加是否成功。
c.add("world");
c.add("hello");
c.add("world");
c.add("java");
// 删除功能
// void clear():删除集合中的所有元素。
// c.clear();
// boolean remove(Object obj)
System.out.println("remove:"+c.remove("world"));
System.out.println("remove:"+c.remove("wor"));
// 判断功能
// boolean isEmpty()
System.out.println("isEmpty:" + c.isEmpty());
// boolean contains(Object obj)
System.out.println("contains:" + c.contains("world"));
System.out.println("contains:" + c.contains("wor"));
// 长度功能
// int size()
System.out.println("size:" + c.size());
System.out.println("c:" + c);
}
}
</span>
<span style="color:#000000;">package com.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*使用List集合存储自定义对象(Student对象,具备name和age属性)
*然后并遍历List集合。获取到Student对象的name和age值,然后打印在控制台上。
*/
public class StudentListTest {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student("张三", 23));
list.add(new Student("李四", 24));
list.add(new Student("王五", 43));
Iterator<Student> it = list.iterator();
while (it.hasNext()) {
Student s = it.next();
System.out.println("name=" + s.getName() + " age=" + s.getAge());
}
System.out.println("---------------");
for (int i = 0; i < list.size(); i++) {
Student s2 = list.get(i);
System.out.println("name=" + s2.getName() + " age=" + s2.getAge());
}
System.out.println("---------------");
for (Student s : list) {
System.out.println("name=" + s.getName() + " age=" + s.getAge());
}
}
}
</span>
6、List的三个儿子
(1)List的三个儿子特点:
List
|--ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
(2)到底使用谁?根据需求看
是否要安全:
是:Vector
否:ArrayList,LinkedList
查询多:ArrayList
增删多:LinkedList
如果你什么都不知道,用ArrayList。
(3)ArrayList(存储字符串和自定义对象)
判断自定义对象是否重复
重写equqls三个步骤
1. 判断是否为同一个对象
2. 判断是否为该类的对象
3. 向下转型,然后根据需求比较成员变量
(4)Vector(存储字符串和自定义对象)
有自己的特殊功能。但是不用,被新功能给替代了。
A:添加功能
public void addElement(Object obj) —— add(Object obj)
B:获取功能
public object elementAt(int index) —— get(int index)
public Enumeration elements() —— Iterator
boolean hasMoreElements() —— hasNext()
boolean nextElement() —— next()
C:长度功能
public int size()
(5)LinkedList(存储字符串和自定义对象)
有自己的特殊功能。可以很方便的操作头和尾。
A:添加功能
void addFirst(E e)
void addLast(E e)
B:获取功能
Object getFirst()
Object getlast()
C:删除功能
Object removeFirst()
Object removeLast()
(6)JDK版本升级原因
A:增强安全性
B:提高效率
C:简化书写
(7)案例:
A:ArrayList存储字符串并去除重复值
分析:A:定义 a、b、两个数组,b 用于保存比较后的数据
B:用 contains 判断 b 数组中是否已经包含有 a 遍历出来的数据
C:字符串重写了 equals 方法,所以不用重写
B:ArrayList存储自定义对象并去除重复值
需求:我们认为同姓名和同年龄的人即为同一个人。
分析:重写 equals 方法再进行判断
C:用LinkedList模拟栈数据结构(面试题)
要模拟栈内容的特点:先进后出。
题目理解:意思是说有一个 LinkedList 可以使用,但是需要自己定义一个栈集合。对外提供获取和添加功能。
7、泛型
(1)泛型是一种把明确类型的工作放在了创建对象或者调用方法时进行的特殊的类型。
(2)格式: <数据类型>
(3)好处:
A:把运行期间的类型转换异常给提前到了编译期间
B:优化了程序设计
C:解决了黄色警告线问题
(4)泛型分类
A:泛型类
class Tool<E>{
public void show(E e){}
}
B:泛型方法
class Tool{
public <E> void show(E e){}
}
C:泛型接口
interface Inter<E>
class InterImpl<E> implements Inter<E>
如果知道接口上的是什么类型,实现类后面就不用加泛型。
注意:泛型的类型只能是引用类型
(5)泛型的使用
看API中的类或者接口,其后是否跟有 < > ,如果有,就是泛型的应用。一般在集合中用。
例子:
import java.util.ArrayList;
import java.util.Iterator;
/*
* 用泛型改进。
* 用集合存储字符串并遍历。
*/
public class ArrayListDemo2 {
public static void main(String[] args) {
// JDK7以后,new后面的集合的泛型指定可以只写<>,不写类型即可。
// 但是,建议永远加上。
ArrayList<String> array = new ArrayList<String>();
array.add("hello");
array.add("world");
array.add("java");
Iterator<String> it = array.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
System.out.println("----------------");
for (int x = 0; x < array.size(); x++) {
String s = array.get(x);
System.out.println(s);
}
}
}
8、增强for循环(掌握)
(1)格式:
for(数组或者Collection集合的元素类型 变量 : 数组或者Collection集合的对象)
{
直接使用变量即可。
}
(2)好处:
方便数组和Collection集合的遍历。
(3)注意:
A:增强for是用来替代迭代器的。
B:不要在用增强for遍历集合的时候,用集合对象对集合进行修改。
(4)遍历集合三种方式
迭代器
增强for(工作时候用)
普通for+get
例子:
public class ForDemo {
public static void main(String[] args) {
// 整型数组
int[] arr = { 1, 2, 3, 4, 5 };
// 普通for
for (int x = 0; x < arr.length; x++) {
System.out.println(arr[x]);
}
System.out.println("--------------");
// 增强for
for (int x : arr) {
System.out.println(x);
}
System.out.println("--------------");
// 字符串数组
String[] strArray = { "hello", "world", "java" };
// 增强for
for (String str : strArray) {
System.out.println(str);
}
System.out.println("--------------");
// 集合
ArrayList<String> array = new ArrayList<String>();
array.add("hello");
array.add("world");
array.add("java");
for (String str : array) {
System.out.println(str);
}
System.out.println("--------------");
ArrayList<String> array2 = null;
// NullPointerException
for (String str : array2) {
if (str.equals("world")) {
array2.add("EE");
}
}
}