Collection接口
集合概述
-
是单例集合的顶层接口,它表示一组对象,这些对象也被称为Collection的元素
-
JDK不提供此接口的任何直接实现,它提供更具体的子接口(Set和List)实现
创建Collection集合的对象
-
多态的方式
-
具体的实现类ArrayList
public static void main(String[] args){ //创建Collection集合对象 Collection<String> c = new ArrayList<String>(); //添加元素,boolean add(元素类型与<String>相同) c.add("sanbaiqiqi"); c.add("三百七七"); System.out.println( c.add("三百七七")); //输出:true System.out.println(c); //输出:[sanbaiqiqi,三百七七] 被重写了特定形式输出 }
ArrayList集合类
-
ArrayList类是List接口的一个具体实现类
-
ArrayList对象实现了可变大小的数组
-
随机访问和遍历元素时,它提供更好的性能
方法名 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()、add()、size()、contains(Object o) 、remove(Object o)
public static void main(String[] args){
//创建集合对象
Collection<String> c = new ArrayList<>(String);
c.add("hello");
c.add("world");
c.add("java");
//移除指定元素
System.out.println(c.remove("world")); //输出 true [hello,java]
System.out.println(c.remove("javaee")); //输出false,"javaee"不在集合中
//void clear() 清空集合中的元素
c.clear(); //输出[ ]
//boolean contains(Object o):判断集合中是否存在指定的元素
Sysotem.out.println(c.contains("world")); //true
//boolean isEmpty():判断集合是否为
Sysotem.out.println(c.isEmpty()); //集合没有内容输出true;有元素为false
//int size():集合的长度(集合中元素的个数)
Sysotem.out.println(c.size());
}
Alt+7快捷键可以看到类的所有信息
LinkedList集合类
-
LinkedList类是List接口的一个具体实现类
-
LinkedList 类用于创建链表数据结构
-
插入或者删除元素时,它提供更好的性能
-
特有功能:
方法名 说明 void addFirst(Object o) 在列表的首部添加元素 void addLast(Object o) 在列表的末尾添加元素 Object getFirst() 返回列表中的第一个元素 Object getLast() 返回列表中的最后一个元素 Object removeFirst() 删除并返回列表中的第一个元素 Object removeLast() 删除并返回列表中的最后一个元素
Collection集合的遍历(迭代器Iterator< E >)
-
Iterator< E > iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到,所以说依赖集合存在
-
方法:
E next():返回迭代中的下一个元素
boolean hasNext():如果迭代具有更多元素,则返回true
public static void main(String[] args){
//创建集合对象
Collection<String> c = new ArrayList<>(String);
//添加元素
c.add("hello");
c.add("world");
c.add("java");
Iterator<String> it = c.iterator(); //Iterator是接口
/* System.out.println(it.next());
System.out.println(it.next());
System.out.println(it.next()); 第四次会报错*/
//用while循环改进迭代,判断是否有元素
while(it.hasNext()){
// System.out.println(it.next());
String s = it.next();
System.out.println(s);
}
}
/* 输出java
world
java
没有就停止,不报错
*/
List接口
集合概述
-
有序集合(序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
-
允许重复的元素
集合特点
-
有序:存储和取出的元素顺序一致
-
可重复性:存储的元素可重复
public static void main(String[] args){
//创建集合对象
List<String> list = new ArrayList<>(String);
list.add("hello");list.add("world");list.add("java");
list.add("hello");
//void add(int index, E element):添加元素:指定索引位置插入,超出范围报错
list.add(1,"javaee");
//E remove(int index):删除指定索引处的元素,返回被删除的元素
System.out.println(list.remove(1));
Sysem.out.println(list);
//输出:world [hello,java]
//E set(int index, E element):修改指定索引处的元素,返回被修改的元素
System.out.println(list.set(1,"三百七七"));
Sysem.out.println(list);
//输出:world [hello,三百七七,java]
//E get(int index):返回指定所引出元素
System.out.println(list.get(2));
//输出:java
//输出集合对象
Sysem.out.println(list);
//输出:[hello,world,java,hello] 顺序性和重复性
**************************************************************
//迭代遍历
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
/* 输出:
hello
world
java
hello
*/
}
//遍历集合, 用for循环遍历
for(int i = 0; i<list.size(); i++){
String s = list.get(i);
System.out.println(s);
}
}
ListIterator列表迭代器
-
通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
-
用于允许程序员沿任意方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
-
常用方法:
-
E next(): 返回迭代中的下一个元素
-
boolean hasNext():如果迭代器具有更多元素,则返回true
-
E previous(): 返回列表中的上一个元素
-
boolean hasPrevious(): 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
-
void add(E e):将指定的元素插入列表
-
List集合子类的特点:
ArrayList:
-
底层数据结构是数组,查询快,增删慢
LinkedList
-
底层数据结构是链表,查询慢,增删快
public static void main(String[] args) {
//创建集合对象
ArrayList<String> array = new ArrayList<String>();
array.add("三百七七");
array.add("张缤智");
array.add("王焕君");
//增强for遍历:
for(String a : array){
System.out.println(a);
}
System.out.println("--------");
LinkedList<String> linkedList = new LinkedList<String>();
linkedList.add("三百七七");
linkedList.add("Aurora");
linkedList.add("Ethereal");
for(String s : linkedList){
System.out.println(s);
}
}
Set接口
Set:
-
不包含重复元素的集合,HashSet:对集合的迭代顺序不做任何保证
-
没有带索引的方法,所以不能使用普通for循环遍历
-
HashSet是Set接口常用的实现类
-
Set中存放对象的引用
-
注意的是Set接口不存在get方法,也就是没有List接口中通过索引取值的方法。
public static void main(String[] args) {
// 创建集合对象
Set<String> set = new HashSet<String>();
//添加元素
set.add("1111");
set.add("2222");
set.add("3333");
set.add("3333"); //不会添加进集合
//遍历
for(String s : set){
System.out.println(s);
}
}
/*输出: 1111
2222
3333
*/
哈希值:
是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值;object类中有一个方法可以获取对象的哈希值public int hashCode(),返回对象的哈希码值。
-
默认情况下:不同对象的哈希值是不同的
-
通过方法重写:可以实现不同对象的哈希值是相同的,哈希值是return返回值
public static void main(String[] args) {
// 创建学生对象
Student s1 = new Student("三百七七",22);
//同一对象多次调用hashCode()方法返回的哈希值是相同的
System.out.println(s1.hashCode()); //1080497174
System.out.println(s1.hashCode()); //1080497174
//默认情况下:不同对象的哈希值是不同的
//通过方法重写:可以实现不同对象的哈希值是相同的,哈希值是return返回值
/*在Student类中重写:
@Override
public int hashCode(){
return 0;
}
*/
Student s2 = new Student("三百七七",22);
System.out.println(s2.hashCode()); //779325750
//相同
System.out.println("重地".hashCode()); //1179395
System.out.println("通话".hashCode()); //1179395
}
HashSet集合特点:
-
HashSet是Set接口的实现类,底层数据结构是哈希表
-
对集合的迭代顺序不做任何保证,即不保证存储和取出的元素顺序一致
-
没有带索引的方法,所以不能使用普通for循环遍历
-
由于是Set集合,所以不包含重复元素的集合
public static void main(String[] args) { HashSet<String> hs = new HashSet<String>(); //添加元素 hs.add("1111"); hs.add("2222"); hs.add("3333"); hs.add("3333"); //遍历 for(String s : hs){ System.out.println(s); } }
LinkedHashSet集合:
-
继承HashSet,哈希表和链表实现的Set接口,具有可预测的迭代次序
-
由链表保证元素有序,即元素的存储和取出孙旭是一致的
-
由哈希表保证元素唯一,即没有重复的元素
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();
TreeSet集合:
-
间接使用Set接口,是Set集合,不包含重复的元素
-
元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体的方式取决于构造方法。
-
TreeSet():根据其元素的自然顺序进行排序
-
TreeSet(Comparator comparator):根据指定的比较器进行排序。
-
-
没有带索引的方法,所以不能使用普通for循环遍历
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add(10);
ts.add(30);
ts.add(20);
ts.add(40);
//自然排序,从小到达
for(Integer i : ts){
System.out.println(i);
}
}
增强for循环
增强for循环:简化数组和Collection集合的遍历
-
实现Iterable接口的类允许其对象成为增强型for语句的目标
-
它是JDK5之后出现的,其内部原理是一个Iterator迭代器
-
格式:
for(元素数据类型 变量名 : 数组或者Collection集合){ //此处使用变量即可,该变量就是元素 } //示例: int[] arr = {1,2,3,4}; for(int i : arr){ System.out.println(i); } String[] strAray = {"hello","三百七七","java"}; for(String s : strAray){ System.out.println(s); } //集合增强for循环 List<String> list = new ArrayList<String>(); list.add("三百七七"); list.add("张缤智"); list.add("王焕君"); for(String s2 : list){ System.out.println(s2); } //内部原理是一个Iterator迭代器 for(String s2 : list){ if(s2.equals("张缤智")){ list.add("yu"); //抛出并发修改异常:ConcurrentModificationException,所以…… } }