2.集合

2.集合

标签(空格分隔): 6.2Java高级


一 Java集合框架

image_1d56q046eik7ce01t8016gtqet9.png-236kB

image_1d56q1a1a1vaa16lc2g51lljv0om.png-158.6kB

二 List接口的实现类

image_1d56q7aqh9pdknj89h1fuv1er113.png-170.2kB

1. ArryList集合类

(1) 简介

image_1d56q9nkecm6id21vcj10eopo01g.png-71.6kB

(2)常用方法

image_1d56qbfsrjt51el91hnl1bl01vrr1t.png-139.2kB

  • 增-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的三种遍历方法

image_1d56rgk233e51ue9jh710rp1rvb34.png-138.1kB

    //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);
	}

image_1d56qtehll0f1ca2jbsp0bmjp2a.png-84kB

image_1d56rde8l1uub1dio1bokapf1nma2n.png-8.2kB


2. LinkedList集合类

(1)简介

image_1d56rjrdr1io51go61rmr1fbv93h.png-37.6kB

(2)常用方法

image_1d56rkh5m135kb4eph81obi9om3u.png-78.3kB

(3)和ArryList的区别

image_1d56ro5rmp9tom8111nepthkm4b.png-87.4kB
image_1d56s283u1q2st2f1kuu8uh1h0n4o.png-87.5kB

  • LinkedList 增/删速度较快
    ArryList 遍历速度较快

3. Stack类

(1)简介

  • Stack 栈----先进后出(后进先出)–LIFO(last in first out)
  • //创建Stack类对象 Stack stack=new Stack();

image_1d56s5gg71e6cum71966ma9105i55.png-153.1kB

(2)方法

image_1d56s9ieo1ec31rhhe451q5d17ig62.png-66.7kB

image_1d56sb2n719ed1kvl11ag1a8ush6f.png-77kB

重点在查
//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 无序且唯一
      * 无序是指 添加顺序和输出顺序是不一致的,我们无法控制
      image_1d56sebiu680jqsqc16e31iff7c.png-175.3kB
      image_1d56sinrr1p5o51c1sekb8i132486.png-79.2kB
  • 借助HashSet创建集合对象
    Set set=new HashSet();

(2)常用方法

image_1d56sghk51m7p1djjmc988g1bc17p.png-67.3kB

//添加集合元素
	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()
	 * 以此来判断是不是同一个。
	 */ 

image_1d56sp3s01is31hlv7jtvj31bqq93.png-98.4kB

//遍历集合元素
	//方法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创建
    image_1d56t76fbifigqlg6u19f9m349t.png-6.5kB

(2)方法

image_1d56td5qf51o20c1gln1va5bd5b6.png-92.9kB

//增加值--关键字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是唯一的 ,出现重复时,会对前边的进行覆盖

image_1d56tabap1bm422e5cp8071cniap.png-92.5kB

//遍历(重点!!!)
	//方法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
	 * 那么当我需要调用子类独有的属性和方法的时候 只能向下转型

image_1d56tr7sfdcqqat1glkh611j7ccq.png-51.5kB

image_1d56tjas41d30b2ojrg1jiirs4bj.png-116.6kB

image_1d56tjq9b149n1ub31a7a6sm37dc0.png-123.8kB

image_1d56tkauaqgugjndikoj11mkvcd.png-62.6kB

(2)代码操作
image_1d56tte4b1umam85acj9t81d0d7.png-89.8kB

//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));

image_1d56u3c011p7nesgdmulu7c4qf4.png-105.8kB

	//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)简介

image_1d56u69581ip0rvsfhak6q1c9jfh.png-176.2kB

(2)常用方法
image_1d56u75vl1jajgc41fd280gmocfu.png-53.9kB
image_1d56ua8n8vv91mo81dod1e26113fgo.png-51.3kB

image_1d56ub4bh13p91ktb8qa18081v94h5.png-40kB

image_1d56u7ppgh4r4d11b0e1hms42bgb.png-38.9kB
image_1d56ueprt9qj1abtknl1kf6sgkii.png-76kB

  • (2-1)对象之间比较大小
  • 步骤:
    1.查看Integer和String的Comparable接口底层代码后发现,能对比是因为他们都实现了Comparable接口未实现的方法—继承Comparable接口,实现其抽象方法
    image_1d56uhj48hcndiq2ehr611igeiv.png-22.4kB
  • 2.发现他的抽象方法不符合实际应用—重写(借鉴Integer和String的对比代码)
    image_1d56uicge1nve1h10gqr28f47qjc.png-56.6kB

(2-2)重写comparator方法

  • 步骤:
  1. 新创建一个类文件
    image_1d56v876d1fn81f9isje1eduaccjp.png-34.2kB
    2.重写/自定义我们需要的比较方法
    image_1d56v9hmi1hj1fsm1krlchitt8k6.png-16.1kB
    3.根据需要调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值