嵌入式软件开发培训笔记——java第五天(API——math/string/集合/日期时间以及java线程)

目录
    掌握命令行参数的使用
    掌握Math类中常用的方法
    掌握String/StringBuffer/StringBuilder的用法
    掌握几种常用集合类的用法
    掌握日期和时间处理

1、命令行参数
    Java中命令行参数第一个参数为args[0],这跟C语言不同
    参数设置两种方法:
        1)、Run Configrations找到Arguments
        2)、dos命令行java xxx后面

2、math类
    包含了一组数学函数
    截取:ceil、floor、round
        
    变量的:max 、min、abs
    三角函数:sin、cos、tan、asin、acos、atan、toDegrees和toRadians
    对数指数:log和exp
    其它:sqrt、pow、random
    常数:PI、E

    random随机数的产生:    聚值范围是[0.0~1.0]

练习:假设一家小公司只有11个人,他们领到的号码是80-90之间,现在开始投资,每次只能抽一个奖项号码,抽五次,五次中奖号码不能重复。最后分别打印出这5个中奖号码。
以下程序为生成5个不同的随机数(范围80-90,包含80、90)
package cn.com.farsight; 
public class RandomLottery {

 public static void main(String[] args) {
  // TODO Auto-generated method stub

  int[] num = new int[10];
  int count = 0;
  for(int i = 0; i < 5; i++){
   while(true){
    double x = Math.random();
   // System.out.println(x);
   
    double temp = (double)(x*100);
   // System.out.println(temp);
    num[count] = (int)Math.floor(temp);
   
    for(int j = 0; j < count; j++){
     if(num[count] == num[j]){
      continue;
     }
    }
   
    if(num[count] >= 80 && num[count] <= 90){
     count++;
     break;
    }
   }
  }
 
  for(int i = 0; i < count; i++){
   System.out.println(num[i]);
  }
 }
}

3、String类
    String类对象代表一组不可改变的unicode字符序列
    创造新的字符串:concat、replace、substring、toLowerCase、toUpperCase和trim;
    查找字符的方法:endWith、startWith、indexOf、lastIndexOf;
    比较字符的方法:equals、equalsIgnoreCase、compareTo;
    其它:charAt、length()

    trim去字符串两端的空格
    注意length()方法与数组的length属性的区别
    
    常量字符串在第一次执行时会被保存在常量

作业1、通过键盘输入一个邮箱,判断邮箱的合法性
package checkName;
import java.util.Scanner;
public class Email {
 public static void main(String[] args) {
  Scanner name = new Scanner(System.in);
  System.out.println("input a mail account");
  String yy = name.next();
 
  int index1 = yy.indexOf('@');
  int index2 = yy.lastIndexOf('.');
  int len = yy.length();
 
  if(index1 == -1 || index2 == -1 ) {
   System.out.println("邮箱名必须含字符'.'与字符'@'");
   return;
  }
 
  if(index1 > index2) {
   System.out.println("最后一个字符'.'不能出现在字符'@'之前");
   return;
  }
 
  if((yy.lastIndexOf('c') == (index2+1)) && (yy.lastIndexOf('o') == (index2+2)) && (yy.lastIndexOf('m') == (index2+3))) {
   System.out.println("恭喜为合法邮箱名");
  }else {
   System.out.println("邮箱名必须以.com结束");
  }
 }
}
作业2、 通过键盘输入一个QQ号,判断这个QQ号的合法性(5-15位的数字,0不能开头)
package checkName;
import java.util.Scanner;
public class QQ {
 public static void main(String[] args) {
  Scanner qq = new Scanner(System.in);
  System.out.println("input a qq account:");
  String name = qq.next();
 
  int index1 = name.indexOf('0');
  int len = name.length();
 
  if(index1 == 0) {
   System.out.println("不能以'0'开头");
   return;
  }
 
  for(int i = 0; i < len; i++) {
   if(!Character.isDigit(name.charAt(i))) {
    System.out.println("只能是数字组合");
    return;
   }
  }
 
  if(len > 15 || len < 5) {
   System.out.println("QQ号位数应在5~15范围内");
   return;
  }
  System.out.println(name+"账号合法");
 }
}
    StringBuffer类
     StringBuffer类对象代表一组可改变的unicode字符序列

    StringBuilder类
    与StringBuffer类区别,StringBuilder类是非线程安全的, StringBuffer类是线程安全的。
    在没有多线程情况下,StringBuilder类的效率更高。

    String类/StringBuffer类/S tringBuilder类 都是CharSequence的子类,因为在接受CharSequence的地方,都可以使用三者之一

