java编程思想第四版第十一章习题

简介: 运行结果分析: 这个案例的重点是, 数组瘦受限制的, 集合是没有元素个数限制的。

1.第一题


package net.mindview.holding.test1;
import java.util.ArrayList;
import java.util.List;
/**
 * 沙鼠
 * @author samsung
 *
 */
public class Gerbil {
    static int counter;
    int gerbilNumber;
    public Gerbil(){
        this.gerbilNumber = counter ++;
    }
    public String hop(){
        return "沙鼠的号码:"+gerbilNumber + ",正在跳跃";
    }
    public static void main(String[] args) {
        List<Gerbil> list = new ArrayList<Gerbil>();
        list.add(new Gerbil());
        list.add(new Gerbil());
        list.add(new Gerbil());
        list.add(new Gerbil());
        for(Gerbil g: list){
            System.out.println(g.hop());
        }
    }
}


运行结果


沙鼠的号码:0,正在跳跃
沙鼠的号码:1,正在跳跃
沙鼠的号码:2,正在跳跃
沙鼠的号码:3,正在跳跃


2.第二题


package net.mindview.holding.test2;
import java.util.HashSet;
import java.util.Set;
public class SimpleCollection {
    public static void main(String[] args) {
        Set<Integer> c = new HashSet<Integer>();
        for(int i = 0; i < 10; i++){
            c.add(i);
        }
        for(Integer i: c){
            System.out.print(i + ",");
        }
    }
}


3.第三题


package net.mindview.holding.test3;
import java.util.ArrayList;
import java.util.List;
/**
 * 选择器
 */
interface Selector {
    //是否结束
    boolean end();
    //当前
    Object current();
    //下一个
    void next();
}
/**
 * 顺序
 */
public class Sequence {
    //数组是有限制的,而集合时无限制的.
    //private Object[] items;
    private List<Object> items;
    private int next = 0;
    //定义数组的个数
    public Sequence(){
        items = new ArrayList<Object>();
    }
    //添加
    public void add(Object x){
        items.add(x);
    }
    //内部类--顺序选择器
    private class SequenceSelector implements Selector {
        //选择器最开始指向第一个元素
        private int i = 0;
        @Override
        public boolean end() {
            return i == (items.size());
        }
        /**
         * 新增方法: 在内部类中引用外部类
         */
        public Sequence outer(){
            return Sequence.this;
        }
        @Override
        public Object current() {
            return items.get(i);
        }
        @Override 
        public void next() {
            if(i<items.size()){
                i++;
            }
        }
    }
    public Selector selector() {
        return new SequenceSelector();
    }
    public static void main(String[] args) {
        Sequence s = new Sequence();
        for(int i=0; i<10; i++){
            s.add("对象"+i);
        }
        Selector selector = s.selector();
        while(!selector.end()){
            System.out.print(selector.current());
            selector.next();
        }
    }
}


结果


对象0对象1对象2对象3对象4对象5对象6对象7对象8对象9


分析: 这个案例的重点是, 数组瘦受限制的, 集合是没有元素个数限制的。 因此,可以任意添加元素的意思就是:将数组替代为集合。


4.第四题


package net.mindview.holding.test4;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.TreeSet;
class MoiveNameGenerator {
    String[] moives = {"Snow White", "Star Wars", "White Princple", "Dream","My Mother", "The Forest", "My Grandpa"};
    int next;
    public String next(){
        String moive = moives[next];
        //电影名用完之后, 循环到这个字符列表的开始处
        next = (next+1) % moives.length;
        return moive;
    }
}
public class MoiveGenerator {
    MoiveNameGenerator moiveNameGenerator = new MoiveNameGenerator();
    public String[] fill(String[] arr){
        for(int i=0; i<arr.length; i++){
            arr[i] = moiveNameGenerator.next();
        }
        return arr;
    }
    public Collection fill(Collection col){
        for(int i=0; i<5; i++){
            col.add(moiveNameGenerator.next());
        }
        return col;
    }
    public static void main(String[] args) {
        MoiveGenerator moiveGenerator = new MoiveGenerator(); 
        System.out.println(Arrays.toString(moiveGenerator.fill(new String[5])));
        System.out.println(moiveGenerator.fill(new ArrayList<String>()));
        System.out.println(moiveGenerator.fill(new LinkedList<String>()));
        System.out.println(moiveGenerator.fill(new HashSet<String>()));
        System.out.println(moiveGenerator.fill(new LinkedHashSet<String>()));
        System.out.println(moiveGenerator.fill(new TreeSet<String>()));
    }
}


