JAVA程序设计实用教程 第四章 习题4 (2)

  • Post author:
  • Post category:java



4-11  java为什么需要声明基本数据类型的包装类?基本数据类型的包装类有哪些?


为何要使用包装类型?

  • 基本类型不是类,不能new出来,因此不具备面对对象的功能,无法调用方法。
  • 在一个类或接口或方法中定义一个泛型的数据类型,当使用这个类、接口、方法时,要把泛型定义成具体的基本数据类型就必须使用基本数据类型对应的包装类进行定义。


4-12  当两个串的对应位置字符都相同而长度不同时,哪个较大?举例说明。p120

class Main
{
	public static void main(String args[])
	{
		String s1=new String("abc");
		String s2=new String("adc");
		String s3=new String("abcde");
		String s4=s1;
		String s5=new String("abc");
		
		System.out.println(s1==s4);
		System.out.println(s1==s5);
		
		System.out.println(s1.equals(s2));
		System.out.println(s1.equals(s3));
		System.out.println(s1.equals(s5));
		
	}
}


4-13  怎样将数值类型的数据转换成字符串?怎样将字符串的转换成数值类型的数据?

class Main
{
	public static void main(String args[])
	{
		String s1=new String("123");
		int i=Integer.parseInt(s1);
		
		int j=456;
		String s2=String.valueOf(j);
		System.out.println(i);
		System.out.println(s2);
		
	}
}


4-14  对数值,变量或对象进行比较操作,什么时候采用6个关系运算符或调用equals(),compareTo()方法?是否每个对象都可以调用equals()和compareTo()方法?为什么?这两个方法在进行比较操作时有什么差别?他们在每个类中的含义都相同吗?

每个对象都可以调用equals()方法,因为每个类都继承了Object类,equals()方法是Object类中的方法。

只有实现了comparable接口,并重写了compareTo()方法的类才能使用compareTo()方法

因为基本数据类型的包装类都继承了Object类,实现了comparable接口,所以都可以用

关系运算符是最简单也最容易理解的,如果关系运算符的两边是基本数据类型或者基本数据类型包装类的对象,比如int x,double y,Integer z,那么关系运算符就用来单纯的比较他们的数值大小

如果等号两边放的是两个对象,那么就会比较他们在

内存

当中的地址。除了等号以外的关系运算符不能用于比较对象。


返回值是true或false

class text{
	int x;
	public text(){
		
	}
	public text(int x){
		this.x=x;
	}
}


class Main
{
	public static void main(String args[])
	{
		int a=10;
		int b=20;
		Integer x=new Integer(10);
		Integer y=new Integer(10);
		Double d1=2.45;
		Double d2=2.56;  
		String s1="abc";
		String s2="bvc";
		text t1=new text();
		text t2=new text();
		
		System.out.println(a==b); //基本数据类型之间比较的是数值
		System.out.println(a>=b);
		
		System.out.println(x==y); //对象之间比较的是地址值
		System.out.println(x>=y);
		
		System.out.println(d1==d2); //对象之间比较的是地址值
		System.out.println(d1>=d2);
		
		
		System.out.println(s1==s2); //对象之间比较的是地址值
		//System.out.println(s1>=s2);报错,没有重载
		
		System.out.println(t1==t2);
		//System.out.println(t1>=t2); 报错,没有重载
	}
}

compareTo()实际上是获取的字符串(也可以是其他对象)的长度,然后作减法,这里的减法就是ASCII码的减法,所以

compareTo()会返回数字



如果两个字符串内容相同,会返回0,字符串a大于字符串b,会返回相差的ASCII码的正数,字符串a小于字符串b,会返回相差的ASCII码的负数。

在基本数据类型的包装类中可以直接使用   对象1.compareTo(对象2) 的方式进行比较,对象1与对象2必须是同一种类型,即对象1是Integer类型的,那么对象2 也必须是Integer类型的。

如果是自己定义的类,必须先实现compara接口,重写compareTo()方法,在方法体内自己定义比较的方法。

class text implements Comparable{
	int x;
	public text(int x){
		this.x=x;
	}
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		//补充自己定义的比较大小的方法
		return 0;
	}
}


class Main
{
	public static void main(String args[])
	{
		int a=10;
		int b=20;
		Integer x=Integer.valueOf(a);
		String s1="abc";
		
		Boolean b1=false;
		Boolean b2=b1;
		
		System.out.println(x.compareTo(Integer.valueOf(b)));
		System.out.println(s1.compareTo("cdv"));
		System.out.println(b1.compareTo(b2));
	}
}

在String包装类中的compareTo源码:

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

equals是先用等号(==)直接来比较两个对象在内存当中的地址,如果相等会直接返回true,如果这两个对象的地址不一样,就会考虑这两个对象是不是String类型的,如果是String类型的,那先比较两个字符串长度是否一样,如果长度不一致,那100%不相等,直接返回false。长度一致则逐个比较

class text {
	int x;
	public text() {
		
	}
	public text(int x){
		this.x=x;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj.getClass()!=this.getClass()) {
			return false;
		}
		return this.x==((text)obj).x||this.x*10==((text)obj).x;  //重写equals方法
		
	}
	
}


class Main
{
	public static void main(String args[])
	{
		String s1="abc";
		String s2="mbn";
		
		Integer i1=2;
		Integer i2=10;
		
		text t1=new text(10);
		text t2=new text(100);
		
		
		System.out.println(s1.equals(s2));
		System.out.println(i1.equals(i2));
		System.out.println(t1.equals(t2)); //如果没重写,结果是false;
	}
}

equals源码:

public boolean equals(Object anObject) {
  if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}


4-15  System类,Class类和Runtime类各有哪些功能?在之前的程序中已用到这些类的哪些常量或方法?p121


4-16  怎样引用java.util包的类?

import java.util.*;


4-17  怎样表示日期与时间数据?怎样获得当前日期与时间?怎样获得当前日期的年月日?


4-18  java.util.Comparator<T>接口有什么作用?在什么情况下需要使用?



版权声明:本文为JYHZZ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。