一道Java集合框架题


         问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出。

     要求:分别用List、Map、Set来实现,打印的信息包括学号、姓名和成绩。


1、使用List集合来实现

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.TreeMap;



public class Test2{
	
	public static void main(String[] args){
		
		/* 此处用ArrayList实现
		 * 
		 * ArrayList<Student>al=new ArrayList<Student>();
		for(int i=20070301,j=10;i<=20070330;i++,j++)
	    {
	        al.add(new Student(i,(int) (40*Math.random()+60), "同学"+j));
	    }
		
		//ArrayList排序借助Collections中的sort()方法实现。
		Collections.sort(al, new Sortbygrade());
		for(Student sd:al)
		System.out.println(sd);
		
		*/
		
		LinkedList<Student> lt=new LinkedList<Student>();
		for(int i=20070301,j=10;i<=20070330;i++,j++)
	    {
	        lt.add(new Student(i,(int) (40*Math.random()+60), "同学"+j));
	    }
		
		//对链表排序
		Collections.sort(lt, new Sortbygrade());
		//输出链表
		for(Student sd:lt)
			System.out.println(sd);
		
	}
	
}



//学生类
class Student{
	int num,grade;
	String name;
	
	//构造函数
	public Student(int num,int grade,String name){
		
		this.num=num;
		this.name=name;
		this.grade=grade;
	}
	
	//此处必须覆写
	public String toString(){
//		System.out.println("hi");
		return "学号:"+this.num+"\t"+"姓名:"+this.name+"    "+"成绩:"+this.grade;
	}
	
}

//创建一个比较器类
class Sortbygrade implements Comparator<Student>{

	@Override
	public int compare(Student s1, Student s2) {
		
		if(s1.grade>s2.grade)
			return 1;
		if(s1.grade<s2.grade)
			return -1;
		if(s1.grade==s2.grade)
			return s1.name.compareTo(s2.name);
		return 0;		
		
	}
	
}


 


输出结果如图:




对List集合框架的总结:


1、List集合其实是一个动态的数组,元素可以直接通过for循环取出,而不需要迭代。

2、输出List集合时,会默认调用集合中存储对象的toString()方法,所以在类中需要进行覆写。

若不覆写toString( )方法,则必须使用

for(int i=0;i<lt.size();i++)
{
	Student s=lt.get(i);
	System.out.println("学号:"+s.num+"    姓名:"+s.name+"    成绩:"+s.grade);
}



 

3、List集合的排序需要借助于Collections工具类,即Collections.Sort(list,new 比较器类())方法。所以需要自定义一个比较器类,定义自己的比较规则。



2、使用Set集合来实现

(1)使用TreeSet来实现

package com.package1;

import java.util.*;

public class StuScore {

public static void main(String[] args) {

    TreeSet<Student> ts=new TreeSet<Student>(new Com());
    //添加元素进去
    for(int i=20070301,j=1;i<=20070330;i++,j++)
    {
        ts.add(new Student(i,"同学"+j,(int) (40*Math.random()+60)));
    }

    //迭代循环取出
    Iterator<Student> it=ts.iterator();
    while(it.hasNext())
    {
        Student o1=it.next();
        System.out.println("学号:"+o1.num+"  "+"姓名:"+o1.name+"  "+"  "+"成绩:"+o1.grade);

    }

}
}
//学生类
class Student 
{
int num;
int grade;
String name;


public Student(int num, String name,int grade)
{
    this.num=num;
    this.name=name;
    this.grade=grade;
}
}
class Com implements Comparator
{

@Override
public int compare(Object o1, Object o2) {

    Student s1=(Student) o1;
    Student s2=(Student) o2;
    if(s1.grade>s2.grade)
        return 1;
    if(s1.grade<s2.grade)
        return -1;
    if(s1.grade==s2.grade)
    {
        return new Integer(s1.num).compareTo(new Integer(s2.num));
    }
    return 0;
}
}

输出结果为:

