会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132441个问题

老师,这里Thread01类中for循环的println()里我没加" i ",而是直接打印了线程名字,如下代码:

package com.ljp.Runnable;

public class Thread01 implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName() + "------------------");
            // System.out.println(Thread.currentThread().getName() + "------------------" + i);
        }
    }
}

在主线程中,println()里面有" i ",如下代码:

package com.ljp.Runnable;

public class Test {
    public static void main(String[] args) {
        Thread01 t01 = new Thread01();
        Thread td01 = new Thread(t01,"北坡的八百标兵");
        td01.start();

        for(int i=0; i<10;i++){
            System.out.println(Thread.currentThread().getName() + "-------------------------------" + i);
        }
    }
}

运行结果,主线程结果总是在线程1运行结果后面,如下运行结果:

北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
北坡的八百标兵------------------
main-------------------------------0
main-------------------------------1
main-------------------------------2
main-------------------------------3
main-------------------------------4
main-------------------------------5
main-------------------------------6
main-------------------------------7
main-------------------------------8
main-------------------------------9

但是Thread01类的println()加上 " i ",就不会出现上面情况,运行结果如下:

main-------------------------------0
北坡的八百标兵------------------0
北坡的八百标兵------------------1
main-------------------------------1
北坡的八百标兵------------------2
main-------------------------------2
北坡的八百标兵------------------3
北坡的八百标兵------------------4
北坡的八百标兵------------------5
main-------------------------------3
北坡的八百标兵------------------6
main-------------------------------4
北坡的八百标兵------------------7
main-------------------------------5
北坡的八百标兵------------------8
main-------------------------------6
北坡的八百标兵------------------9
main-------------------------------7
main-------------------------------8
main-------------------------------9

为什么?????

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 2402楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 2404楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 2405楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2406楼

2020 12 04-----------------------------

package com.bjsxt;
package com.bjsxt;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class HashMapTest {
    public static void main(String[] args) {
        //实例化HashMap容器
        Map<String,String> map = new HashMap<>();
        //添加元素
        map.put("a","A");
        String value = map.put("a","B");
        System.out.println(value);

        System.out.println("---------------------------");
        String val = map.get("a");
        System.out.println(val);

        System.out.println("------------------------------");
        map.put("b","B");
        map.put("c","C");
        map.put("d","D");
        map.put("e","E");
        //获取HashMap容器中所有的元素,可以使用keySet方法与get方法一并完成。
        Set<String> keys = map.keySet();
        for(String key:keys){
            String v1 = map.get(key);
            System.out.println(key+" ---- "+v1);
        }
        System.out.println("-----------------");
        Set<Map.Entry<String,String>> entrySet = map.entrySet();
        for(Map.Entry<String,String> entry:entrySet){
            String key = entry.getKey();
            String v = entry.getValue();
            System.out.println(key+" ---------- "+v);
        }
      }
}

为什么这里是String value = map.put("a","B");  而不是String value = new map.put("a","B");

Set<Map.Entry<String,String>> entrySet = map.entrySet();  而不是

Set<Map.Entry<String,String>> entrySet =  new map.entrySet();


JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2410楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2411楼

老师,这里使用BufferedInputStream和BufferedOutputStream定义的处理流,是不是与自定义byte[]数组缓冲区然后read(byte[] b)并不一样?


我的理解:

1)处理流仍然是一个字节一个字节从数据源中读取数据,只是将这些字节缓存在处理流定义的字节数组中,之后等满了以后(达到8192个字节)再读入到程序中;

2)而自定义的缓冲区是一次直接从数据源中读取多个字节(比如定义的1024个字节数组)到程序中。


处理小文件的时候,自定义的会不会效率更高一下?

处理大文件的时候使用那个更好一些?

两个结合在一块使用适用吗?(比如第二段代码中的适用)


第一段代码:

package cn.ljp;

import java.io.*;

public class TestBufferedInputStream02 {
    public static void main(String[] args) {
        // 1) 定义字节流和处理流
        InputStream fis = null;
        InputStream fib = null;
        OutputStream fos = null;
        OutputStream fob = null;
        try{
            fis = new FileInputStream("f:/a.png");
            fib = new BufferedInputStream(fis);
            fos = new FileOutputStream("f:/aa.png");
            fob = new BufferedOutputStream(fos);
            int emp = 0;
            long start = System.currentTimeMillis();
            while((emp = fib.read()) != -1){
                System.out.println(emp);
                fob.write(emp);
            }
            fob.flush();
            long stop = System.currentTimeMillis();
            System.out.println("花费时间" + (stop - start) + "毫秒");
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(fib != null)
                    fib.close();
                if(fis != null)
                    fis.close();
                if(fob != null)
                    fob.close();
                if(fos != null)
                    fos.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

第二段代码:

package cn.ljp;

import java.io.*;

public class TestBufferedInputStream {
    public static void main(String[] args) {
        // 1) 定义字节流和处理流
        InputStream fis = null;
        InputStream fib = null;
        OutputStream fos = null;
        OutputStream fob = null;
        try{
            fis = new FileInputStream("f:/a.png");
            fib = new BufferedInputStream(fis);
            fos = new FileOutputStream("f:/aa.png");
            fob = new BufferedOutputStream(fos);
            byte[] buff = new byte[1204];
            int emp = 0;
            long start = System.currentTimeMillis();
            while((emp = fib.read(buff)) != -1){
                System.out.println(emp);
                fob.write(buff,0,emp);
            }
            fob.flush();
            long stop = System.currentTimeMillis();
            System.out.println("花费时间" + (stop - start) + "毫秒");
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(fib != null)
                    fib.close();
                if(fis != null)
                    fis.close();
                if(fob != null)
                    fob.close();
                if(fos != null)
                    fos.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 2414楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2415楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637