——我是LGM_Hakka,请多多指教。
集合
集合概述:
可以存储任意类型的对象,并且长度是可变的,统称为集合。
集合按照其存储结构可以分为两大结构(常见的)
集合框架图:
List集合
1、特点:元素有序(是指存储和取出的顺序一样),元素可重复
2、List集合的特有方法,全部都是围绕索引来定义的。
3、List获取元素的方式有两种:
A、迭代:
// 创建迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
System.out.println(object);
}
B、遍历+get:
for (int i = 0; i < list.size(); i++) {
System.out.println("get[" + i + "]: " + list.get(i));
}
4、List中常用方法:
A:添加功能
void add( int index, Object obj ):向集合中的指定位置添加元素
B:删除功能
Object remove( int index ):删除集合中指定索引处的元素,返回被删除的元素值
C:修改功能
Object set( int index, Object obj ):用指定的元素替换指定索引位置的值,返回被替换的元素值
D:获取功能
Object get( int index ):获取集合中指定索引处的值
int indexOf( Object o ):获取指定元素在集合中第一次出现的索引
ListIterator<E> listIterator():列表迭代器
E:截取功能
List subList( int fromIndex, int toIndex):截取集合从指定位置开始到指定位置结束,返回截取出来的集合.
5、常用的实现类:
l Vector:可以增长的数组结构。查询速度慢,增删速度慢。同步的,线程安全,效率非常低。已经被ArrayList替代。
l ArrayList:是数组结构(原理:创建新数组+复制数组)。查询速度快,增删速度慢。不同步的,线程不安全,效率高
l LinkedList:是链接列表结构(链表)的。增删速度快,查询速度慢。不同步的,线程不安全,效率高
可以用于实现堆栈、队列:
堆栈:先进后出【Frist In Last Out,即:FILO】。例如:枪支的弹夹
队列:先进先出【First In First Out,即:FIFO】。例如:火车站排队买票
集合与数组的区别:
l 数组的长度是固定的;
l 数组中存储的都是同一类型的元素;
l 数组可以存储基本数据类型值,也可以存储引用数据类型;
l 集合的长度是可变的;
l 集合只能存储引用数据类型;
l 同一个集合中,可以存储多种数据类型。
什么时候使用集合?
当对象多的时候,且不固定,先进行存储。
细节
1、集合中存储的都是对象的地址;
2、集合是否可以存储基本数据类型?
不可以。但是在jdk1.5之后,coll.add(1)可以这么写,但是其实际存储的还是对象。coll.add(1); ---> coll.add(Integer.valueOf(1));自动装箱,即存储的是基本数据类型包装类对象。
3、在集合存储时,被提升为了Object类型,所以在取出时要使用元素的特有内容,必须向下转型。
泛型
在创建集合的时,就明确容器中的元素的类型,如同数组一样。这样能够更安全。jdk1.5以后,出现了这个方案,使用容器时,必须明确容器中的元素的类型;这种机制就称之为:泛型。
使用泛型的好处:
A、安全机制
B、将运行时期的ClassCastException类型转换异常,转移到编译时期。
C、泛型技术,是给编译器使用的技术。
D、解决了强制转换的麻烦。
F、优化程序设计
泛型的擦除机制:泛型仅在编译时其作用,编译完后将消失。
泛型的使用规则:
API中类或者接口名后边有<>那么就可以使用泛型。
泛型一般我们在集合中去使用
泛型的限定:
? extends E:接收E类型或者E类型的子类型。上限
? super E:接收E类型或者E的父类型。下限
增强for(foreach)循环
格式:
for(要遍历元素的数据类型 变量名 : 集合或数组的对象名) {
直接使用变量名即可
}
***:增强for是为了取代迭代器的,所以说在用增强for遍历集合的过程中
对集合进行改变,也会出现并发修改异常.
综合练习
import java.util.ArrayList;
import java.util.Iterator;
/*
* 创建一个集合,实体用ArrayList实现。
* 然后向集合添加5个字符串元素。
* 分别是:“hello”,“world”,“shenzhen”,“ketang”,“best”。
* 判断集合中是否存在"ketang"这个元素?
*/
public class ArrayListDemo {
public static void main(String[] args) {
// 创建ArrayList对象
ArrayList<String> list = new ArrayList<String>();
// 向ArrayList对象添加元素
list.add("hello");
list.add("world");
list.add("shenzhen");
list.add("ketang");
list.add("best");
// 定义一个变量,用于存储需要查找的对象
String string = new String("ketang");
// 定义一个变量,用于接收返回值
boolean flag = findElement(list, string);
// 打印
System.out.println("list集合中包含\"" + string + "\"吗?" + flag);
printArrayList(list);
}
/**
* 这是一个遍历集合的方法。
*
* @param list
* 集合
*/
private static void printArrayList(ArrayList<String> list) {
// //使用增强for循环,遍历集合
// for (Object object : list) {
// System.out.println((String)object);
// }
// 创建迭代器
Iterator<String> it = list.iterator();
System.out.println("集合中的元素有:");
// 使用迭代器,遍历集合
// hasNext(),如果指针后面还有元素,将返回true。若没有,返回false
while (it.hasNext()) {
String str = it.next();
System.out.print(str + " ");
}
}
/**
* 这是一个查找集合中是否有指定对象
*
* @param list
* 指定集合
* @param string
* 指定对象
* @return 返回是否存在
*/
private static boolean findElement(ArrayList<String> list, String string) {
boolean flag = list.contains(string);
return flag;
}
}