学号:20070307  姓名:同学16    成绩:60
学号:20070309  姓名:同学18    成绩:60
学号:20070314  姓名:同学23    成绩:61
学号:20070318  姓名:同学27    成绩:61
学号:20070322  姓名:同学31    成绩:61
学号:20070306  姓名:同学15    成绩:62
学号:20070310  姓名:同学19    成绩:64
学号:20070302  姓名:同学11    成绩:66
学号:20070308  姓名:同学17    成绩:68
学号:20070321  姓名:同学30    成绩:68
学号:20070330  姓名:同学39    成绩:69
学号:20070303  姓名:同学12    成绩:70
学号:20070320  姓名:同学29    成绩:70
学号:20070323  姓名:同学32    成绩:77
学号:20070313  姓名:同学22    成绩:78
学号:20070304  姓名:同学13    成绩:79
学号:20070324  姓名:同学33    成绩:83
学号:20070326  姓名:同学35    成绩:84
学号:20070327  姓名:同学36    成绩:85
学号:20070311  姓名:同学20    成绩:88
学号:20070305  姓名:同学14    成绩:89
学号:20070329  姓名:同学38    成绩:89
学号:20070316  姓名:同学25    成绩:90
学号:20070301  姓名:同学10    成绩:95
学号:20070312  姓名:同学21    成绩:96
学号:20070317  姓名:同学26    成绩:97
学号:20070319  姓名:同学28    成绩:97
学号:20070325  姓名:同学34    成绩:98
学号:20070315  姓名:同学24    成绩:99
学号:20070328  姓名:同学37    成绩:99


对TreeSet的总结:

1、元素不可以重复,而且TreeSet是有序的。

2、两种排序方法:

(1)自定义一个比较器类,比如class Com implementsComparator{ }  ,实现compare(Object o1, Object o2)方法,在其中定义比较规则。

(2)让元素自身具备比较性。
步骤:将add进TreeSet中的元素实现Comparable接口,并且覆盖compareTo方法。这种顺序也是元素的自然顺序,或者叫做默认顺序。


方法1和方法2的区别:

两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。

       用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。



(2)使用HashSet来实现

package com.package1;

import java.util.*;




public class StuScore {

	public static void main(String[] args) {
		
		HashSet<Student> hs=new HashSet<Student>();
		//添加元素进去
		for(int i=20070301,j=1;i<=20070330;i++,j++)
		{
		
			hs.add(new Student(i,"同学"+j,(int) 

(40*Math.random()+60)));
		}
		
		ArrayList<Student>li=new ArrayList(hs);
		
		Collections.sort(li, new Sortbygrade());
		
		for(Student ss:li)
			System.out.println(ss);
		

	}

}
//学生类
class Student 
{
	int num;
	int grade;
	String name;

	
	public Student(int num, String name, int grade)
	{
		this.num=num;
		this.name=name;
		this.grade=grade;
	}
	public String toString(){
		//System.out.println("hi");
		return "学号:"+this.num+"\t"+"姓名:"+this.name

+"    "+"成绩:"+this.grade;
	}
	
	
}


class Sortbygrade implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		
		Student s1=(Student) o1;
		Student s2=(Student) o2;
		if(s1.grade>s2.grade)
			return 1;
		if(s1.grade<s2.grade)
			return -1;
//		if(s1.grade==s2.grade)
		
		return 0;
	}
	
}

输出结果如下:

学号:20070310 姓名:同学19    成绩:60
学号:20070330 姓名:同学39    成绩:62
学号:20070326 姓名:同学35    成绩:63
学号:20070317 姓名:同学26    成绩:64
学号:20070318 姓名:同学27    成绩:65
学号:20070322 姓名:同学31    成绩:65
学号:20070301 姓名:同学10    成绩:67
学号:20070328 姓名:同学37    成绩:68
学号:20070304 姓名:同学13    成绩:68
学号:20070319 姓名:同学28    成绩:69
学号:20070313 姓名:同学22    成绩:70
学号:20070303 姓名:同学12    成绩:71
学号:20070312 姓名:同学21    成绩:71
学号:20070329 姓名:同学38    成绩:72
学号:20070306 姓名:同学15    成绩:72
学号:20070324 姓名:同学33    成绩:72
学号:20070305 姓名:同学14    成绩:75
学号:20070315 姓名:同学24    成绩:75
学号:20070314 姓名:同学23    成绩:78
学号:20070307 姓名:同学16    成绩:80
学号:20070311 姓名:同学20    成绩:81
学号:20070302 姓名:同学11    成绩:83
学号:20070309 姓名:同学18    成绩:84
学号:20070320 姓名:同学29    成绩:85
学号:20070321 姓名:同学30    成绩:85
学号:20070316 姓名:同学25    成绩:86
学号:20070327 姓名:同学36    成绩:90
学号:20070308 姓名:同学17    成绩:94
学号:20070323 姓名:同学32    成绩:94
学号:20070325 姓名:同学34    成绩:95



