集合能保存一组任意类型数据的元素(只能保存引用数据类型,基本数据类型会经过包装类自动包装成对象),并且可以自动扩容,比数组更具优势
Java中集合由两大接口代表Collection
和Map
Collection接口
List接口 : 有序(元素存入的顺序和元素在集合当中真实的顺序一致)有重复
-
ArrayList实现类
ArrayList它是基于数组实现的,内部其实是创建了一个长度为10的Object类型数组,当元素个数超过10,ArrayList会自动扩容到原来的1.5倍
数组是一种静态线性表,逻辑是连续的,物理也是连续,所以ArrayList它随机查询速度较快,它的插入删除速度慢
Vector它是基于数组实现的,它与ArrayList它的区别就在于Vector是数据同步的(线程安全)
List list = new ArrayList();
// add添加元素
list.add("hello");
list.add(false);
// size元素个数
System.out.println(list.size());
// boolean isEmpty 返回true表示size等于0
System.out.println(list.isEmpty());
-
LinkedList实现类
LinkedList它是基于链表实现的,链表是动态线性表,逻辑是连续的,物理不是连续,所以
LinkedList随机查询速度较慢,它的插入删除速度快
LinkedList list = new LinkedList<>();
list.add(false);
list.add(1);
list.add("hello");
//拓展
list.addFirst(12);
list.addLast("你好");
list.removeFirst();
list.removeLast();
Set接口 : 无序(元素存入的顺序和元素在集合当中真实的顺序不一致)无重复
-
HashSet实现类
Set set = new HashSet<>();
set.add("hello");
set.add(1);
set.add(false);
-
TreeSet(使用较少)
Map接口 : 以键值对的形式保存元素,无序
-
HashMap,数据不同步(线程不安全) null也可以作为key或者value
Map map = new HashMap<>();
// 添加元素方法put
map.put(null, "你好11");
map.put(2, null);
map.put(1, "你好1");
map.put(4, "你好1");
System.out.println(map.size());
System.out.println(map.get(2));
// 返回是否包含某key值或value值
System.out.println(map.containsKey(1));
System.out.println(map.containsValue("你好1"));
HashTable,与HashMap相比,数据同步(线程安全),null不可以作为key或者value
泛型 : 类型参数化
强行规定集合只存某种类型的数据
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
List<Student> list3 = new ArrayList<>();
Set<String> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
Set<Student> set3 = new HashSet<>();
Map<String, String> map1 = new HashMap<String, String>();
Map<String, Integer> map2 = new HashMap<String, Integer>();
Map<String, Student> map3 = new HashMap<String, Student>();
遍历
List遍历
public class Demo7 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// 1.不推荐
// for(int i = 0;i < list.size();i++) {
// System.out.println(list.get(i));
// }
// 2.迭代器接口 -- 专门用来遍历的
// Iterator iter = list.iterator();
// while(iter.hasNext()) { // iter.hasNext() 若游标右侧有元素,则返回true
// String str = (String)iter.next(); //iter.next()取出游标右侧的元素,并将游标向右移动一位
// System.out.println(str);
// }
// 3.强烈推荐
for(String str : list) {
System.out.println(str);
}
}
}
Set遍历
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set.add("D");
// 1.foreach
for(String str : set) {
System.out.println(str);
}
// 2.迭代器接口 -- 专门用来遍历的
Iterator iter = set.iterator();
while(iter.hasNext()) { // iter.hasNext() 若游标右侧有元素,则返回true
String str = (String)iter.next(); //iter.next()取出游标右侧的元素,并将游标向右移动一位
System.out.println(str);
}
}
Map遍历
public class Demo9 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("java1", "good");
map.put("java2", "very good");
map.put("java3", "very very good");
// 1.迭代器
// keySet()返回map中key值的Set集合
// Set<String> set = map.keySet();
// 遍历key值,利用map的get方法获取value值
// Iterator<String> iter = set.iterator();
// while(iter.hasNext()) {
// String key = iter.next();
// System.out.println(key+","+map.get(key));
// }
// 2.1 foreach
// for(String key : map.keySet()) {
// System.out.println(key+","+map.get(key));
// }
// 2.2 Entry遍历 --推荐
// Entry是Map接口中的内部接口
// map.entrySet()把map集合中每一组键值对都封装成一个Entry类型的对象存入了一个集合
// Set<Entry<String, String>> sets = map.entrySet();
for(Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+","+entry.getValue());
}
}
}
集合综合练习之学员打卡
Student.java
public class Student {
private int stuid;
private String name;
public Student() {}
public Student(int stuid, String name) {
super();
this.stuid = stuid;
this.name = name;
}
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
SignInfo.java
/**
* 打卡信息类,每一个对象代表了一个打卡记录
* @author Administrator
*
*/
public class SignInfo {
private int stuid;// 打卡学员的学号
private Date sign_in;// 签到时间
private Date sign_out;// 签退时间
public SignInfo() {}
public SignInfo(int stuid, Date sign_in, Date sign_out) {
super();
this.stuid = stuid;
this.sign_in = sign_in;
this.sign_out = sign_out;
}
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public Date getSign_in() {
return sign_in;
}
public void setSign_in(Date sign_in) {
this.sign_in = sign_in;
}
public Date getSign_out() {
return sign_out;
}
public void setSign_out(Date sign_out) {
this.sign_out = sign_out;
}
}
Java2.java
public class Java2 {
// 学员名单 -- Java2班中有哪些学员
private List<Student> stuList = new ArrayList<>();
// 打卡信息名单
private Map<String, List<SignInfo>> signMap = new HashMap<>();
public List<Student> getStuList() {
return stuList;
}
public void setStuList(List<Student> stuList) {
this.stuList = stuList;
}
public Map<String, List<SignInfo>> getSignMap() {
return signMap;
}
public void setSignMap(Map<String, List<SignInfo>> signMap) {
this.signMap = signMap;
}
/**
* 添加学员
* @param s 要录入班级名单的学员对象
*/
public void addStu(Student s) {
if(stuList != null) {
System.out.println("添加一名新学员成功");
stuList.add(s);
}
}
/**
* 根据id查找学员
* @param stuid 学员的id
* @return 对应id的学员对象,如果不存在返回null
*/
public Student findStu(int stuid) {
if(stuList != null) {
for(Student stu : stuList) {
if(stu.getStuid() == stuid) {
return stu;
}
}
}
return null;
}
}
Test.java
package com.neuedu.repeat_object;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
// 要求在控制台打印出这个字符串中有哪些字符,每个字符出现多少次
/*
Map
s 1
d 10
f 33
g 2
q 5
w 3
e 1
*/
String str = "abcdabcdefgabcd发生大幅释放更多符合风格化风格化风格化的";
char words[] = str.toCharArray();
Map<Character,Integer> map = new HashMap<>();
for(char c : words){
if(map.containsKey(c)){
int num = map.get(c);
map.put(c,num+1);
}
else{
map.put(c,1);
}
}
System.out.println(map);
}
}