集合框架
首先要知道为什么学集合框架?
数组有什么缺点?
1.数组中元素类型必须保持一致
2.后期不能更改数组长度,在定义数组时已经定好长度
集合框架的好处:
1.集合框架中可以存储任意对象类型
2.集合框架中的元素可以随意增删
集合框架的继承关系:
1.集合框架的最顶层接口有两个:Conllection接口和map接口
2.Collection接口下有子接口:Set接口,Queue接口,List接口
a.Set接口的实现类有:HashSet类(重点) TreeSet类 LinkedHashSet类等
b.Queue接口的实现类:LinkedList类等
c.List接口的实现类:ArrayList类(重点) LinkedList类 Vector类
Stack类等
三种接口的特点:
Set接口:表示容器中元素不重复,无序无下标,取值高效.系统用的比较多
List接口:表示容器中元素可以重复,有序有下标就是正常数组
Queue接口:JDK1.5新增,与上面两个接口相比主要区分在于Queue容器关键在于存储数据,而不是处理数据(比如增删,遍历等)
3.Map接口的实现类:HashMap类(重点) HashTable类 LinkedHashMap类TreeMap类等
Map接口:容器中元素的存储形态是键值对,无序,没有下标.key–value
在开发中使用最多的是:ArrayList类HashSet类HashMap类
list接口
//list接口
//1.多态方式创建对象 import java.util.List;
List<String> list1=new ArrayList<>();
//初始容量 可不写
//2.添加元素
list1.add("呵呵");
list1.add("哈哈");
list1.add("嘻嘻");
//在指定位置添加元素
list1.add(1, "嘿嘿");
list1.add("嘻嘻");
//添加多个元素 add
List<String> list2=new ArrayList<>();
list2.add("李易峰");
list2.add("杨洋");
list2.add("言承旭");
//将list2整体添加到list1中
list1.addAll(0,list2);
System.out.println(list1);
//3.判断容器中是否包含某个/某些元素 contains
System.out.println(list2.contains("李易峰"));//一个
System.out.println(list1.containsAll(list2));//多个
//4.通过下标 获取元素 get
System.out.println(list2.get(1));
//5.通过元素 获取下标 indexOf
//a.从前往后查找 indexOf()
int index=list1.indexOf("嘿嘿");
System.out.println(index);
//b.从后往前找
index=list1.lastIndexOf("嘻嘻");
System.out.println(index);
//6.通过下标修改元素 set
list1.set(1, "小泽");
System.out.println(list1);
//7.获取多个子元素 subList
List<String> childElement=list1.subList(0, 3);
System.out.println(childElement);
//8.删除元素
//a.按照下标删除
list1.remove(1);
//b.直接删除对象
list1.remove("嘻嘻");//如果对象重复 只删除第一次出现的对象
// list1.removeAll(list2);
System.out.println(list1);
//9.遍历容器
//size() 数组容器中的元素个数
//a. 普通方式 以后尽量不要用啦!
for(int i=0;i<list1.size();i++) {
System.out.print(list1.get(i)+" ");
}
System.out.println("--------------");
//b. 对象级别的遍历 以后尽量用这个啦!
for (String string : list1) {
System.out.print(string+" ");
}
- 在集合中添加数据的方法是add()
- 查看容器中是否含有某个/某些元素方法是contains()
- 通过下标 获取元素 get()
- 通过元素 获取下标 indexOf()
- 通过下标修改元素 set()
- 获取多个子元素 subList()
参数1:开始的下标
参数2:结束的下标 - 删除元素 remove()
ArrayList类 ,是List接口的实现类的新方法特征!!!
ArrayList<String> arrayList=new ArrayList<>();
arrayList.add("妹子");
arrayList.add("汉子");
arrayList.add("女汉子");
System.out.println(arrayList);
//1.克隆 clone
ArrayList<String> arrayCopy= (ArrayList<String>) arrayList.clone();
System.out.println(arrayCopy);
//如果以下写法呢???
ArrayList<String> array1=arrayList;//相同的内存空间
array1.set(0, "软妹子");//修改元素
System.out.println(array1);
System.out.println(arrayList);//改变
System.out.println(arrayCopy);//不改变
//2.手动增加容器容量(了解)
arrayList.ensureCapacity(10);
//3.释放内存优化内存 当确定不在操作时才会释放内存空间(了解)
arrayList.trimToSize();
Java中谁能开辟新空间只有new和克隆
克隆跟new一样都是开辟一个新内存空间,好比克隆羊多莉是另外一个个体本体在怎么变,克隆体都不变
Set接口
//1.创建对象
Set<String> set1=new HashSet<>();
//2.添加元素
set1.add("喜之螂");
set1.add("托儿索");
set1.add("娃娃鱼");
set1.add("提款姬");
set1.add("托儿索");//去除重复
//3.删除元素
set1.remove("娃娃鱼");
System.out.println(set1);
//4.查询是否包含某个元素
System.out.println(set1.contains("托儿索"));
//5.遍历数组
for (String string : set1) {
System.out.println(string);
}
Map接口,存储形态是键值对 元素成对存在!无序没有下标!
//1.创建对象
Map<String, String> map=new HashMap<>();
//2.添加元素 put()
map.put("Q", "天音波/回音波 ");
map.put("W", "金钟罩/铁布衫");
map.put("E", "天雷破/摧筋断骨");
map.put("R", "猛龙摆尾");
//?键值对可以重复吗
//在map中值可以重复
//在map中,重复添加键,相当于修改操作
map.put("R", "火箭");
map.put("D", "金钟罩/铁布衫");
System.out.println(map);
//3.put() 也可以修改元素
//4.通过键获取值
String value=map.get("R");
System.out.println(value);
//5.获取所有的键
Set<String> allKeys=map.keySet();
System.out.println(allKeys);
//6.获取所有值
Collection<String> allValues= map.values();
System.out.println(allValues);
for (String string : allValues) {
System.out.println(string);
}
//7.按照键 删除值
map.remove("D");
System.out.println(map);
//8.替换(极少用) 本质还是Put
map.replace("Q", "一技能");
//9.判断某个键key 是否存在
System.out.println(map.containsKey("F"));
//10.判断某个值value 是否存在
System.out.println(map.containsValue("哈哈"));
//11.遍历
for (String string : allValues) {
System.out.println(string);
}
//或者
for (String string : allKeys) {
System.out.print(string);
}
//12.容器通用方法 清空容器
// map.clear();
System.out.println(map);
System.out.println("====================");
//---------------------------
//迭代器----功能就是为了遍历容器
//优势: 集合框架中任何容器都能使用!
Iterator<String> it=allValues.iterator();
while(it.hasNext()) {
String str=it.next();
System.out.println(str+"#");
}
Iterator<String> it2=allKeys.iterator();
while (it2.hasNext()) {
String string =it2.next();
System.out.println(string+"*");
}
1.如果我们需要保留存储顺序,并且保留重复元素,使用List
2.如果查询较多,使用ArrayList
3.如果存取较多使用LinkedList
4.如果需要使用多线程安全访问,使用Vector
5.如果我们不需要保留顺序并且不需要重复元素,使用Set
6.如果需要元素排序,使用TreeSet
7.如果不需要排序使用HashSet,因此其效率高于TreeSet
8.如果我们既需要保存存储顺序,又不想元素重复那么使用LinkedHashSet
学了集合框架实用
用集合接收各种数据如:
创建一个girl类
private String name;
private int age;
private String phone;
private String adress;
public Girl() {
}
public Girl(String name, int age, String phone, String adress) {
super();
this.name = name;
this.age = age;
this.phone = phone;
this.adress = adress;
}
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;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
@Override
public String toString() {
return "Girl [name=" + name + ", age=" + age + ", phone=" + phone + ", adress=" + adress + "]";
}
创建一个测试类:
Girl girl=new Girl("丽丽",20,"111","郑州");
Girl girl2=new Girl("梅梅",21,"000","杭州");
Girl girl3=new Girl("花花", 31,"777","广州");
Girl girl4=new Girl("依依", 18,"444","兰州");
ArrayList<Girl> girlsArray=new ArrayList<>();
girlsArray.add(girl);
girlsArray.add(girl2);
girlsArray.add(girl3);
girlsArray.add(girl4);
Collections.sort(girlsArray, new Girl());
for (Girl girl5 : girlsArray) {
System.out.println(girl5);
}
练习一:
图书管理系统:
1.定义图书类
属性:编号 书名 作者 价格 书籍类型(如 玄幻 文学等)
2.定义图书管理类
方法:
a.添加书籍
b.按照书名查询书籍
c.卖书,通过卖书修改书籍数量(主要不要负数)
d.通过编号,删除书籍
e.通过书籍类型,查询所有书籍
自己做做试试不会点着里
练习二
联系人管理:
1.联系人类:姓名 电话 地址
2.联系人管理类:
- a.通过首字母给联系人分组添加到通讯录中!
- b.通过电话查询联系人
- c.通过姓名删除联系人(注意,如果当前分组只剩下最后一个人需要将分组也删除)
- d.查看有几个分组,以及一共几个联系人
- e.通过姓名,修改联系人的电话
自己做做试试不会点着里