4、Collections(集合)    API

集合是容器,里面存放对象的。集合的元素必须是引用数据类型。
Collection接口:存放无序、可重复的元素
List接口:存放有序、可重复的元素
Set接口:存放无序、不可重复的元素
Map接口:存放键值对,每个元素都有两个对象,一个是键,一个是对应的值。
示例1:
Interface List<E>:其中<E>是泛型限定,用来限定集合中元素的类型的。
    示例2:
    
iterator是一个遍历集合,用来遍历集合。
    示例3:
    
Map映射表,用于存储元素对(它们分别称作‘键’和‘值’),一个映射不能包含重复的键,每个键最多只能映射一个值。
在Map中键和值的保存顺序和它们的插入顺序无关。
Map用put(key,value)方法来添加一个值,用get(key)方法获取与key键相关的值。

使用put方法添加映射关系时,如果集合中没有这个键,则添加一个全新的映射关系;
如果,集合中已经有了这个键,则修改这个键的值。
    示例4:
    
作业3、录入一个学生表到Java的集合中。学生表的字段结构如下:
学号
姓名 性别
年龄
电话号码
QQ号
入学成绩
1
张三
M
20
13809762890
98788987
643
2
李四
F
19
13587905620
77768621
588
3






将上表的信息录入到集合中,然后遍历出来,以表格的形式显示出来。
提示:可以使用List<Map<String,Object>>这种集合类型。

5、日期时间的处理
    1)Date类
        设计时候考虑不周,存在诸多问题,大部分方法和构造器已经Deprecated,不推荐使用。
    2)Calendar类
        用来在大部分场合替代Date类
        Calendar是一个抽象类,用来表示日历的概念
        通过Calendar的静态方法getInstance()来获得一个Calendar实例
        Calendar常用方法:
            a、int add(int field, int value)改变对应的field的值,注意在这里所以是“改变”而不是“增加”,是因为除了增加外,还可以对应减少field的值,只要给它一个负值就可以了。
            b、void roll(int field, int value)和add()方法类似,区别在于,即使加上value后对应的field值已经超出了它所能表示的最大范围,也不会改变更大的field的值。
            c、int get(int field)根据指定的field,返回相应的时间值。通常,参数field使用Calendar的静态常量来表示,例如:想得到当前的月份,可以使用方法get(Calendar.MONTH)来获得。
            d、int getActualMaximun(int field)获得指定的时间字段(field)所通表示的最大值。例如:getActualMaximun(Calendar.YEAR)将会得到一个所能表示的最大的年份值。
            e、int getActualMinimun(int field)获得指定的时间字段(field)所通表示的最小值。
            f、int getFirstDayOfWeek()获得表示星期的第一天的数值   返回值为1,注意星期日是第一天
            g、java.util.Date getTime()获得一个这个Calendar所表示的日期的对应的Date类型的值
            h、long getTimeInMillis()获得以毫秒表示的时间值
            i、void set(int field, int value)给一个对应的字段field设置一个值,例如:将日期设置成25号,可以调用set(Calendar.DAY_OF_MONTH, 25)
            j、void set(int year, int month, int day)设置年、月、日,这里需要注意的是月份是从0开始的
            k、void set(int year, int month, int day, int hour, int minute, int secondd)设置年、月、日、时、分、秒
            l、void setTime(Date time)将Calendar对象的当前时间设置成Date表示的值
            j、void setTimeInMillis(long time)设置Calendar对象的当前时间为指定time的值
        
    3)TimeZone类
        表示时区(地球被划分为24个时区,中国北京时间属于东八区)
        TimeZone是一个抽象类,它表示的是一个时区的概念
        静态方法getDefault()来获得程序所运行机器上的默认时区
            a、String[] getAvailableIDs()/getAvailableIDs(int offset)获得所有有效的时区ID。时区ID是用于标示一个时区的值。例如:北京时间的ID其实是Asia/Shanghai
            b、String getID()获得对应此TimeZone的ID
            c、String getDisplayName()获得对应的显示名称。例如:北京时间的显示名称为“中国标准时间”
        
