A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一直很安静 于 2013-11-26 10:29 编辑

问题1:下面的程序if(buf<0&& !bChineseFirstHalf)中的buf<0是什么意思?为什么要这样写?
/*3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出
为按字节截取的字符串,
* 但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,
* 应该输出“我ABC”,而不是“我ABC+汉的半个”。
*/
public class Test6{
       public static void main(String[] args) throws Exception{
              String str ="我a爱中华abc我爱传智def";
              //String str ="我ABC汉";
              int num =trimGBK(str.getBytes("GBK"),5);
              System.out.println(str.substring(0,num));
       }
      
       public static int  trimGBK(byte[] buf,int n){
              int num = 0;
              boolean bChineseFirstHalf = false;
              for(int i=0;i<n;i++)
              {
                     if(buf<0&& !bChineseFirstHalf){//此处
                            bChineseFirstHalf= true;
                     }else{
                            num++;
                            bChineseFirstHalf= false;                        
                     }
              }
              return num;
       }
}
问题2:for(inti=0,int j=a.length-1;i<j;i++,j--)是否等效于for(int i=0;i<a.length/2;i++)呢
问题3:在张孝祥老师的视频中听到了工厂模式,在网上查了下,根据工厂模式实现的类可以根据提供的数据生成一组类中的某一类的实例,通常这一组类有一个公共的抽象方法并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作,首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法,然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪个子类的实例。
觉得这样的叙述太抽象了 还是想不明白,工厂模式有没有类似单例模式那样的代码?谁能用简单的代码给演示一下?
问题4:线程池
Executors的newScheduledThreadPool方法是创建一个线程池,这个线程池对象可以接收一个Runnable子类,我看着和new Thread(new Runnable())差不多,想问一下1.5出现的线程池和之前的线程有什么区别没用?用法是不是和原来一样,还有如果我这个线程池中有多个线程该怎样让这多个线程运行起来?老方法是new多个Thread然后把Runable的子类传给他们,用线程池的话怎么做?让线程池对象调用多次scheduleAtFixedRate方法吗?
问题5:下面是JDK中提供的ScheduledExecutorService演示代码,请教各位他实现将蜂鸣控制在1小时内是怎么实现的?是不是可以用相同的办法将银行调度系统控制在只在固定时间运行?或者一天运行多长时间?
以下是一个带方法的类,它设置了 ScheduledExecutorService ,在 1 小时内每 10 秒钟蜂鸣一次:
import static java.util.concurrent.TimeUnit.*;
class BeeperControl {
    private final ScheduledExecutorService scheduler =
       Executors.newScheduledThreadPool(1);

    public void beepForAnHour() {
        final Runnable beeper = new Runnable() {
                public void run() { System.out.println("beep"); }
            };
        final ScheduledFuture<?> beeperHandle =
            scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
        scheduler.schedule(new Runnable() {
                public void run() { beeperHandle.cancel(true); }
            }, 60 * 60, SECONDS);
    }
}

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
FFF + 1 + 6 只要努力,终有回报。

查看全部评分

11 个回复

倒序浏览
buf[i]<0是因为汉字的GBK编码中 汉字的符号位是1 其实我感觉完全没必要加这个bChineseFirstHalf

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报

是不是0之后都是汉字?我试了一下不加标记不可以 ,要不到想要的结果
回复 使用道具 举报
先回答第一个吧,对于字符串你做了byte[] byt=str.getBytes("GBK");这个处理,所以就会出现遍历的时候如果是字符,byt[i]是大于0,而如果是汉字,两个byt[i],byt[i+1]都是小于0的。这有一行代码:
String str ="a我a传智def";
byte[] byt=str.getBytes("GBK");
         
System.out.println(byt[0]+" "+byt[1]+" "+byt[2]+" "+byt[3]);
输出结果是:97 -50 -46 97
所以就可以理解if(buf[i]<0&& !bChineseFirstHalf)这行的用意了吧,而对于bChineseFirstHalf这个bool类型的变量就应该是一个判断标识符了吧,希望对你有用

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
一直很安静 发表于 2013-11-26 10:12
是不是0之后都是汉字?我试了一下不加标记不可以 ,要不到想要的结果

不是,汉字默认是两个字节的负数组成的。。
哦 哪个标记要加的 判断读取汉字点点第二个字节。。我看错了不好意思哈。。
回复 使用道具 举报
王贺 发表于 2013-11-26 10:18
先回答第一个吧,对于字符串你做了byte[] byt=str.getBytes("GBK");这个处理,所以就会出现遍历的时候如果 ...

嗯嗯 解答的很清楚 明白了
回复 使用道具 举报
其他几个问题呢?版主让我这样发 我觉得不合理啊 没人回答我其他问题啊
回复 使用道具 举报
王贺 中级黑马 2013-11-26 10:30:50
8#
第二个问题,应该是一样的,
刚才我又简单测试了一下,代码:
int[] a={1,2,3,4,5,6,7,8};
for(int i=0;i<a.length/2;i++)
//for(int i=0, j=a.length-1;i<j;i++,j--)
{
System.out.println(a[i]);
                                       
}
输出结果是一样的。
感觉效率就不一样了,第二个感觉更繁琐

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
王贺 中级黑马 2013-11-26 10:38:57
9#
第三个,工厂模式这个,以前学了点模式概念,好像分为简单工厂,具体工厂和抽象工厂吧,
来一个抽象工厂的吧,用的多:
抽象类
//原材料
public abstract class AbstractFactory {
    public abstract Vehicle createVehicle();
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}
//建立工厂
public class DefaultFactory extends AbstractFactory{
    @Override
    public Food createFood() {
        return new Apple();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon createWeapon() {
        return new AK47();
    }
}
//生产
public class Test {
    public static void main(String[] args) {
        AbstractFactory f = new DefaultFactory();
        Vehicle v = f.createVehicle();
        v.run();
        Weapon w = f.createWeapon();
        w.shoot();
        Food a = f.createFood();
        a.printName();
    }
呵呵,应该可以概括下工厂模式了吧


回复 使用道具 举报
王贺 发表于 2013-11-26 10:30
第二个问题,应该是一样的,
刚才我又简单测试了一下,代码:
int[] a={1,2,3,4,5,6,7,8};

我也是自己试了下 结果一样,但是不知道自己试的是个例还是真的一样。
回复 使用道具 举报
王贺 发表于 2013-11-26 10:38
第三个,工厂模式这个,以前学了点模式概念,好像分为简单工厂,具体工厂和抽象工厂吧,
来一个抽象工厂的 ...

我把代码复制下来了 自己研究一下谢谢拉
回复 使用道具 举报
一直很安静 发表于 2013-11-26 10:30
其他几个问题呢?版主让我这样发 我觉得不合理啊 没人回答我其他问题啊

连续发帖会被认为刷帖的,童鞋们可能反感这种行为吧。不要把问题留到同一时间发帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马