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

相关文章
|
1天前
|
安全 Java 程序员
Java并发编程:理解并应用ReentrantLock
【4月更文挑战第30天】 在多线程的世界中,高效且安全地管理共享资源是至关重要的。本文深入探讨了Java中的一种强大同步工具——ReentrantLock。我们将从其设计原理出发,通过实例演示其在解决并发问题中的实际应用,以及如何比传统的synchronized关键字提供更灵活的锁定机制。文章还将讨论在使用ReentrantLock时可能遇到的一些挑战和最佳实践,帮助开发者避免常见陷阱,提高程序性能和稳定性。
|
1天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
1天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
2天前
|
Java 大数据 数据库连接
java编程的优点
【4月更文挑战第30天】java编程的优点
5 0
|
2天前
|
存储 安全 Java
【亮剑】Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。
|
2天前
|
安全 Java API
Java 8新特性概述及其对编程实践的影响
【4月更文挑战第30天】本文将详细讨论Java 8的新特性,包括Lambda表达式、Stream API以及Optional类等,并探讨这些新特性如何改变了Java编程的实践。我们将通过实例代码展示这些新特性的用法,并分析其对提高代码可读性和编写效率的影响。
|
2天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
2天前
|
存储 安全 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第30天】在Java开发中,并发编程是一个复杂而又关键的领域。它允许多个线程同时执行,从而提高程序性能和资源利用率。然而,并发编程也带来了许多挑战,如数据不一致、死锁和线程安全问题。本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化策略。我们将通过实例分析如何在保证线程安全的同时提高程序性能,为Java开发者提供实用的指导。
|
2天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
2天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第30天】本文将深入探讨Java并发编程的核心概念,包括线程安全、同步机制、锁优化以及性能调优。我们将通过实例分析如何确保多线程环境下的数据一致性,同时介绍一些常见的并发模式和最佳实践,旨在帮助开发者在保证线程安全的同时,提升系统的性能和响应能力。