6、java线程
    多进程:在操作系统中能(同时)运行多个任务(程序)。
    多线程:在同一应用程序中有多个顺序流(同时)执行。

    Java线程模型,由java.lang.Thread类封装和虚拟CPU来实现。
    CPU所执行的代码,传递给Thread类对象。
    CPU所处理的数据,传递给Thread类对象。

    进程中至少包含一个线程。
    多线程能够充分地利用CPU资源

    创建线程
    1)定义一个线程类,它继承类Thread并重写其中的方法run(),实例化这个类,调用start()方法启动这个线程。方法run()称为线程体;由于Java只支持单继承,用这种方法定义的类不能再继承其他类。
    2)提供一个实现接口Runable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程时,把目标对象传递给这个线程实例,由该目标对象提供线程体。

    两种线程创建方式的比较
    1)使用Runnable接口
        可以将CPU,代码和数据分开,形成清晰的模型;
        还可以从其他类继承
        保持程序风格的一致性
    2)直接继承Thread类
        不能再从其他类继承
        编写简单,可以直接操纵线程,无需使用
        Thread.currentThread()
    
    线程状态图
    
    Thread.State内部类中,定义了6种线程状态:
    1)BLOCKED     2)NEW     3)RUNNABLE     4)TERMINATED     5)TIMED_WAITING     6)WAITING
    创建状态(new Thread)
        当创建了一个新的线程时(MyThread thd = new MyThread();),它就处于创建状态,此时它仅仅是一个空的线程对象,系统不为它分配资源。处于这种状态时只能启动或终止该线程,调用除这两种以外的其它方法都会失败并且会引起非法状态异常IllegalThreadStateException
    可运行状态(Runnable)
        当线程处于创建状态时,可以调用start()方法(thd.statr();)来启动它,产生运行这个线程所需的系统资源,安排其运行,并调用线程体run()方法,这样就使得该线程处于可运行(Runnable)状态。
    不可运行状态(Waiting/Timed_Waiting)
        线程处于可运行状态时,当下面四种发生,线程就进行不可运行状态:
            调用了sleep()方法
            调用了suspend()方法
            为等候一个条件变量,线程调用wait()方法
            输入输出流中发生线程阻塞
    终止状态(Terminated)
        线程终止的两种方法
            自然撤消——指从线程的run()方法正常退出;
            强制停止——调用线程的实例方法stop()可强制停止当前线程
        如果希望线程正常终止,可采用标记来使线程中的run()方法退出
        
    线程的结束方式
        1)线程到达其run()方法的末尾
        2)线程抛出一个未捕获的异常
        3)另一个线程调用了一个Deprecated的stop()方法。

    线程控制的有关方法
    
方法
说明
start()
新建的线程进入Runnable状态
run()
线程进入Running状态
wait()
线程进入等待状态,等待被notify,这是一个对象方法,而不是线程方法
notify()/notifyAll()
唤醒其他的线程,这是一个对象方法,而不是线程方法
yield()
线程放弃执行,使其他优先级不低于此线程的线程有机会执行,它是一个静态
getPriority()/set Priority()
获得/设置线程优先级
sleep()
线程睡眠指定的一段时间
join()
调用这个方法的主线程,会等待加入的子线程完成
    
    多个线程访问同一个资源时,需要同步(synchronized)
        1)、同步方法
        2)、同步代码块,需要有一个同一个对象作为同步锁

    线程示例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值