JAVA从入门到精通习题

JAVA从入门到精通习题

1.编写一个程序,定义局部变量sum,并求出1+2+3+…+99+100之和,赋值给sum,并输出sum的值。

public class Test {

    public static void main(String args[]){
        int sum=0;
        for(int i=1;i<=100;i++){
            sum=sum+i;
        }
        System.out.println("1+2+3+...+100="+sum);

    }
}

2.编写程序,要求运行后要输出long类型数据的最小数和最大数。

public class Test {

    public static void main(String args[]){
        Long m=Long.MAX_VALUE;
        Long n=Long.MIN_VALUE;
        System.out.println("long类型的最大数是:"+m+",最小数是:"+n);

    }
}

3.编写程序,计算表达式“((123456799)>(976543213))? true : false”的值。

public class Test {

    public static void main(String args[]){
        Boolean result=((12345679*9)>(97654321*3))?true:false;
        System.out.println(result);

    }
}

4.编写程序,实现生成一随机字母(a-z,A-Z),并输出,运行结果如下图所示。
拓展知识。
⑴ Math.random()返回随机 double 值,该值大于等于 0.0 且小于 1.0。
例如: double rand = Math.random(); // rand 储存着[0,1) 之间的一个小数
⑵ 大写字母A~Z对应整数65 ~ 90、小写字母a~z对应整数97 ~ 122。

public class Test {

    public static void main(String args[]){
        int a=(int)(Math.random()*(122-65)+65);
        if(a>=65&&a<=90||a>=97&&a<=122){
            System.out.println((char)a);
        }else{
            System.out.println("无字母输出");
        }
    }
}

5.编写程序,实现产生(或输入)一随机字母(a-z,A-Z),转为大写形式,并输出。

public class Test {

    public static void main(String args[]){
        int a=(int)(Math.random()*(122-65)+65);
        if(a>=65&&a<=90){
            System.out.println("转换前:"+(char)a);
            System.out.println("转换后:"+(char)a);
        }else if(a>=97&&a<=122){
            System.out.println("转换前:"+(char)a);
            System.out.println("转换后:"+(char)(a-32));
        }else{
            System.out.println("无字母输出");
        }
    }
}

6.编写程序,使用程序产生1-12之间的某个整数(包括1和12),然后输出相应月份的天数(2月按28天算)。运行结果如下图所。

public class Test {

    public static void main(String args[]){
        int month=(int)(Math.random()*12+1);
        switch (month){
            case 1:
                System.out.println("1月共有31天");
                break;
            case 2:
                System.out.println("2月共有28天");
                break;
            case 3:
                System.out.println("3月共有31天");
                break;
            case 4:
                System.out.println("4月共有30天");
                break;
            case 5:
                System.out.println("5月共有31天");
                break;
            case 6:
                System.out.println("6月共有30天");
                break;
            case 7:
                System.out.println("7月共有31天");
                break;
            case 8:
                System.out.println("8月共有31天");
                break;
            case 9:
                System.out.println("9月共有30天");
                break;
            case 10:
                System.out.println("10月共有31天");
                break;
            case 11:
                System.out.println("11月共有30天");
                break;
            case 12:
                System.out.println("12月共有31天");
                break;
            default:
                System.out.println("输出错误");
                break;
        }
    }
}

7.编写程序,判断某一年是否是闰年。

import java.util.Scanner;
public class Test {

    public static void main(String args[]){
        System.out.println("请输入年份:");
        Scanner scanner=new Scanner(System.in);
        int year=scanner.nextInt();
        if(year<0||year>3000){
            System.out.println("输入错误");
        }
        if(year%4==0&&year%100!=0){
            System.out.println(year+"年是闰年");
        }else if(year%400==0){
            System.out.println(year+"年是闰年");
        }else{
            System.out.println(year+"年不是闰年");
        }
    }
}

8.编写程序,对int[] a = {25, 24, 12, 76, 98, 101, 90, 28}数组进行排序。排序算法有很多种,读者可先编写程序实现冒泡法排序,运行结果如下图所示。(注:冒泡排序也可能有多种实现版本,本题没有统一的答案。)

public class Test {