对HashSet的总结:

1、HashSet中的元素不可以重复,如果重复添加,则只会显示一个。

原理如下:

HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

2、HashSet是如何保证元素唯一性的呢?
答:是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。

3、对HashSet的排序,通过将Set集合转化为List集合,借助Collections.Sort( )方法实现排序。




3、使用TreeMap来实现

 

package com.package1;



import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class TestTreeMap {

	public static void main(String[] args) {
		//1.创建集合
		TreeMap<Student,Integer> tm=new TreeMap<Student,Integer>();
		for(int i=20070301,j=10;i<=20070330;i++,j++)
		{
			int grade=(int) (40*Math.random()+60);
			 //2、往集合对象中添加元素
			 tm.put(new Student(grade,"同学"+j),i);
		}
		
		//3.遍历集合 ,排序完成	
		Set<Student> k=tm.keySet();
		Iterator<Student> it=k.iterator();
		
		while(it.hasNext()){
			Student key=it.next();
			Integer num=tm.get(key);
			
			System.out.println("学号:"+num+"    "+"姓名:"+key.name+"    "+"成绩:"+key.grade);
		}
	}

}

class Student implements Comparable<Student>{
	int grade;
	String name;
	
	public Student(int grade,String name){
		this.grade =grade;
		this.name=name;
	}

	@Override
	public int compareTo(Student o) {
		
		if(this.grade>o.grade)  
			return 1;  
			if(this.grade==o.grade)  
			{  //当成绩相同时,按照姓名排序
			 return this.name.compareTo(o.name);  
			}  
			return -1;  

	}
	

	
}


 

输出结果为:

学号:20070303    姓名:同学12    成绩:61
学号:20070323    姓名:同学32    成绩:61
学号:20070317    姓名:同学26    成绩:62
学号:20070309    姓名:同学18    成绩:64
学号:20070301    姓名:同学10    成绩:67
学号:20070304    姓名:同学13    成绩:69
学号:20070322    姓名:同学31    成绩:69
学号:20070328    姓名:同学37    成绩:70
学号:20070305    姓名:同学14    成绩:71
学号:20070319    姓名:同学28    成绩:73
学号:20070321    姓名:同学30    成绩:74
学号:20070310    姓名:同学19    成绩:81
学号:20070315    姓名:同学24    成绩:82
学号:20070307    姓名:同学16    成绩:84
学号:20070330    姓名:同学39    成绩:84
学号:20070312    姓名:同学21    成绩:85
学号:20070324    姓名:同学33    成绩:87
学号:20070306    姓名:同学15    成绩:88
学号:20070308    姓名:同学17    成绩:90
学号:20070327    姓名:同学36    成绩:90
学号:20070318    姓名:同学27    成绩:91
学号:20070316    姓名:同学25    成绩:92
学号:20070320    姓名:同学29    成绩:92
学号:20070314    姓名:同学23    成绩:93
学号:20070313    姓名:同学22    成绩:94
学号:20070302    姓名:同学11    成绩:95
学号:20070325    姓名:同学34    成绩:95
学号:20070329    姓名:同学38    成绩:97
学号:20070326    姓名:同学35    成绩:98
学号:20070311    姓名:同学20    成绩:99



对TreeMap的总结:

1、TreeMap默认对key进行排序,所以可将自定义对象放入key中,将代表学号的整型放入value中。对Key排序时,可以指定自定义对象中的某个属性来排序。

2、Map集合使用put()方法添加元素。

3、Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

map集合的两种取出方式:

(1)Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。

(2)Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry






