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嵌套使用
例如:
流的总结:
变量是静态绑定,方法是动态绑定。例如:
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,检测两个字符串的引用是否相等用==
- Java学习笔记(二)
- Java学习笔记(二)
- java学习笔记(二)
- JAVA学习笔记(二)
- Java学习笔记(二)
- Java学习笔记(二)
- Java学习笔记(二)
- JAVA学习笔记(二)
- java学习笔记(二)
- Java学习笔记(二)
- Java学习笔记(二)
- Java学习笔记(二)
- Java学习笔记(二)
- java学习笔记(二)
- java学习笔记(二)
- JAVA学习笔记(二)
- java学习笔记(二)
- JAVA 学习笔记(二)
- HDU 1862 EXCEL排序
- zoj3261(并查集+set)
- WebDriver拾级而上·之十六 Table控件的处理
- 在Eclipse中config-brower的应用
- 11995 - I Can Guess the Data
- JAVA学习笔记(二)
- STM32F107启动文件分析(startup_stm32f10x_hd.s)
- Android弹出对话框实例
- WebDriver拾级而上·之十七 断言
- web单点登录中的拦截器和过滤器使用
- 第三天(Intro to Applications with Sencha Touch)
- mongdb文件型数据库开发实例
- _beginthreadex 宏定义 及 beginthread未定义解决办法
- linux wget