    public static void main(String args[]){
        int[] a={25,24,12,76,98,101,90,28};
        System.out.println("排序前数组a元素为:");
        for(int i=0;ia[k+1]){
                    int temp=a[k];
                    a[k]=a[k+1];
                    a[k+1]=temp;
                }
            }
        }
        System.out.println("排序后数组a元素为:");
        for(int m=0;m

9.定义一个包含name、age和like属性的Person类,实例化并给对象赋值,然后输出对象属性。

class Person{
    String name;
    int age;
    String like;
    public Person(String name,int age,String like){
        this.name=name;
        this.age=age;
        this.like=like;
    }
    public void print(){
        System.out.println("姓名:"+name+",年龄:"+age+",喜欢:"+like);
    }
}
public class Test {

    public static void main(String args[]){
        Person p[]=new Person[3];
        p[0]=new Person("张三",20,"猫");
        p[1]=new Person("李四",56,"狗");
        p[2]=new Person("王五",12,"猪");
        for(int i=0;i

10.定义一个book类,包括属性title(书名)和price(价格),并在该类中定义一个方法printInfo(),来输出这2个属性。然后再定义一个主类,其内包括主方法,在主方法中,定义2个book类的实例bookA和bookB,并分别初始化title和price的值。然后将bookA赋值给bookB,分别调用printInfo(),查看输出结果并分析原因。

class Book{
    String title;
    int price;
    public Book(String title,int price){
        this.title=title;
        this.price=price;
    }
    public void printInfo(){
        System.out.println("书名:"+title+",价格:"+price);
    }
}
public class Test {

    public static void main(String args[]){
        Book bookA=new Book("老人与海",56);
        Book bookB=new Book("百万富翁",70);
        bookB=bookA;
        bookA.printInfo();
        bookB.printInfo();
    }
}

11.定义一个book类,包括属性title(书名)、price(价格)及pub(出版社),pub的默认值是“天天精彩出版社”,并在该类中定义方法getInfo(),来获取这三个属性。再定义一个公共类BookPress,其内包括主方法。在主方法中,定义3个book类的实例b1,b2和b3,分别调用各个对象的getInfo()方法,如果“天天精彩出版社”改名为“每日精彩出版社”,请在程序中实现实例b1,b2和b3的pub改名操作。

class Book{
    String title;
    int price;
    String pub;
    public Book(String title,int price){
        this.title=title;
        this.price=price;
        this.pub="天天精彩出版社";
    }
    public void getInfo(){
        System.out.println("书名:"+title+",价格:"+price+",出版社:"+pub);
    }
    public void setPub(String pub){
        this.pub=pub;
    }
}
public class Test {

    public static void main(String args[]){
        Book b1=new Book("老人与海",56);
        Book b2=new Book("百万富翁",70);
        Book b3=new Book("海蒂",42);
        b1.setPub("每日精彩出版社");
        b1.getInfo();
        b2.getInfo();
        b3.getInfo();
    }
}

12.编程实现,现在有如下的一个数组。
int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为。
int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}
提示
需要确定新数组的大小,需要知道原始数组之中不为0的个数,可编写一个方法完成;根据统计的结果开辟一个新的数组;将原始数组之中不为0的数据拷贝到新数组之中。)

public class Test {

    public static void main(String args[]){
        int[] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
        for(int j:oldArr){
            System.out.print(j+" ");
        }
        System.out.println(" ");
        int count=0;
        for(int i=0;i

13.编程实现,要求程序输出某两个整数之间的随机数。

import java.util.Scanner;
public class Test {

    public static void main(String args[]){
        System.out.println("请输入两个整数:");
        Scanner scanner=new Scanner(System.in);
        int i=scanner.nextInt();
        int j=scanner.nextInt();
        scanner.close();
        double result=Math.random()*(j-i)+i;
        System.out.println(i+"和"+j+"间的随机数为:"+result);

    }
}

14.定义枚举类型WeekDay,使用枚举类型配合switch语法,完善下面的代码,尝试完善完成如下功能:wd=Mon时,输出"Do Monday work",wd=Tue时,输出"DoTuesday work",…,依此类推,当wd不为枚举元素值时输出"I don't know whichis day"。

enum WeekDay{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
public class Test {

    public static void main(String args[]){
        WeekDay wd=WeekDay.Mon;
        switch(wd){
            case Mon:
                System.out.println("Do Monday Work");
                break;
            case Tue:
                System.out.println("Do Tuesday Work");
                break;
            case Wed:
                System.out.println("Do Wednesday Work");
                break;
            case Thu:
                System.out.println("Do Thursday Work");
                break;
            case Fri:
                System.out.println("Do Friday Work");
                break;
            case Sat:
                System.out.println("Do Saturday Work");
                break;
            case Sun:
                System.out.println("Do Sunday Work");
                break;
            default:
                System.out.println("I don`t know which is day");
                break;
        }
    }
}

15.建立一个人类(Person)和学生类(Student),功能要求如下。
⑴ Person中包含4个数据成员name、addr、sex和age,分别表示姓名、地址、类别和年龄。设计一个输出方法talk()来显示这4种属性。
⑵ Student类继承Person类,并增加成员Math、English存放数学与英语成绩。用一个6参构造方法、一个两参构造方法、一个无参构造方法和覆写输出方法talk()用于显示6种属性。对于构造方法参数个数不足以初始化4个数据成员时,在构造方法中采用自己指定默认值来实施初始化。

class Person{
    private String name;
    private String addr;
    private char sex;
    private int age;
    public Person(){

    }

    public Person(String name,char sex){
        this.name=name;
        this.sex=sex;
    }
    public Person(String name,String addr,char sex,int age){
        this.name=name;
        this.addr=addr;
        this.sex=sex;
        this.age=age;
    }

    public String talk(){
        return "姓名:"+this.getName()+",地址:"
                +this.getAddr()+",性别:"+this.getSex()+",年龄:"
                +this.getAge();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
class Student extends Person{
    float Math;
    float English;
    public Student(){

    }

    public Student(String name,char sex){
        super(name,sex);
    }
    public Student(String name,String addr,char sex,int age,float Math,float English){
        super(name,addr,sex,age);
        this.Math=Math;
        this.English=English;

    }

    public float getMath() {
        return Math;
    }

    public void setMath(float math) {
        Math = math;
    }

    public float getEnglish() {
        return English;
    }

    public void setEnglish(float english) {
        English = english;
    }

    public String talk(){
        return "姓名:"+this.getName()+",地址:"
                +this.getAddr()+",性别:"+this.getSex()+",年龄:"
                +this.getAge()+",数学成绩:"+this.getMath()+",英语成绩:"
                +this.getEnglish();
    }
}
public class Test{
    public static void main(String[] args){
        Student student1=new Student();
        System.out.println(student1.talk());
        Student student2=new Student("张三",'男');
        System.out.println(student2.talk());
        Student student3=new Student("李四","长沙",'女',20,90.5f,89.5f);
        System.out.println(student3.talk());
    }

}

16.定义一个Instrument(乐器)类,并定义其公有方法play(),再分别定义其子类Wind(管乐器), Percussion(打击乐器),Stringed(弦乐器),覆写play方法,实现每种乐器独有play方式。最后在测试类中使用多态的方法执行每个子类的play()方法。

class Instrument{
    public String play(){
        return "演奏";
    }
}

class Wind extends Instrument{
    public String play(){
        return "管乐器演奏";
    }
}

class Percussion extends Instrument{
    public String play(){
        return "打击乐器演奏";
    }
}

class Stringed extends Instrument{
    public String play(){
        return "弦乐器演奏";
    }
}
public class Test{
    public static void main(String[] args){
        Wind wind=new Wind();
        System.out.println(wind.play());
        Percussion percussion=new Percussion();
        System.out.println(percussion.play());
        Stringed stringed=new Stringed();
        System.out.println(stringed.play());

    }

}

17.设计一个限制子类的访问的抽象类实例,要求在控制台输出如下结果。
教师→姓名:刘三,年龄:50,职业:教师
工人→姓名:赵四,年龄:30,职业:工人

abstract class Person
{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    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;
    }
}
class Teacher extends Person{
    private String job;
    public Teacher(String name,int age,String job){
        super(name,age);
        this.job=job;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String print(){
        return "教师->姓名:"+getName()+",年龄:"+getAge()+",职业:"+getJob();
    }
}

class Worker extends Person{
    private String job;
    public Worker(String name,int age,String job){
        super(name,age);
        this.job=job;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String print(){
        return "工人->姓名:"+getName()+",年龄;"+getAge()+",职业:"+getJob();
    }
}
public class Test{
    public static void main(String[] args){
        Teacher teacher=new Teacher("刘三",50,"教师");
        System.out.println(teacher.print());
        Worker worker=new Worker("赵四",30,"工人");
        System.out.println(worker.print());
    }

}

18.利用接口及抽象类设计实现
⑴ 定义接口圆形CircleShape(),其中定义常量PI,默认方法area计算圆面积;
⑵ 定义圆形类Circle实现接口CircleShape,包含构造方法和求圆周长方法;
⑶ 定义圆柱继承Circle实现接口CircleShape,包含构造方法,圆柱表面积,体积;
⑷ 从控制台输入圆半径,输出圆面积及周长;
⑸ 从控制台输入圆柱底面半径及高,输出圆柱底面积、圆柱表面积及体积。

import java.util.Scanner;

interface CircleShape{
    public static final double PI=3.14;
    default public double area(double r){
        return PI*r*r;
    }
}

class Circle implements CircleShape{
    private double r;
    public Circle(double r){
        this.r=r;
    }

    public double circle(double r){
        return 2*PI*r;
    }
}

class Cylinder extends Circle implements CircleShape{
    private double h;
    public Cylinder(double r,double h){
        super(r);
        this.h=h;
    }

    public double SurfaceArea(double r,double h){
        double bottomArea=area(r);
        double lateralArea=circle(r)*h;
        return 2*bottomArea+lateralArea;
    }

    public double Volume(double r,double h){
        return area(r)*h;
    }
}
public class Test{
    public static void main(String[] args){
        double r=0;
        double h=0;
        System.out.println("请输入圆的半径:");
        Scanner scanner=new Scanner(System.in);
        r=scanner.nextDouble();
        Circle circle=new Circle(r);
        System.out.println("圆的半径为:"+r+",圆的面积为:"+circle.area(r)
                +",周长为:"+circle.circle(r));
        System.out.println("请输入圆柱的半径和高:");
        Scanner scanner1=new Scanner(System.in);
        r=scanner1.nextDouble();
        h=scanner1.nextDouble();
        scanner1.close();
        Cylinder cylinder=new Cylinder(r,h);
        System.out.println("圆柱的半径和高为:"+r+","+h+",圆柱底面积为:"
                +cylinder.area(r)+",圆柱表面积为:"+cylinder.SurfaceArea(r,h)
                +",圆柱的体积为:"+cylinder.Volume(r,h));
    }

}

19.定义一个包含“name”、“age”和“sex”的对象,使用匿名对象输出对象实例。

class Person{
    String name;
    int age;
    char sex;
    public Person(String name,int age,char sex){
        this.name=name;
        this.age=age;
        this.sex=sex;
    }

    public String print(){
        return "姓名:"+name+",年龄:"+age+",性别:"+sex;
    }
}
public class Test{
    public static void main(String[] args){
        System.out.println(new Person("张三",25,'男').print());
    }

}

20.完成一个统计Book类产生实例化对象的个数。

class Book{
    static int num=0;
    public Book(){
        num++;
        System.out.println("实例化对象");
    }
}
public class Test{
    public static void main(String[] args){
        new Book();
        new Book();
        new Book();
        new Book();
        new Book();
        System.out.println(Book.num);
    }

}

21.分别以如下形式输出当前的时间:形式一:2014-08-08;形式二:2014-08-08 18-40 123;形式三:2014年08月08日;形式四:2014年08月08日 16时40分123毫秒。

import java.time.LocalDateTime;
import java.time.format.*;

public class Test{
    public static void main(String[] args){
        LocalDateTime localDateTime1=LocalDateTime.now();

        DateTimeFormatter f1=DateTimeFormatter.ofPattern("uuuu-MM-dd");
        DateTimeFormatter f2=DateTimeFormatter.ofPattern("uuuu-MM-dd HH-mm SSS");
        DateTimeFormatter f3=DateTimeFormatter.ofPattern("uuuu年MM月dd日");
        DateTimeFormatter f4=DateTimeFormatter.ofPattern("uuuu年MM月dd日 HH时mm分 SSS毫秒");

        String str1=localDateTime1.format(f1);
        String str2=localDateTime1.format(f2);
        String str3=localDateTime1.format(f3);
        String str4=localDateTime1.format(f4);

        System.out.println("格式一:"+str1);
        System.out.println("格式二:"+str2);
        System.out.println("格式三:"+str3);
        System.out.println("格式四:"+str4);
    }

}

22.编写一个Java程序,完成以下功能。
⑴ 声明一个名为name的String对象,内容是“My name is Networkcrazy”;
⑵ 输出字符串的长度;
⑶ 输出字符串的第一个字符;
⑷ 输出字符串的最后一个字符;
⑸ 输出字符串的第一个单词;
⑹ 输出字符串crazy的位置(从0开始编号的位置)。

public class Test{
    public static void main(String[] args){
        String str="My name is Networkcrazy";
        System.out.println("长度:"+str.length());
        System.out.println("第一个字符:"+str.charAt(0));
        System.out.println("最后一个字符:"+str.charAt(str.length()-1));
        String data[]=str.split(" ");
        System.out.println("第一个单词为:"+data[0]);
        System.out.println("字符串crazy的位置为:"+str.indexOf("crazy"));


    }

}

23.定义一个Message类在主方法之中定义一个对象msg以及一个方法fun();temp为临时变量。
(1)


class Messagge{
    private double salary;
    public Messagge(double salary){
        this.salary=salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}
public class Test{
    public static void main(String[] args){
        Messagge msg=new Messagge(800.0);
        fun(msg);
        System.out.println(msg.getSalary());

    }

    public static void fun(Messagge msg){
        Messagge temp=msg;
        temp.setSalary(2000.0);
    }

}

(2)


public class Test{
    public static void main(String[] args){
        String str="Hello";
        fun(str);
        System.out.println(str);
    }

    public static void fun(String str){
        String temp=str;
        temp="world";
    }

}

(3)


class Message{
    private String info;
    public Message(String info){
        this.info=info;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}
public class Test{
    public static void main(String[] args){
        Message msg=new Message("Hello");
        fun(msg);
        System.out.println(msg.getInfo());
    }

    public static void fun(Message msg){
        Message temp=msg;
        temp.setInfo("world");
    }

}

24.编写一段程序,声明一个包,在另一个包中使用import语句访问使用,要求:
⑴ 声明一个包point,其中定义Point类,包含x,y坐标,构造方法,获取x,y坐标及设置;
⑵ 声明另一个包,导入包point,其中在新包中定义Circle类,半径,构造方法,获取、设置半径。
设计程序实现圆的实例化,并输出半径和圆心。

package point;
public class Point {
    private double X;
    private double Y;
    private Point(double X,double Y){
        this.X=X;
        this.Y=Y;
    }

    public static Point getInstance(double X,double Y){
        return new Point(X,Y);
    }

    public double getX() {
        return X;
    }

    public void setX(double x) {
        X = x;
    }

    public double getY() {
        return Y;
    }

    public void setY(double y) {
        Y = y;
    }

    public String toString(){
        return "(" + X + "," + Y + ")";
    }
}
package Test;
import point.*;
public class Circle {
    private double r;
    private Point point;
    public Circle(double r,double X,double Y){
        point=Point.getInstance(X,Y);
        this.r=r;
    }


    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

    public void print() {
        System.out.println("半径为" + this.r + ",圆心为" + point);
    }
}
package Test;
import Test.Circle;
public class Test {
    public static void main(String[] args){
        Circle circle=new Circle(2,5,3);
        circle.print();

    }
}

25.编写应用程序,从命令行输入两个整数参数,求它们的商。要求程序中捕获可能发生的异常。

package Test;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
    public static void main(String[] args){
        try {
            Scanner scanner = new Scanner(System.in);
            int i = scanner.nextInt();
            int j = scanner.nextInt();
            scanner.close();
            int result = i / j;
            System.out.println("商为:"+result);
        }catch(InputMismatchException ex){
            System.out.println("输入格式错误:"+ex);
        }catch(ArithmeticException e){
            System.out.println("算术错误:"+e);
        }
    }
}

26.编写一段程序,使用ArrayList类存储以下元素:“one”、“two”、“three”、“four”,并通过Iterator迭代输出ArrayList中的内容。

package Test;

import java.util.ArrayList;
import java.util.Iterator;

public class Test {
    public static void main(String[] args){
        ArrayList arrayList=new ArrayList();
        arrayList.add("one");
        arrayList.add("two");
        arrayList.add("three");
        arrayList.add("four");
        Iterator iterator=arrayList.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

27.定义Student类,该类不实现Comparable接口,定义一个Comparator类比较两个Student对象所在班级名称和名字,班级名相同时用名字进行排序,使用TreeSet观察排序的结果。

package Test;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class Student{
    String className;
    String name;
    public Student(String className,String name){
        this.className=className;
        this.name=name;
    }

    @Override
    public String toString(){
        return "姓名:"+name+",班级名字:"+className+"\n";
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class StudentComparator implements Comparator{
    @Override
    public int compare(Student s1,Student s2){
        String studentClassName1=s1.getClassName();
        String studentClassName2=s2.getClassName();
        String studentName1=s1.getName();
        String studentName2=s2.getName();
        if(studentClassName1.compareTo(studentClassName2)!=0){
            return studentClassName1.compareTo(studentClassName2);
        }else{
            return studentName1.compareTo(studentName2);
        }
    }
}
public class Test {
    public static void main(String[] args){
        TreeSet treeSet=new TreeSet(new StudentComparator());
        treeSet.add(new Student("3班","赵六"));
        treeSet.add(new Student("1班","张三"));
        treeSet.add(new Student("2班","王五"));
        treeSet.add(new Student("1班","李四"));
        Iterator iterator=treeSet.iterator();
        while(iterator.hasNext()){
            Student s=iterator.next();
            System.out.println(s.toString());
        }
    }
}

28.定义一个Student类(包含班级和姓名属性),然后定义多个StudentItem对象,并以姓名为键,对象为值添加到HashMap中,分别实现对该集合的查看、修改和删除。

package Test;

import java.util.*;

class Student{
    String className;
    String name;
    public Student(String className,String name){
        this.className=className;
        this.name=name;
    }

    @Override
    public String toString(){
        return "姓名:"+name+",班级名字:"+className;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Test {
    public static void main(String[] args){
        Student s1=new Student("1班","张三");
        Student s2=new Student("2班","李四");
        Student s3=new Student("3班","王五");
        Student s4=new Student("4班","赵六");
        HashMaphashMap=new HashMap();
        hashMap.put("张三",s1);
        hashMap.put("李四",s2);
        hashMap.put("王五",s3);
        hashMap.put("赵六",s4);
        Set> set=hashMap.entrySet();
        Iterator>iterator=set.iterator();
        while(iterator.hasNext()){
            Map.Entry mapEntry=(Map.Entry)iterator.next();
            System.out.print(mapEntry.getKey()+"->");
            System.out.println(mapEntry.getValue());
        }
        System.out.println();
        Student s=hashMap.get("张三");
        s.setClassName("10班");
        hashMap.put("张三",s);
        System.out.println("修改后:"+hashMap.get("张三"));
        System.out.println();
        hashMap.remove("李四");
        Set> set1=hashMap.entrySet();
        Iterator>iterator1=set1.iterator();
        while(iterator1.hasNext()){
            Map.Entry mapEntry1=(Map.Entry)iterator1.next();
            System.out.print(mapEntry1.getKey()+"->");
            System.out.println(mapEntry1.getValue());
        }
    }
}

29.定义一个可以用来接收用户登录信息的Annotation。其中用户名和密码要求通过Annotation设置到验证的方法中,如下所示。

@LoginInfo(name="用户名",password = "密码")
public boolean login(String name,String password){
        
    }

之后编写程序用键盘输入用户的登录信息,并通过login()方法判断输入的用户名和密码是否正确。

package Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = {ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface LoginInfo{
    public String name();
    public String password();
}
package Test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
class Reflect {
    private String name;
    private String password;
    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
    public String getName() throws IOException{
        System.out.println("请输入用户名:");
        name=bufferedReader.readLine();
        return name;
    }

    public String getPassword() throws IOException{
        System.out.println("请输入密码:");
        password=bufferedReader.readLine();
        return password;
    }

    @LoginInfo(name="张三",password = "123456")
    public boolean login(String name,String password){
        boolean flag=false;
        Method m=null;
        try{
            m=Reflect.class.getMethod("login", String.class, String.class);
        }catch (Exception e){
            e.printStackTrace();
        }
        LoginInfo loginInfo=m.getAnnotation(LoginInfo.class);
        if(loginInfo.name().equals(name)&&loginInfo.password().equals(password)){
            flag=true;
        }
        return flag;
    }
}
package Test;
import java.io.IOException;
public class Test {
    public static void main(String[] args) throws IOException {
        String name;
        String password;
        Reflect reflect=new Reflect();
        name=reflect.getName();
        password=reflect.getPassword();
        if(reflect.login(name,password)==true){
            System.out.println("用户名密码正确");
        }else{
            System.out.println("用户名密码错误");
        }
    }
}

30.编写一个多线程处理的程序,其他线程运行10秒后,使用main方法中断其他线程。

package Test;
class MyThread implements Runnable{
    public void run(){
        try{
            System.out.println("线程休眠10s");
            Thread.sleep(10000);
            System.out.println("休眠结束");
        }catch (InterruptedException e){
            System.out.println("线程被中断");
        }
        System.out.println("线程继续运行");
    }
}
public class Test {
    public static void main(String[] args){
        MyThread myThread=new MyThread();
        Thread thread=new Thread(myThread);
        thread.start();
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("main方法结束其他线程");
        System.out.println("main方法退出");
    }
}

31.设计一个生产电脑和搬运电脑类,要求生产出一台电脑就搬走一台电脑,如果新的电脑没有生产出来,则搬运工就要等待;如果生产出的电脑没有搬走,则要等待电脑搬走之后再生产。在main方法中结束其他线程,然后输出生产的电脑数量。

package Test;
class Computer{
    private String name;
    private  static int sum=1;
    private boolean flag=true;

    public Computer(String name){
        this.name=name;
    }

    public synchronized void set(){
        if(!flag){
            try{
                super.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("生产了"+this.name+",现在已经生产了"+sum+"台电脑");
        sum++;
        flag=false;
        super.notify();
    }

    public synchronized void get(){
        if(flag){
            try{
                super.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("搬走了"+this.name+"");
        flag=true;
        super.notify();
    }
}

class ComThread implements Runnable{
    public void run(){
        for(int i=0;i<10;i++){
            Computer computer=new Computer("电脑"+i);
            computer.set();
            computer.get();
        }
    }
}
public class Test {
    public static void main(String[] args){
        ComThread comThread=new ComThread();
        Thread thread=new Thread(comThread);
        thread.start();
    }
}

32.递归列出指定目录下的所有扩展名为txt的文件。
(1)

package Test;
import java.io.File;
public class TestTxt {
    public static void main(String[] args){
        File file=new File("D:"+File.separator+"TestTxt");
        OutputAllTxtFiles(file);
    }

    public static void OutputAllTxtFiles(File file){
        File[] files=file.listFiles();
        if(files!=null){
            for(File f:files){
                if(f.isDirectory()){
                    OutputAllTxtFiles(f);
                }else{
                    if(f.getName().endsWith(".txt")){
                        System.out.println(f);
                    }
                }
            }
        }
    }
}

(2)

package Test;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args)throws IOException {
        File file=new File("D:"+File.separator+"TestTxt");
        Path path=file.toPath();
        Streamfiledata= Files.walk(path,Integer.MAX_VALUE, FileVisitOption.FOLLOW_LINKS);
        filedata.forEach((p)->System.out.println(p.getFileName()));
        filedata.close();

    }
}

33.利用byte[]、BufferedInputStream 和 BufferedOutputStream 完成单个文件的复制。可复制图片、文本文件,复制后打开文件,对比两个文件是否内容一致,从而判断程序的正确性。(提示 先从一个文件中读取,再写进另一个文件)。

package Test;
import java.io.*;
public class Test {
    public static void main(String[] args){
        BufferedInputStream bufferedInputStream=null;
        BufferedOutputStream bufferedOutputStream=null;
        try{
            File file=new File("D:"+File.separator+"1.txt");
            File file1=new File("D:"+File.separator+"2.txt");
            FileInputStream fileInputStream=new FileInputStream(file);
            FileOutputStream fileOutputStream=new FileOutputStream(file1);
            bufferedInputStream=new BufferedInputStream(fileInputStream);
            bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
            byte b1[]=new byte[1024];
            int i=0;
            while((i=bufferedInputStream.read(b1)) != -1){
                bufferedOutputStream.write(b1,0,i);
            }
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(bufferedInputStream!=null){
                try{
                    bufferedInputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if(bufferedOutputStream!=null){
                try{
                    bufferedOutputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

34.有一个Student类,有学号(id)、姓名(name)、各科成绩(math、os、java)。从控制台输入信息创建两个学生对象,并将该类序列化到文件。注意要进行简单的输入验证。

package Test;

import java.io.*;
import java.util.Scanner;
@SuppressWarnings("serial")
class Student implements Serializable{
    int id;
    String name;
    Double math,os,java;
    public Student(int id,String name,Double math,Double os,Double java){
        if(id>0&&name.length()>0&&math<=100&&
                math>=0&&os<=100&&os>=0&&java<=100&java>=0) {
            this.id = id;
            this.name = name;
            this.math = math;
            this.os = os;
            this.java = java;
        }else{
            System.out.println("输入错误!");
        }
    }

    @Override
    public String toString(){
        return "学号:"+id+",姓名:"+name+",数学:"+math+",操作系统:"+os+",java:"+java;
    }

}
public class Test {
    public static void serialize(File file,Student student)throws Exception{
        OutputStream outputStream=new FileOutputStream(file);
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(student);
        objectOutputStream.close();
    }

    public static void deserialize(File file)throws Exception{
        InputStream inputStream=new FileInputStream(file);
        ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
        Student student=(Student)objectInputStream.readObject();
        System.out.println(student);
    }
    public static void main(String[] args){
        int i=0,j=0;
        String name1,name2;
        Double math1,math2,os1,os2,java1,java2;
        Scanner scanner=new Scanner(System.in);
        while(true) {
            System.out.println("请输入学生信息,输入数字0结束输入");
            int exit=scanner.nextInt();
            if(exit==0){
                scanner.close();
                break;
            }
            System.out.println("请输入学生一学号:");
            i = scanner.nextInt();
            System.out.println("请输入学生一姓名:");
            name1 = scanner.next();
            System.out.println("请输入学生一数学成绩:");
            math1 = scanner.nextDouble();
            System.out.println("请输入学生一操作系统成绩:");
            os1 = scanner.nextDouble();
            System.out.println("请输入学生一java成绩:");
            java1 = scanner.nextDouble();
            Student student1 = new Student(i, name1, math1, os1, java1);
            System.out.println("请输入学生二学号:");
            j=scanner.nextInt();
            System.out.println("请输入学生二姓名:");
            name2=scanner.next();
            System.out.println("请输入学生二数学成绩:");
            math2=scanner.nextDouble();
            System.out.println("请输入学生二操作系统成绩:");
            os2=scanner.nextDouble();
            System.out.println("请输入学生二java成绩:");
            java2=scanner.nextDouble();
            Student student2=new Student(j,name2,math2,os2,java2);
            try {
                File file = new File("D:" + File.separator + "student.txt");
                System.out.println("输入完成,打印:");
                serialize(file, student1);
                deserialize(file);
                serialize(file, student2);
                deserialize(file);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

35.编写一个服务器端/客户端程序,对客户端输入的字符串,服务器端以“客户端:”开头再返回。
服务端:

package Test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket=new ServerSocket(8888);
        Socket client=null;
        boolean flag=true;
        while (flag){
            System.out.println("等待客户端连接:");
            client=serverSocket.accept();
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintStream printStream=new PrintStream(client.getOutputStream());
            boolean temp=true;
            while (temp) {
                String str=bufferedReader.readLine();
                if(str==null||"".equals(str)){
                    temp=false;
                    break;
                }
                if("bye".equals(str)){
                    temp=false;
                    break;
                }
                printStream.println("客户端:"+str);
            }
            printStream.close();
            client.close();
        }
        serverSocket.close();
    }
}

客户端:

package Test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class EchoClient {
    public static void main(String[] args) throws Exception{
        Socket client=new Socket("localhost",8888);
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        BufferedReader buff=null;
        buff=new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintStream printStream=new PrintStream(client.getOutputStream());
        boolean flag=true;
        while (flag){
            System.out.println("请输入要发送的内容:");
            String str=bufferedReader.readLine();
            if(str==null||"".equals(str)){
                flag=false;
                break;
            }
            if("bye".equals(str)){
                flag=false;
                break;
            }
            printStream.println(str);
            System.out.println(buff.readLine());
        }
        client.close();
    }
}

作者:一只小橘猫
链接:https://www.jianshu.com/p/d651c23bda6c
來源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(JAVA从入门到精通习题)