Xuanmin-W / OJ

在Hankerrank、计蒜客等平台上刷题的笔记
0 stars 0 forks source link

Series of Java in Hankerrank #2

Open Xuanmin-W opened 7 years ago

Xuanmin-W commented 7 years ago

Java Stdin and Stdout I:Scanner class 包:import java.util.Scanner; new:Scanner s = new Scanner(System.in); nextInt():只能读取数字,并且读取完成后光标留在本行。 next()只能得到空格、tab键、回车前的第一个字符串,读取完后,光标留在本行。(如果是放在循环体中有这么一句:str = next(),那么str最后存储的是最后一个单词。) nextLine()能够跨space读取,会一直读取到当前行的最后。如果读取到\n,会换行。然后结束。 例:输入:1451364\n weffwa 如果先调用nextInt(),然后调用nextLine(),那么只会读取到1451364。 然后nextLine()会读取\n,换行并结束不会读取下一行信息。 如果想再读取weffwa,必须再调用一个nextLine()方法。 *实测:有三行,每行一个数字,直接三个nextInt()就可以获取三个数字了,不需要nextLine()

hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果需要判断是否包含下一个字符串,可以省略Xxx.

Xuanmin-W commented 7 years ago

Java Stdin and Stdout II: *实测:输入:一行整型,回车;然后一行双精度,回车;最后一行字符串 依次调用nextInt();nextDouble();nextLine();会发现前两个都能得到正确的int和double的输出,第三个字符串是空白。确实nextInt();nextdouble();读取不会把enter key读取掉,会留在缓冲区,但是他们会把自己的有效输入前的缓冲区中的enter key省略掉(比如nextdouble();正确读取就是把nextInt();留下的enter key忽略掉了)。此时我们想要正确读取字符串,需要两个nextLine();

Xuanmin-W commented 7 years ago

Java Loops II: java中求n次方:double pow(double base, double exponent),求base的exponent次方,其中base和exponent可以是任何原生数据类型。例:int c = (int)Math(2.0,3);

Xuanmin-W commented 6 years ago

Java Datatypes: byte 8bit short 16bit int 32bit long 64bit try catch:可以在java出现异常(运行时出错,非编译时出错)时,不终止程序运行,可以将错误捕捉到然后继续执行余下的代码,程序继续执行。try就像一个网,把try{}里面的代码所抛出的异常都网住,然后把异常交给catch{}里面的代码去处理。如果出现异常而且没有try catch,那么就会由jvm报错,程序停止运行。 例如这个例子来判断输入的数字能被什么类型支持的: try { long x=sc.nextLong(); System.out.println(x+" can be fitted in:"); if(x>=-128 && x<=127)System.out.println(" byte"); if(x>=-32768 && x<=32767)System.out.println(" short"); if(x>=-2147483648 && x<=2147483647)System.out.println(" int"); System.out.println(" long"); } catch(Exception e) { System.out.println(sc.next()+" can't be fitted anywhere."); }

运行结果: C:\Users\minge\Desktop>java Solution 2 536434 536434 can be fitted in:

Xuanmin-W commented 6 years ago

Java End-of-file 创建数组:String[] writer = new String[10000]; 创建动态数组:Arraylist list = new Arraylist(100); 本题代码: public class Solution {

public static void main(String[] args) {
    Scanner reader = new Scanner(System.in);
    String[] writer = new String[10000];
    int i = 0;
    while(reader.hasNext()){
       writer[i] = reader.nextLine();
       i++;
    }
    for(int j = 0;j<i;j++){
        System.out.printf("%d %s\n",j+1,writer[j]);
    }
}

}

Xuanmin-W commented 6 years ago

Java Static Initializer Block: 静态标识符static: 1)static变量:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。 2)static方法:static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。 3)static代码块:static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。(在{}前加static) 本题代码: public class Solution{ static int B; static int H; static boolean flag; static{ Scanner in = new Scanner(System.in); B = in.nextInt(); H = in.nextInt(); if(B>0 && H>0) flag = true; else { flag = false; System.out.print("java.lang.Exception: Breadth and height must be positive"); } } public static void main(String[] args){ if(flag){ int area=B*H; System.out.print(area); }

}//end of main

}//end of class

Xuanmin-W commented 6 years ago

Java Int to String: int -> String: s=String.valueOf(i); String -> int: i=Integer.parseInt(s);

Xuanmin-W commented 6 years ago

Java Date and Time: 创建calendar类对象,因为calendar类为抽象类,所以不能用他的抽象方法来新建对象,用getInstance方法创建的对象获取的是当前系统时间:Calendar c = Calendar.getInstance(); 把calendar对象的时间设为我们指定的时间。三个参数分别为年月日为int型。其中month 为实际的月份减一:c.set(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(day)); 获取当前日期是星期几,存在一个int型变量中,其中星期天对应1,依次类推:int start = c.get(Calendar.DAY_OF_WEEK);

Xuanmin-W commented 6 years ago

static修饰符 1、概述

  static关键字的中文意思是静态的,该修饰符可以修饰字段、方法、内部类。使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的成员变量一般称作类成员变量,而static修饰的方法一般称作类方法。

2、static修饰符的特点

  1)static修饰的成员(字段/方法),随着所在类的加载而加载。当JVM把字节码加载斤JVM的时候,static修饰的成员已经在内存中存在了

  2)优先于对象的存在,对象是我们手动通过new关键字创建出来的。

  3)satic修饰的成员被该类型的所有对象所共享。根据该类创建出来的任何对象,都可以访问static成员。 分析:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系(通过反编译可以看到)。

  4)直接使用类名访问static成员 ,因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员。

3、类成员和实例成员的访问

  1)类成员:使用static修饰的成员,直接属于类,可以通过类来访问static字段和static方法

  2)实例成员:没有使用static修饰的成员,只属于对象,通过对象来访问非static字段和非static方法(对象其实可以访问类成员,但是底层依然使用类名访问的)

  3)static方法中:只能调用static成员

  4)非static方法:可以访问静态成员,也可以访问实例成员

4、什么时候定义成static的字段和方法

  如果这个一个状态或行为属于整个事物(类),就直接使用static修饰,被所有对象所共享。 在开发中,往往把工具方法使用static修饰。如果不使用static修饰,则这些方法属于该类的对象,我们得先创建对象再调用方法,在开发中工具对象只需要一份即可,可能创建N个对象,此时我们往往把该类设计为单例的,但还是有点麻烦。所以,一般在开发中设计工具方法,为了调用简单,我们使用static修饰。

5、类成员的使用

  1)利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份,可以直接被类名调用。

  2)弊端:生命周期过长。