小贴士5

.关于打印系统属性的问题?
我们必须通过System来获取Properties类对象,然后通过list(System.out)来打印出系统属性
2.做一个arraycopy函数
//数组拷贝
    public static void myArrayCopy(int[] srcArr,int srcPos,int[] destArr,int destPos,int len) {
        int srcLen = srcArr.length;
        int destLen = destArr.length;
        //长度合理性
        if((srcPos + len > srcLen) || (destPos + len > destLen) || srcPos < 0 || destPos < 0) {
            System.out.println("数据长度不合理");
            return ;
        }
        //数据内容拷贝
        for(int i = srcPos,j = destPos;len-- > 0;i++,j++) {
            destArr[j] = srcArr[i];
        }
        System.out.println("数组内容拷贝成功");
    }

3.在我们进行日期格式化类的时候,我们都要提前标明格式。
比如如下这种格式:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

4.interrupt()把当前线程的临时阻塞状态清除,返回一个线程中断的异常,注意它并不像notify()会有一个唤醒功能,清除的是当前
线程受到阻塞的状态,并且会给当前线程抛出一个线程中断异常
一般来说,中断一个线程,我们往往会通过一个变量来进行控制
/**
 * 这里说一下interrupt()函数作用:解除线程的休眠状态,那个线程对象调用,就作用于哪一个线程上面
 * 并且抛出一个线程中断异常
 * 线程的几种运行状态:
 * 可运行状态(具有等待资格,无执行权)
 * 休眠状态(遇到wait()函数或者sleep())无等待资格,无执行权
 * 运行状态(有等待资格,有执行权)
 * 死亡状态(线程运行结束之后,进入死亡状态)
 * interrupt解决的就是线程的休眠状态
 */
public class Demo8 {
    public static void main(String[] args) throws InterruptedException {
        //线程的一个本质是一个争夺战
        TestThread testThread = new TestThread();
        //这才是一个线程对象
        Thread thread = new Thread(testThread,"张冠军");

        //这里开启一个线程,这里并不会说start()执行完了之后才执行main主线程
        //这两个线程是交替相互运行的
        thread.start();

        for(int i = 0;i < 1000;i++) {
            Thread.sleep(1000);
            //在某一个时刻,我们去改变thread线程的休眠状态,它的休眠时间有点太长了
            if(i == 10) {
                thread.interrupt();//会给唤醒的线程,抛出一个线程中断异常
            }
            System.out.println(Thread.currentThread().getName() + ":" + i + "正在运行");
        }

    }
}

/**
 * 写另外一个线程:
 * 写线程有两个方法:
 * 1.extends Thread->重写run()方法
 * 2.去实现一个Runable接口,然后重写run方法,然后传给Thread类对象
 * 有句话:只有Thread类或者Thread子类的对象才是线程对象,也就是说才是一个线程
 * 下面这个类我们采用第二种方法进行处理
 */
class TestThread implements Runnable {
    @Override
    public  synchronized void run() {
        for(int i = 0 ;i < 1000;i++) {
            try {
                this.wait();//这里注意一下,wait是以锁对象为线程池调用的,没有锁对象,wait就不成立
            } catch (InterruptedException e) {
                System.out.println("接收到异常了...");
            }
            System.out.println(Thread.currentThread().getName() + ":" + i + "正在运行");
        }
    }
}

5.守护线程是随着主线程消亡而消亡的
守护线程是需要我们去进行设置的d.setDaemon(true); //setDaemon() 设置线程是否为守护线程,true为守护线程, false为非守护线程

6.在集合中contains方法是依赖于equals方法进行比较的
传进来的每一个元素去调用equals(集合内部的每一个元素)来进行比较

7.在调用iterator迭代器的时候,是靠next()把指针进行向下移动,并返回当前元素的

8.wait()与notify()只能由锁对象调用,在线程中,一个线程进入临时阻塞状态,那么程序肯定会运行另外一个线程

9.对于list集合,我们可以采用size()方法,与get()方法来遍历集合中的元素

10.HashSet找位置要依赖于hashCode()来寻找位置,equals()来比较元素是否一样

11.set1.add(new User(username,userpassword));set集合在添加元素的时候,它本身就会去用hashCode()和equals
去判断是否是重复元素

12.如果用treeSet来装数据,如果没有定义比较规则,实现comparable接口中的方法,来定义比较规则
要弄清楚treeSet的比较规则,左小右大,调用者就是传入者(在我们添加的时候,他会自动调用compareTo这个方法,比如this就是添加
时候的对象)与已经存在的比较 (> 0 这个数大于当前数 < 0 这个数小于当前数)

13.泛型编程没有多态这个概念,两边必须一致

14.map集合中,键不可以重复

15.//renameTo()  如果目标文件与源文件是在同一个路径下,那么renameTo的作用是重命名, 如果目标文件与源文件不是在同一个路径
下,那么renameTo的作用就是剪切,而且还不能操作文件夹。 
        File destFile = new File("F:\\aaaaaaw");
        System.out.println("重命名成功吗?"+file.renameTo(destFile)) ; 

16.我们可以像这样把一个毫秒数-》Date对象,因为Date对象本身就表示一个时间戳,采用日期格式化类处理

17.(res = fis.read()) != -1)-》这样来读取数据,返回的是ASCII码的值
   while((res = fis.read(buf)) != -1) 这样读取就是返回读取到的字节数,比如读取到一个中文占用两个字节,就返回2
一般来说,我们读取一个特别大的数据,都是缓冲数组与循环一起读数据 

18.//注意这里-1并不会读到内存里面去
      while((res = fis.read(buf)) != -1) 

19.网络编程中,我们需要IO流对象来进行数据读写,采用output(输出数据) input(读取数据)

10.注意字符串也是可以直接变成字节数组,字符数组的

11.网络流读取文件只是针对网络传输来说,操作本地文件,还是要建立本地操作流,比如我要把文件放到本地硬盘上面

12. while((len = is.read(bytes)) != -1) {
            System.out.println(i + " : " + new String(bytes));
            fos.write(bytes,0,len);
            i++;
        }
上面就是服务器端的代码,当客户端没有返回一个结束标记的时候,服务器当读取完我们需要的文件的时候,就会进入一个阻塞状态

13.当我们集合里面有多个数据对象的时候,我们需要验证每插入一条数据的是否存在集合中,首先应该是迭代
集合中的数据,然后把里面的成员属性依次拿出来进行比较

14.字符串==比较的是内存地址,也就是说通过普通两个变量定义的相同内容字符串,他们指向的空间都是常量池
但是如果是对象,他们会在堆上面开空间,然后放置,这个时候,两个对象属性中虽然字符串内容相同,但是用==去比较
就是不同,因为他们的地址空间不一样
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值