运行结果:


[Snow White, Star Wars, White Princple, Dream, My Mother]
[The Forest, My Grandpa, Snow White, Star Wars, White Princple]
[Dream, My Mother, The Forest, My Grandpa, Snow White]
[My Mother, Star Wars, The Forest, Dream, White Princple]
[My Grandpa, Snow White, Star Wars, White Princple, Dream]
[My Grandpa, My Mother, Snow White, Star Wars, The Forest]


5.dff


6.af


7.a


8.fa


9.fda


10.sf


11.af


12.as


13.fa


14.fa


15.栈在编程语言中,经常用来对表达式求值。请使用net.mindview.util.Stack对下面的表达式求值。 其中“+”表示将后面的字母压入栈,“-”表示将栈顶的字母押出栈。并打印他们。


package net.mindview.holding;
import java.util.LinkedList;
/**
 * 模拟栈
 */
public class Stack<T> {
    private LinkedList<T> storage = new LinkedList<T>();
    //推入
    public void push(T v){
        storage.addFirst(v);
    }
    public T peek(){
        return storage.getFirst();
    }
    //取出
    public T pop(){
        return storage.removeFirst();
    }
    public boolean empty(){
        return storage.isEmpty();
    }
    public String toString(){
        return storage.toString();
    }
}


package net.mindview.holding.test15;
import java.util.Stack;
/**
 * 栈在编程语言中,经常用来对表达式求值。请使用net.mindview.util.Stack对下面的表达式求值。
 * 其中“+”表示将后面的字母压入栈,“-”表示将栈顶的字母押出栈。并打印他们。
 * @author samsung
 *
 */
public class Test15 {
    Stack<Character> stac = new Stack<Character>();
    //计算
    public void eval(String str){
        char[] chars = str.toCharArray();
        for(int i=0; i<chars.length; i++){
            char c = chars[i++];
            //遇到+号把字符入栈
            switch (c){
                case '+':
                    System.out.println("入栈:"+stac.push(chars[i]));
                    break;
                case '-':
                    System.out.println("出栈:"+stac.pop());
                    break;
            }
        }
    }
    public static void main(String[] args) {
        Test15 t = new Test15();
        String str = "+U+n+c---+e+r+t---+a-+i-+n+t+y---+ -+r+u--+l+e+s--";
        t.eval(str);
    }
}


16.fda


17.fa


18.fa


19.dfa


20.fa


21.df


22.asfd


23.afa


24.fa


25.fa


26.fa


27.二十七题


package net.mindview.holding.test27;
import java.util.LinkedList;
import java.util.Queue;
//消息
class Command {
    String str;
    public Command(String str){
        this.str = str;
    }
    public void operation(){
        System.out.println(str);
    }
}
//生产者
class Producter{
    //生产者生成消息
    public Queue<Command> produce(Queue<Command> qc){
        qc.offer(new Command("A"));
        qc.offer(new Command("AB"));
        qc.offer(new Command("ABC"));
        qc.offer(new Command("VFA"));
        qc.offer(new Command("SDA"));
        return qc;
    }
}
//消费者
class Customer {
    //消费者消费消息
    public void custom(Queue<Command> queue){
        while(queue.peek() != null){
            queue.remove().operation();
        }
    }
}
public class Test27 {
    public static void main(String[] args) {
        Queue<Command> qc = new LinkedList<Command>();
        Producter producter = new Producter();
        Queue<Command> qcc = producter.produce(qc);
        new Customer().custom(qcc);
    }
}


