2.集合
标签(空格分隔): 6.2Java高级
一 Java集合框架
二 List接口的实现类
1. ArryList集合类
(1) 简介
(2)常用方法
- 增-add()
al.add(“hello”); //在末尾增加元素
al.add(1, “hello”); //增加在指定位置
al.add(12); //集合不支持基本数据类型!!!!!!!
al.add(15.5);
// al.add(new Student(“jack”,20));
al.add(stu);//同上
al.add(new Student(“rose”,21));
- //集合不支持基本数据类型!!!!!!!
-
删-remove()
al.remove(“12”);//删除指定内容
System.out.println(al.contains(12));
System.out.println(al.get(1));
al.remove(1);//删除指定位置元素
System.out.println(al.get(1)); -
查-get()
System.out.println(al.get(1)); -
判断列表中是否存在指定元素-contains();返回布尔值
System.out.println(al.contains(12));//true
System.out.println(al.contains(new Integer(12)));//true 比较的是值System.out.println(al.contains(stu));//true System.out.println(al.contains(new Student("jack",20)));//false 比较的是地址
- /*
contains里面默认调用的是equals方法
Object (基类)的equals方法默认比较的就是地址
Integer类重写了这个方法 所以比较的是值
String
*/
- /*
(3) ArryList的三种遍历方法
//1.传统for循环遍历
for(int i=0;i<al.size();i++){
System.out.println(al.get(i));
}
//2.使用增强型for循环遍历 往里面扔的都是Object 所以拿出来的还是Object
for(Object obj: al){
System.out.println(obj);
}
//3.迭代器返回值
//iterator() 返回的是迭代器
Iterator it = al.iterator();
while(it.hasNext()) { //hasNext()如果有下一个元素返回真 否则返回假
//当代码执行到这里的时候表示有下一个
Object obj = it.next();//获取里边对象
System.out.println(obj);
}
2. LinkedList集合类
(1)简介
(2)常用方法
(3)和ArryList的区别
- LinkedList 增/删速度较快
ArryList 遍历速度较快
3. Stack类
(1)简介
- Stack 栈----先进后出(后进先出)–LIFO(last in first out)
- //创建Stack类对象 Stack stack=new Stack();
(2)方法
重点在查
//1.查看栈顶对象
System.out.println(stack.peek());
//2.遍历Stack集合中的元素(利用pop返回删除值的特性)
int size=stack.size();//要放在外边,如果i<stack.size(),i值越来越大,size值会逐渐变小
for(int i=0;i<size;i++){
System.out.println(stack.pop());//移除并返回删除值
}
三 set集合
(1)简介
- set 无序且唯一
* 无序是指 添加顺序和输出顺序是不一致的,我们无法控制
- 借助HashSet创建集合对象
Set set=new HashSet();
(2)常用方法
//添加集合元素
set.add(10);
set.add(20);
set.add(30);
set.add(40);
set.add(50);
set.add(new Student("jack",20));
set.add(new Student("jack",20));
/*
* 去重(留第一个值为去重,留最后一个值为覆盖)
*
* 在上午的ArrayList中 对比两个对象 是不是同一个的时候
* 我们知道底层对比的是调用equals方法(重写了Object的equals方法)
* 在Set去重的时候,不光要对比是否是同一个对象(比的是“值”)
* 还要比较在内存中是否是同一个,这个时候需要重写Object的public int hashCode()
* 以此来判断是不是同一个。
*/
//遍历集合元素
//方法1:使用增强for循环进行遍历
for(Object obj: set){
System.out.println(obj);
}//两个student对象的内存地址不一致,若只想显示一个 重写equals的底层代码,去除地址判断部分
//方法2:迭代器Iterator
Iterator it=set.iterator() ;
while(it.hasNext()){
System.out.println(it.next());//读取值的方法next()
}
//方法3:将集合转换为数组后遍历
Object[] arr=set.toArray();//声明数组 开辟空间 赋值set.toArray()
for(int i=0;i<set.size();i++){
System.out.println(arr[i]);
}
四 Map接口
(1)简介
- Map 里面存放的是key value的映射对
* key要求是唯一的
* value可以不唯一
* 可以根据key来获取value
* 实例对象借助HashMap创建
(2)方法
//增加值--关键字put()
hm.put(1,"a");
hm.put("a", "A");
hm.put("jack", new Student("jack",18));
hm.put("jack", new Student("jack",21));
System.out.println(hm.get("jack"));//这里key是唯一的 ,出现重复时,会对前边的进行覆盖
//遍历(重点!!!)
//方法1:返回key的集合来遍历HashMap
Set keys=hm.keySet();
for(Object key: keys){
System.out.println("key->"+key+" |value->" +hm.get(key));
}
//方法2:返回所有的value遍历输出(无法获取key)
Collection values = hm.values(); //返回所有value的集合
Iterator it = values.iterator();
while(it.hasNext()) {
System.out.println("values->"+it.next());
}
//方法3: 使用EntrySet完成HashMap的遍历
Set entrySet = hm.entrySet(); //返回的是Entry对象的集合,Entry对象中包括了一对kv
Iterator it2 = entrySet.iterator();
while(it2.hasNext()) {
Object obj = it2.next(); //返回的是Object需要向下转型(父类不能调用子类)
Entry entry = (Entry)obj;
System.out.println("key->"+entry.getKey()+" | value->"+entry.getValue());
}
(3)习题
利用HashMap来完成如下需求:
* 这个字符串中每个字母出现的次数
* key -> value
* a->3 z->2 …
// 创建对象
char[] charArray=str.toCharArray();//将str转为数组
HashMap hm = new HashMap();
String str="dhadnhafscfsfdfvdfvdvdsfscs";
for(int i=0;i<charArray.length;i++){
if(hm.containsKey(charArray[i])){
//集合中已有这个字符(value值增加1)
hm.put(charArray[i], (Integer) hm.get(charArray[i])+1);
//hm的两个属性都是对象,所以值需要手动装箱(集合不支持基本类型)
}else{
//第一次遇到这个字符(设置key,value值初始为1)
hm.put(charArray[i], 1);
}
}
//遍历
Set aa=hm.keySet();
for(Object a: aa){
System.out.println("key->"+a+" |value->" +hm.get(a));
}
![image_1d56svm27p8pvgg1r8teci1qfn9g.png-15.9kB][23]
五 泛型
(1)简介
//
* 在以前的ArrayList中存在一个问题,我在向集合中添加元素的时候
* 是所有类型的元素都可以直接添加进去,因为接受参数的类型是Object
* 我在取出元素的时候 的数据类型也是Object
* 既然是Object
* 那么当我需要调用子类独有的属性和方法的时候 只能向下转型
(2)代码操作
//HashMap在泛型中的使用 申明一个指定key是String类型 value是Student类型的HashMap
HashMap<String, Student> hm=new HashMap<String, Student>();
//增--注意提示的数据类型
hm.put("jack", new Student("jack",20));//未按照指定类型输入会报错
hm.put("rose", new Student("rose",21));
hm.put("tom", new Student("tom",22));
hm.put("kathy", new Student("kathy",23));
hm.put("kate", new Student("kate",24));
//HashMap遍历
//1.利用返回的key集合读取所有值
Set<String> keys=hm.keySet();
//注意 标注强数据类型(否则下一行会出错,因为keys的类型不标注还是Object对象)
for(String key: keys){
System.out.println("key->"+key+" |value->"+hm.get(key));
}
//2.返回所有的value遍历输出(无法获取key)
Collection<Student> values=hm.values();
for(Student value: values){//这里的value就是stu对象实例化
System.out.println("name->"+value.getName()+" |age->"+value.getAge());
}
//3.用EntrySet + Iterator完成对HashMap的读值遍历
Set<Entry<String, Student>> entrySet=hm.entrySet();//利用entrySet()方法返回一组kv对应值
Iterator<Entry<String, Student>> it=entrySet.iterator();//创建entrySet的迭代器
//需要添加类型
while(it.hasNext()){
Entry<String, Student> entry=it.next();
System.out.println("key->"+entry.getKey()+" |value->"+entry.getValue());
}
}
六 Collections集合的工具类的使用
(1)简介
(2)常用方法
- (2-1)对象之间比较大小
- 步骤:
1.查看Integer和String的Comparable接口底层代码后发现,能对比是因为他们都实现了Comparable接口未实现的方法—继承Comparable接口,实现其抽象方法
- 2.发现他的抽象方法不符合实际应用—重写(借鉴Integer和String的对比代码)
(2-2)重写comparator方法
- 步骤:
- 新创建一个类文件
2.重写/自定义我们需要的比较方法
3.根据需要调用