内部比较器与外部比较器

compare的返回值

 

商品类

1.实现Comparable<Product> 接口

2.生成get set方法

3.重写toString方法

4.重写compareTO方法

5.构造方法

完整商品类源码

package com.chinasofti.comparator;
/**
 * 内部排序
 * @author Administrator
 *
 */
public class Product implements Comparable<Product> {
	private String title;
	private double price;
	private int saleVolume;
	public Product() {}
	public Product(String title, double price, int saleVolume) {
		this.title=title;
		this.price = price;
		this.saleVolume =saleVolume;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getSaleVolume() {
		return saleVolume;
	}

	public void setSaleVolume(int saleVolume) {
		this.saleVolume = saleVolume;
	}

	@Override
	public int compareTo(Product o) {
		if(o.getPrice()>this.getPrice()) {
			return -1;
		}else if(o.getPrice()<this.getPrice()) {
			return 1;
		}
		return 0;
	}

	@Override
	public String toString() {
		return "Product [title=" + title + ", price=" + price + ", saleVolume=" + saleVolume + "]";
	}
	
}

 

商品测试类

完整源码

package com.chinasofti.comparator;

import java.util.Arrays;

public class ProductTest {
	public static void main(String[] args) {
		Product p1=new Product("费列罗巧克力",45.2,1200);
		Product p2=new Product("Java教材",29,119);
		Product p3=new Product("针织开衫",345.2,5200);
		Product p4=new Product("三星手机",1999,3900);
		Product[] products = new Product[] {p1,p2,p3,p4};
		Arrays.sort(products);
		for (Product product : products) {
			System.out.println(product);
		}
	}
}

构造方法没有写(补上商品类第五步)

按价格排序

 

外部比较器

学生类

package com.chinasofti.comparator;

public class Student {
	private String name;
	private int age;
	private double score;
	
	public Student() {
		super();
	}
	
	public Student(String name, int age, double score) {
		super();
		this.name = name;
		this.age = age;
		this.score = score;
	}

    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 double getScore() {
		return score;
	}

	public void setScore(double score) {
		this.score = score;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
	}
	
	
}

学生成绩比较类(比较两个参数)

比较成绩

package com.chinasofti.comparator;

import java.util.Comparator;

public class StudentScoreComparator implements Comparator<Student> {

	@Override
	public int compare(Student o1, Student o2) {
		//升序排序
		if(o1.getScore()>o2.getScore()) {
			return 1;
		}else if(o1.getScore()<o2.getScore()) {
			return -2;
		}
		return 0;
	}

}

比较年龄

package com.chinasofti.comparator;

import java.util.Comparator;

public class StudentAgeComparator implements Comparator<Student> {

	@Override
	public int compare(Student o1, Student o2) {
		//升序排序
		if(o1.getAge()>o2.getAge()) {
			return 1;
		}else if(o1.getAge()<o2.getAge()) {
			return -2;
		}
		return 0;
	}

}

测试类

package com.chinasofti.comparator;

import java.util.Arrays;

public class StudentTest {
	public static void main(String[] args) {
		Student s1 = new Student("张三", 12, 100);
		Student s2 = new Student("李四", 22, 10);
		Student s3 = new Student("王五", 24, 80);
		Student s4 = new Student("不知道", 20, 60);
		Student[] students = new Student[] {s1,s2,s3,s4};
		//Arrays.sort(students, new StudentScoreComparator());
		Arrays.sort(students, new StudentAgeComparator());
		for (Student student : students) {
			System.out.println(student);
		}
	}
}

 

1.类的加载过程  

JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示:

1) 装载:查找并加载类的二进制数据;

2)链接:

验证:确保被加载类的正确性;

准备:为类的静态变量分配内存,并将其初始化为默认值;

解析:把类中的符号引用转换为直接引用;

3)初始化:为类的静态变量赋予正确的初始值;

          那为什么我要有验证这一步骤呢?首先如果由编译器生成的class文件,它肯定是符合JVM字节码格式的,但是万一有高手自己写一个class文件,让JVM加载并运行,用于恶意用途,就不妙了,因此这个class文件要先过验证这一关,不符合的话不会让它继续执行的,也是为了安全考虑吧。

        准备阶段和初始化阶段看似有点牟盾,其实是不牟盾的,如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后,先进行链接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的,所以此时a等于int类型的默认初始值0,即a=0,然后到解析(后面在说),到初始化这一步骤时,才把a的真正的值10赋给a,此时a=10。

2. 类的初始化

    类什么时候才被初始化:

