am
List接口
特点:
①:有序集合(怎么存怎么取) ②:有下标(每个元素插入位置精确控制) ③:允许重复元素,equals方法比较是否重复元素
List接口的常用子类有:ArrayList集合、Linkedlist集合
常用方法
除了 add(E e)和 remove,其他都是list接口独有 带下标
list主要就是带下标的方法
package com.oracle.demo01;
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
//创建list接口
List<String> list=new ArrayList<String>();
list.add("123");
list.add("abc");
//指定位置插入指定元素
list.add(1,"456");
//删除指定位置上的元素
String s=list.remove(1);
System.out.println("删除元素为"+s);
//替换指定位置上的元素
String str=list.set(0,"小猪佩奇");
System.out.println("替换的元素为"+str);
//遍历
for(int i=0;i<list.size();i++){
//在123 和abc之间插入456
System.out.println(list.get(i));
}
}
}
Iterator的并发修改异常
迭代器 增强for存在的意义: 遍历
并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素
package com.oracle.demo01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo02 {
public static void main(String[] args) {
List<String> arr=new ArrayList<String>();
arr.add("a");
arr.add("b");
arr.add("c");
//在遍历时判断该集合中是否有"b"元素,如果有则在该位置添加一个"d"
//获取迭代器对象
Iterator<String> it=arr.iterator();
while(it.hasNext()){
String s=it.next();
if(s.equals("b")){
arr.add("d");
}
}
}
}
List集合存数据的结构
堆栈结构 先进后出
2 队列结构集合 先进先出
3 数组结构集合 因为有下标 查找快 增删慢
4 链表结构集合 :查找慢因为没下标 增删快
LinkedList集合
collection和list的子类 拥有它们的方法 存储 链表结构
首尾常用操作方法
package com.oracle.demo01;
//Linkedlist集合
import java.util.LinkedList;
public class Demo03 {
public static void main(String[] args) {
//新建Linkedlist纯子类对象
LinkedList<String> arr= new LinkedList<String>();
//First谁在最后写 谁就是第一个 Last 自动往后堆加
arr.addFirst("a");
arr.addFirst("b");
arr.addLast("c");
arr.addLast("d");
//获取集合中第一个元素
System.out.println("集合中第一个元素为"+arr.getFirst());
//获取集合中最后一个元素
System.out.println("集合中第一个元素为"+arr.getLast());
//删除集合中第一个元素
arr.removeFirst();
//再删一个元素
arr.removeFirst();
//删除集合中最后一个元素
arr.removeLast();
//增强for遍历
for(String s:arr){
System.out.println(s);//bacd
}
//判断集合里的元素是否为空
if(!arr.isEmpty()){ //isEmpty 判断集合有没有元素
System.out.println("该集合不为空");
}
}
}
Vector集合
Enumeration 早期的迭代器常见方法
Vector集合已被ArrayList集合替代 枚举 Enumeration已被迭代器 iterator替代
vector常见方法:
Enumeration 常用方法
pm
Set接口
接口及子类没有独有的方法,无下标
学存储结构,学它为什么不能存重复元素
HashSet集合 是数组和链表的结合,无序
哈希表特点:
不能保证的迭代顺序与元素存储顺序相同
集合元素可以是null,但只能放入一个null
不是同步
采用哈希表存储数据,唯一性的方式依赖于:hashCode()与equals()方法
HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等
package com.oracle.demo01;
import java.util.HashSet;
public class Demo04 {
public static void main(String[] args) {
//构造一个哈希set
HashSet<String> set=new HashSet<String>();
set.add("a");
set.add("a");
set.add("b");
//遍历
for(String s:set){
System.out.println(s);//a b 不能存重复元素
}
}
}
String类的HashCode方法
------------------------------------------------
package com.oracle.demo01;
public class Demo05 {
public static void main(String[] args) {
String a="abc";
String b="abc";
//调用hashCode方法
System.out.println(a.hashCode());//96354 hashCode是obj的方法
System.out.println(a.hashCode());
}
}
------------------------------------------------
package com.oracle.demo01;
public class Person {
private String name;
private int age;
//空参
public Person(String name, int age) {
super();
//有参
this.name = name;
this.age = age;
}
//get set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
//哈希方法
public int hashCode() {
return name.hashCode()+age;
}
@Override
//equals方法
public boolean equals(Object obj) {
if(obj==this){
return true;
}
if(obj instanceof Person){
Person p=(Person)obj;
//比内容 比年龄
return this.name.equals(p.name)&&this.age==p.age;
}
return false;
}
}
---------------------------------------------------
package com.oracle.demo01;
import java.util.HashSet;
public class Demo06 {
public static void main(String[] args) {
HashSet<Person> set=new HashSet<Person>();
set.add(new Person("a",18));
set.add(new Person("b",17));
set.add(new Person("c",19));
set.add(new Person("c",19));
for(Person p:set){
System.out.println(p);
}
}
}
HashSet不能存重复元素的原因
快捷键:哈希方法和equals方法
alt+shift+s Generate hashCode()and equals()
LinkedHashSet
总结:List、Set三个接口,存取元素时,有什么特点
都是单列元素的集合,有一个共同的父接口Collection。
Set不允许有重复的元素,
存元素:add方法有boolean返回值,当集合中没有某个元素,add方法成功加入该元素时,返回true 当集合含有与某个元素equals相等的元素时,add方法无法加入该元素,返回false。
取元素:没法说取第几个,只能Iterator接口取得所有元素,再逐一遍历各个元素。
List有先后顺序的集合,
存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可插队,调用add(int index,Object)方法,可以指定当前对象在集合中的存放位置。
取元素:方法1:Iterator接口取得所有,逐一遍历各个元素
方法2:调用get(index i)明确说明取第几个。
LinkedHashSet和HashSet 区别:
linked是hashset的子类,比它功能多,可以保证元素怎么存和取
package com.oracle.demo01;
import java.util.LinkedHashSet;
public class Demo07 {
public static void main(String[] args) {
LinkedHashSet<String> set=new LinkedHashSet<String>();
set.add("abc");
set.add("aaa");
set.add("bcd");
set.add("abc");
for(String s:set){
System.out.println(s);
}
}
}
判断集合元素唯一的原理
ArrayList的contains
作业:
将"goOd gooD stUdy dAy dAy up"
每个单词的首字母转换成大写其余还是小写字母(不许直接输出good good study day day up 要用代码实现)
package com.oracle.demo01;
public class zuoye {
public static void main(String[] args) {
/*将"goOd gooD stUdy dAy dAy up"
每个单词的首字母转换成大写其余还是小写字母(不许直接输出good good study day day up 要用代码实现)*/
String str="goOd gooD stUdy dAy dAy up";
//步骤:把每个单词截取 正则表达式
String[] strs=str.split(" ");
StringBuffer buffer=new StringBuffer();
//遍历6好元素
for(int i=0;i<strs.length;i++){
//所有字母都变小写
String small=strs[i].toLowerCase();
//截取首字母 substring
String head=small.substring(0,1);
//将字母转大写
head=head.toUpperCase();
//把首字母之后的字母取出来
String body=small.substring(1);
//拼接字符串
buffer.append(head+body+" ");
}
String s=buffer.toString();
System.out.println(s);
}
}