转载于:https://www.cnblogs.com/lanzhi/p/6467303.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java面试八股文(2023版) 1. Java基础知识 Java的特点和优势;Java中的数据类型;Java中的关键字;Java中的流程控制语句;Java中的面向对象编程思想;Java中的异常处理机制;Java中的多线程编程;Java中的集合框架Java中的IO流;Java中的反射机制。 2. JVM JVM的概念和作用;JVM内存模型;JVM垃圾回收机制;JVM性能调优。 3. 数据库 数据库的基本概念;SQL语句的基本语法;MySQL数据库的基本操作;数据库索引的作用和使用;数据库事务的原理和实现;数据库连接池的作用和实现。 4. Spring框架 Spring框架的概念和作用;Spring框架中的IoC和AOP思想;Spring框架中的Bean管理;Spring框架中的事务管理;Spring框架中的Web开发;Spring框架中的数据访问。 5. Web开发 Web开发的基本概念;HTTP协议的基本原理;Web框架的基本概念和作用;Servlet的生命周期和使用;JSP的基本语法和使用;MVC设计模式在Web开发中的应用;RESTful风格的Web服务的设计和实现。 6. 分布式系统 分布式系统的基本概念;分布式系统中的消息传递机制;分布式系统中的RPC远程调用;分布式系统中的负载均衡和高可用性;分布式缓存的实现和使用。 7. 大数据技术 大数据技术的基本概念和作用;Hadoop的基本原理和使用;Hive的基本原理和使用;Spark的基本原理和使用;NoSQL数据库的基本概念和使用。 8. 网络安全 网络安全的基本概念;网络攻击的类型和防御措施;密码学的基本概念和应用;SSL/TLS协议的原理和实现;OAuth2.0协议的原理和应用。 以上内容是Java面试的基本八股文,需要注意的是,光是背诵这些知识点是不够的,还需要通过实际项目经验来加深对这些知识点的理解和掌握。 ### 回答2: 2023年的Java八股文面试会根据当时的技术趋势和行业需求有所变化,但我可以给您提供一些可能出现的目示例: 1. 请解释Java中的面向对象编程概念,并说明其在实际项目中的应用和优势。 2. 请描述Java中的多态性和继承,并比较它们的异同点。 3. 请解释Java中的异常处理机制,并说明为什么它在开发过程中很重要。 4. 请介绍Java中的集合框架,并举例说明如何使用不同类型的集合来解决实际问。 5. 请描述Java中的线程概念,并说明如何使用线程来实现并发编程和提高应用性能。 6. 请解释Java中的反射机制,并说明其在框架开发和动态代码生成方面的应用。 7. 请介绍Java中的I/O流,并说明如何利用流来读写文件和网络数据传输。 8. 请解释Java中的数据库访问方式,并介绍常用的数据库连接池技术。 9. 请介绍Java中的设计模式,并以常用的设计模式为例说明如何应用到实际项目开发中。 10. 请说明Java中的垃圾回收机制,并介绍不同垃圾回收算法的原理和适用场景。 以上只是可能出现的目示例,具体的面试目会根据招聘方的需求和面试官的喜好来定。在回答这些问时,除了准确回答问,还应该注重展示自己在实际项目中的经验和解决问的能力。同时,补充一些相关的Java技术趋势和新兴技术也有助于提升回答的水平。 ### 回答3: 面试Java八股文面试2023 Java八股文面试2023是一道针对Java开发岗位的面试,旨在考察应聘者对Java编程语言以及相关技术的掌握程度和实际应用能力。以下是我对该的回答: Java是一种面向对象的编程语言,广泛应用于互联网开发和软件工程领域。Java八股文面试2023主要涵盖如下几个方面: 1. Java基础知识:面试官可能会问及Java的基本语法、数据类型、运算符、流程控制语句等。回答时需要清晰明了地介绍这些基本概念,并给出简洁明了的示例。 2. 面向对象编程:需要对面向对象的概念、封装、继承、多态等有深入的理解。同时还要了解Java提供的关键字和特性,如类、接口、抽象类、重写、重载、单例模式等。 3. Java集合框架:介绍Java集合框架中的常用数据结构,例如List、Set、Map,以及它们的特点、用法和适应场景。此外,还需回答如何选择合适的集合类以及它们的性能比较与优化。 4. 异常处理与线程:要掌握Java中的异常处理机制,了解异常类的继承关系以及如何捕获和处理异常。同时,还要熟悉线程的基本概念、创建和启动线程的方式,以及线程同步与互斥机制。 5. 数据库与JDBC:需要了解数据库的基本概念与常用操作,例如SQL语句的编写、事务处理以及数据库连接池的使用。另外,对Java数据库连接技术(JDBC)有一定的了解,知道如何与数据库进行交互。 6. JavaWeb开发:包括对Java的Web开发框架、Servlet、JSP、Spring等的了解。需要掌握JavaWeb开发的基本流程,明白前端与后端交互的原理,以及如何处理请求和相应。 在回答这个面试时,应聘者需要清晰地表达自己对Java编程的理解,并将自己的学习经历和项目经验与目要求相结合,展示出自己在Java开发方面的实际能力和解决问的经验。同时,需要注重举例说明,以便面试官更好地理解和评估你的回答。 这是对Java八股文面试2023的回答,希望能对广大应聘者有所帮助。祝大家面试顺利!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值