1)创建类的实例,也就是new一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName("com.lyj.load"))

5)初始化一个类的子类(会首先初始化子类的父类)

6)JVM启动时标明的启动类,即文件名和类名相同的那个类

         只有这6中情况才会导致类的类的初始化。

     类的初始化步骤:

        1)如果这个类还没有被加载和链接,那先进行加载和链接

        2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)

         3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

3.类的加载

      

 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。看下面2图

         类的加载的最终产品是位于堆区中的Class对象
        Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口

加载类的方式有以下几种:

 1)从本地系统直接加载

2)通过网络下载.class文件

3)从zip,jar等归档文件中加载.class文件

4)从专有数据库中提取.class文件

5)将Java源文件动态编译为.class文件(服务器)

4.加载器


JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
--------------------- 
作者:gjanyanlig 
来源:CSDN 
原文:https://blog.csdn.net/gjanyanlig/article/details/6818655 
版权声明:本文为博主原创文章,转载请附上博文链接!

### 回答1: 外部比较器内部比较器是两种不同类型的比较器外部比较器是指一个独立于被比较对象的比较器,通常由一个专门的电路或器件实现。外部比较器可用于比较两个不同的输入信号,例如将两个不同的模拟信号或数字信号进行比较,以确定它们的相对大小或是否相等。外部比较器通常需要在电路板上进行布线并与其他电路元件连接。 内部比较器是指在处理器芯片内部实现的比较器内部比较器可以用于比较处理器内部的寄存器值,例如比较两个内部寄存器的值以确定它们的相对大小或是否相等。内部比较器通常由处理器的指令集中的特定指令实现。 总之,外部比较器内部比较器区别在于它们的实现位置和使用范围。外部比较器用于比较两个外部信号,而内部比较器用于比较处理器内部的寄存器值。 ### 回答2: 外部比较器内部比较器是在电子电路设计中常见的两类比较器。它们的主要区别在于其工作原理和应用场景。 首先,外部比较器是指在电路设计中使用独立器件构建的比较器。通常由操作放大器等电子元件组成。外部比较器能够接受外部输入信号,并通过比较输出不同电平来表达输入信号之间的关系。这种比较器具有较高的灵活性和可调性,可以根据具体应用要求进行电路设计的调整和优化。外部比较器常用于模拟电路中的电压比较、信号监测等应用,并且需要外部电源供电。 而内部比较器是集成在微控制器(MCU)或其他数字电路中的比较器。它们在芯片内部实现,通常是以特殊功能模块的形式出现。内部比较器通过比较输入信号大小来产生输出,可以用于检测电压水平、判断信号正负等功能。内部比较器的工作通常依赖于芯片的供电电压,不需要额外的电源电压,更加紧凑和节省空间。内部比较器通常具有较低的功耗和快速的响应速度,非常适合于嵌入式系统中对电平进行快速判断和处理的应用。 总的来说,外部比较器内部比较器在电路设计中具有不同的优势和应用范围。外部比较器具有更高的灵活性和可调性,适用于需要自定义电路的模拟信号处理应用;而内部比较器则更适合集成在数字电路中,提供了紧凑、低功耗和快速响应的优势,适用于嵌入式系统和数字电路中对电平快速判断的应用。 ### 回答3: 外部比较器内部比较器是在电路中使用的两种不同类型的比较器。 首先,外部比较器是一种独立的电路组件,通常由多个电子元件(如晶体管、电阻和电容等)组成。它需要外部电源来供电,并通过外部输入信号进行比较处理。外部比较器通常具有较高的输入电压范围和较快的响应速度,适用于工业领域和高速应用。 相比之下,内部比较器是在集成电路中的一部分,通常与其他电路单元(如微处理器)集成在一起。它在芯片内部工作,并且通过内部电路直接连接到其他电路单元,无需额外的电源或输入信号线。内部比较器的输入电压范围通常较窄,而且响应速度较慢,但它们更为便捷和节省成本,适用于嵌入式系统和低功耗应用。 此外,外部比较器通常具有较高的功耗和占用空间,而内部比较器的功耗和占用空间更小。由于内部比较器与其他电路单元集成在一起,数据传输和处理的效率更高。然而,内部比较器可能会受到芯片温度、供电电压和其他电路单元的干扰,可能会有一些不确定性和误差。 综上所述,外部比较器内部比较器在电路结构、工作方式和应用领域上存在着一些明显的区别。选择使用哪种类型的比较器,取决于具体的应用需求和优先考虑的因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值