.关于打印系统属性的问题?
我们必须通过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.字符串==比较的是内存地址,也就是说通过普通两个变量定义的相同内容字符串,他们指向的空间都是常量池
但是如果是对象,他们会在堆上面开空间,然后放置,这个时候,两个对象属性中虽然字符串内容相同,但是用==去比较
就是不同,因为他们的地址空间不一样