运行结果:


A
AB
ABC
VFA
SDA


28.


29.fa


30.第三十一题


package net.mindview.holding.test31;
import java.util.Iterator;
import java.util.Random;
//形状
class Shape {
    public void draw() {
    }
    public void erase() {
    }
}
// 圆形
class Cycle1 extends Shape {
    @Override
    public void draw() {
        System.out.println("draw cycle");
    }
    @Override
    public void erase() {
        System.out.println("erase cycle");
    }
}
class Square extends Shape {
    @Override
    public void draw() {
        System.out.println("draw Square");
    }
    @Override
    public void erase() {
        System.out.println("draw Square");
    }
}
// 矩形
class Triangle extends Shape {
    @Override
    public void draw() {
        System.out.println("draw Triangle");
    }
    @Override
    public void erase() {
        System.out.println("draw Triangle");
    }
}
// 梯形
class Trapezoid extends Shape {
    @Override
    public void draw() {
        System.out.println("draw Trapezoid");
    }
    @Override
    public void erase() {
        System.out.println("draw Trapezoid");
    }
}
class RandomShapeFactory implements Iterable<Shape> {
    Random random = new Random(47);
    private final int quantity;
    public RandomShapeFactory(int quantity) {
        this.quantity= quantity;
    }
    // 下面画什么形状呢
    public Shape nextShape() {
        switch (random.nextInt(4)) {
        default:
        case 0:
            return new Cycle1();
        case 1:
            return new Square();
        case 2:
            return new Triangle();
        case 3:
            return new Trapezoid();
        }
    }
    @Override
    public Iterator<Shape> iterator() {
        return new Iterator<Shape>() {
            private int count = 0;
            @Override
            public boolean hasNext() {
                return count < quantity;
            }
            @Override
            public Shape next() {
                ++count;
                return nextShape();
            }
            @Override
            public void remove() {
            }
        };
    }
}
public class Shapes {
    public static void main(String[] args) {
        RandomShapeFactory rd = new RandomShapeFactory(9);
        for (Shape s : rd) {
            System.out.println(s.getClass().getSimpleName());
        }
    }
}


运行结果


Triangle
Square
Triangle
Cycle1
Cycle1
Triangle
Cycle1
Square
Triangle


31.f


32.afda

目录
打赏
0
0
0
0
19
分享
相关文章
k8s的出现解决了java并发编程胡问题了
Kubernetes通过提供自动化管理、资源管理、服务发现和负载均衡、持续交付等功能,有效地解决了Java并发编程中的许多复杂问题。它不仅简化了线程管理和资源共享,还提供了强大的负载均衡和故障恢复机制,确保应用程序在高并发环境下的高效运行和稳定性。通过合理配置和使用Kubernetes,开发者可以显著提高Java应用程序的性能和可靠性。
63 31
注解的艺术:Java编程的高级定制
注解是Java编程中的高级特性,通过内置注解、自定义注解及注解处理器,可以实现代码的高度定制和扩展。通过理解和掌握注解的使用方法,开发者可以提高代码的可读性、可维护性和开发效率。在实际应用中,注解广泛用于框架开发、代码生成和配置管理等方面,展示了其强大的功能和灵活性。
61 25
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
课时6:Java编程起步
课时6:Java编程起步,主讲人李兴华。课程摘要:介绍Java编程的第一个程序“Hello World”,讲解如何使用记事本或EditPlus编写、保存和编译Java源代码(*.java文件),并解释类定义、主方法(public static void main)及屏幕打印(System.out.println)。强调类名与文件名一致的重要性,以及Java程序的编译和执行过程。通过实例演示,帮助初学者掌握Java编程的基本步骤和常见问题。
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
102 5
Java 并发编程——volatile 关键字解析
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
114 12
|
3月前
|
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
309 2
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####