JAVA学习笔记(二)

来源:互联网 发布:华东理工大学网络 编辑:程序博客网 时间:2024/04/27 08:48

1.关于日期的一些问题

Calendar theDay = DateFormat.getCalendar();//这是获取当前时间int theDayofWeek = theDay.get(Calendar.DAY_OF_WEEK);//获取当前时间是一个星期的第几天,周日是第一天,周一是第二天,以此类推

②Date和Calendar是两个类,前者是时间类,偏重时间,只有年月日,没有时分秒;后者是日历类,偏重时间计算,有年月日时分秒。二者可互相转换


// Calendar转化为DateCalendar cal = Calendar.getInstance();Date date = cal.getTime();//Date转化为CalendarDate date = new Date();Calendar cal = Calendar.getInstance();cal.setTime(date);

③把字符串转化为java.util.Date

方法一:(常用)


DateFormat df = new SimpleDateFormat("yyyy-MM-dd");Date d = df.parse("2005-2-19");System.out.println(df.format(d));//输出结果为:2005-2-19

方法二:
Date d;DateFormat df = DateFormat.getDateInstance();d = df.parse("2005-12-19");System.out.println(d);//输出结果为:Mon Dec 19 00:00:00 CST 2005System.out.println(df.format(d)); //输出结果为:2005-2-19

④格式化输出时间(最常用的方法)

Date date = new Date();DateFormat dt = new SimpleFormatDate("yyyy-MM-dd hh:mm:ss");String time = dt.format(date);System.out.println(time);

⑤怎样获取系统当前时间?有三种方法:
System.out.println(System.currentTimeMillis);//这是计算从格林威治时间原点(1970年等等等)到现在经历了多少毫秒Date d = new Date();//也是系统时间Calendar c = Calendar.getInstance();//系统时间
当然都还需要格式化才行


一个例子:

import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateIODemo { public static void main(String[] args) throws ParseException {  Date date = new Date();//当前时间,当前毫秒数  //输出yyyy-MM-dd HH:mm:ss  SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  //将日期类型格式化为时间字符串  String str = fmt.format(date);//日期格式化  System.out.println(str);//2012-12-21 00:00:00  //解析日期字符串为日期类型对象  String day = "2012-12-21";  SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");  Date d = f.parse(day);//将日期字符串解析为毫秒数  long l = d.getTime();  System.out.println(fmt.format(d));  String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date());  System.out.println(s);//2012-04-18 }}

PS:SimpleDateFormat类格式化一个字符串时,可根据需要调用format()或parse()函数,只不过format()返回的是String类,parse()返回的是java.util.Date类


2.DateFormat类的parse()方法

   parse方法就是把一个字符串类型的日期,转换成真正意义上日期格式的日期。比如“2013-01-01”,人眼一下就能看出来是个日期,但是对于java来说只是一个字符串,必须要转换成为Date类型java才知道这是个日期。


3.关于容器

   ①容器Collection中有两个接口,Set和List;Set中的数据无序不可重复,   List中的数据有序可重复。Map中的HashMap的数据也没有顺序。
 

  ②使用容器时,尽量加上泛型,便于数据存储与读取
 

  ③在遍历容器时,List尽量采用索引遍历,Set尽量采用迭代器
 

   ④迭代器,既可以迭代List,也能迭代Set

   ⑤所有实现了Collection接口的容器类都有一个iterator方法,用来返回实现了  Iterator接口的对象。Iterator对象称作迭代器,用来对容器中的元素进行遍历,该方法既可以迭代List,也可以迭代Set

 

   例子:List、Set、Map集合的遍历操作

 

/** * 测试List、Set、Map集合的遍历操作 * 以后在遍历容器时,List尽量用索引遍历,Set用迭代器 *  */package com.bjsxt.test.collection;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class TestPractice {public static void testList(){List<Student> list = new ArrayList<Student>();list.add(new Student("张三"));list.add(new Student("李四"));list.add(new Student("王五"));//索引遍历for(int i=0;i<list.size();i++){Student stu = list.get(i);System.out.println(stu.getName());}//使用增强型的for循环,实质上也是索引遍历for(Student stu:list){System.out.println(stu.getName());//这样比上边的简单}//使用迭代器Iterator<Student> iter1 = list.iterator();while(iter1.hasNext()){ //这是判断有没有元素被遍历//next()的返回值为Object类型,需要转换为其他类型Student stu = iter1.next();//返回当前元素,并且让游标指向下一个System.out.println(stu.getName());}//或者也可用下面的方法for(Iterator<Student> iter2 = list.iterator();iter2.hasNext();){//其中for里边的第三句话(即步进)在下一行,即iter2.next()中Student stu = iter2.next();System.out.println(stu.getName());}}public static void testSet(){Set<Student> set = new HashSet<Student>();set.add(new Student("张三"));set.add(new Student("李四"));set.add(new Student("王五"));//使用增强型的for来索引遍历for(Student stu:set){System.out.println(stu.getName());}//使用迭代器Iterator<Student> iter2 = set.iterator();while(iter2.hasNext()){Student stu = iter2.next();System.out.println(stu.getName());}}//遍历Map比较麻烦,得使用Entrypublic static void testMap(){Map<String,Student> map = new HashMap<String,Student>();map.put("a",new Student("001"));map.put("b",new Student("002"));map.put("c",new Student("003"));//遍历keySet<String> set1 = map.keySet();//set一个实例Iterator<String> iter1 = set1.iterator();while(iter1.hasNext()){String str = iter1.next();System.out.println(str + "----" + map.get(str).getName());}//遍历valueCollection<Student> set2 = map.values();Iterator<Student> iter2 = set2.iterator();while(iter2.hasNext()){Student stu = iter2.next();System.out.println(stu.getName());}//遍历键值对EntrySet<Entry<String,Student>> set3 = map.entrySet();Iterator<Entry<String,Student>> iter3 = set3.iterator();while(iter3.hasNext()){Entry<String,Student> v = iter3.next();System.out.println(v.getKey() + "-----" + v.getValue());}}public static void main(String[] args) {testList();testSet();testMap();}}


4.异常

   ①如果多个异常之间有父子关系,先放子类后放父类!
   ②在异常中若有finally,则finally中的代码,无论有没有异常,都会执行!
   ③catch异常的常用方法:
       toString()方法:现实异常的类名和产生异常的原因
       getMessage()方法:只显示产生异常的原因,但不现实类名
       printStackTrace():用来跟踪异常事件发生时堆栈的内容

5.补充一些关于多态的,如:

   Collection c = new ArrayList();
   父类引用指向子类对象,这是多态的表现,但父类不能访问子类的成员变量。等将来想换其他方法时,直接将ArrayList换掉即可,非常方便。若要是写成
   ArrayList c = new ArrayList();想换成其他的方法则很麻烦,要改掉很多东西。


6.补充:
     Object类中toStirng方法的作用
     a. Object类中默认定义的是返回:类名+哈希码(对应地址)
     b. 打印对象时,默认就是调用toString方法,打印该方法返回的字符串(即类名加对应地址)


7.异常中,当有return和finally时,return先返回值,再运行finally,最后再结束运行。总而言之,就是一定会执行finally。并且finally语句块中最好不要写return语句。例如:

import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class Test03 {public static void main(String[]  args){String str =new Test03().openFile();System.out.println(str);}String openFile(){try{System.out.println("aaa");FileReader fis = new FileReader("d:/ad.txt");   //checked!!!int a = fis.read();System.out.println("bbb");//先确定返回的值,并不会直接结束运行!return "step1";}catch(FileNotFoundException  e){System.out.println("catching!!!!");e.printStackTrace();return "step2";     //先确定返回的值,并不会直接结束运行!}catch(IOException  e){e.printStackTrace();return "step3";}finally{System.out.println("finally!!!!");//return "fff";    //尽量不要在finally中使用return!}}}
其运行结果为:
aaaaahahahahjava.io.FileNotFoundException: d:\a人.txt (系统找不到指定的文件。)at java.io.FileInputStream.open(Native Method)at java.io.FileInputStream.<init>(FileInputStream.java:138)at java.io.FileInputStream.<init>(FileInputStream.java:97)at java.io.FileReader.<init>(FileReader.java:58)at com.bjsxt.test.exception.Test03.openFile(Test03.java:16)at com.bjsxt.test.exception.Test03.main(Test03.java:9)finallystep2

     由上可以看出,先执行finally中语句,再返回step2,结束运行

8.手动抛出的异常,用throw,继承自RunTimeException不需要try/catch,继承自Exception需要写

9.Map容器中,在<key,value>属性中,key必须为包装类

Map<Integer,Student> map = new HashMap<Integer,Student>();//通过Map<String,Student> map = new HashMap<String,Student>();//通过Map<int,Student> map = new HashMap<int,Student>();//报错

10.流的分类
①按流向分为输入流和输出流
②按传输单位分为字节流(以Stream结尾)和字符流(Reader和Writer)
  BufferedReader和BufferedWriter为字符缓冲流,特有方法是readLine()读取一个文本行,newLine为Writer到下一个文本行.
 为了提高速率,可使用缓存,实质上是一个数组
 byte[] buffer = new byte[1024]//其中1024可替换为其它数值

11.一些流的基本方法

首先说哈:1字符=2字节


①InputStream

 int read()// 读取一个字节以整数形式返回,返回-1则表示已到输入流的末尾
②OutputStream 
void write(int x)//向输出流写入一个字节数据void flush()// 将输出流的缓冲数据全部写到目的地
③Writer 
void write(int x)//向输出流写入一个字符数据void write(String str)//将一个字符串中的字符写入到输出流void flush() //将输出流中的数据全部写出到目的地
④Reader 
 int read()//读取一个字符以整数形式返回,若返回-1则表示已到输入流的末尾Byte[] buffer = new Byte[1024];//缓存机制int len = 0;//接受数据的长度循环读取 while((流.read(buffer)!=len)!=-1)


⑥转换流

作用是将字节流转换为字符流,用的地方较多。

InputStreamReader需要和InputStream嵌套使用

OutputStreamWriter需要和OutputStream嵌套使用

例如:



流的总结:


12.补充关于多态的

变量是静态绑定,方法是动态绑定。例如:

public abstract class Car {String type;public  void run(){System.out.println("car.....");}public Car(){}public void getType(){System.out.println(type);}public static void main(String[] args) {Car car =new Bmw();car.type ="car";car.run(); //发生多态car.getType();//值为null,而不是car}}class Bmw extends Car{String type;public void run() {System.out.println("。。。。。。。。");}public void getType(){System.out.println(type);}}
其输出结果为。。。。。。。。和null
因为变量是静态绑定,方法是动态绑定。静态绑定就是变量本身是什么类型的,就用哪个里边的。如car.type的car为Car类型,那么type就是Car里边的。而方法则是使用子类Bmw里边的。静态绑定也可理解为java命令生成.class文件,动态绑定为运行java程序。

13.关于线程

①在哪个线程里调用的sleep方法,就让哪个线程睡眠

②Runnable中只有一个方法public void run(),用以定义线程运行体

③wait和sleep方法的区别
二者区别很大,wait方法属于Object类,sleep属于Thread类。二者都可以暂停某进程,但wait时别的线程也可以访问锁定对象。而sleep时别的线程不可以访问锁定对象。


14.补充一些面向对象的东西:

接口与接口的关系是继承(extends),一个接口可以继承多个接口
而类与接口的关系是implements,一个类可以继承多个接口
类与类的关系是继承,一个类只能继承一个类

15.检测两个字符串内容是否相等用equals,检测两个字符串的引用是否相等用==