Java考前抱佛脚指南 作者: Semesse 时间: 2019-01-08 分类: 千叶 考试是 ACM 式黑盒测试,所以我们能通过各种方法达成目标。也就是说我们可以不知道 String 是常量这种知识点,但是会用 String 提取年份就行。 首先肯定是类的使用,包括继承、封装和多态。个人觉得需要用到也就是应该重点复习的: - 基本数据类型(和 C++ 比较类似,但 char 是两个字符) - 运算符和控制语句(写了那么多应该不怎么用复习) - 类的创建、构造方法、成员、重载 - 继承、方法重写、调用父类变量/函数、上转型 - 接口、实现接口 - try-catch语句 - 常用实用类 - 输入输出流中的 File, FileReader/FileWriter, BufferedReader/BufferedWriter, RandomAccessFile, Scanner - 多线程 Thread, Runnable, sleep String 类,字符串处理相关的题可能不会少于三个。 列一下我觉得可能会用到的方法 ### String类 ```java //构造 String("xxx"); //字面量 String(char[] value) String(char[] value, int offset, int count) //字符数组 //常用方法 char charAt(int index) //第i个字符 char[] toCharArray() //转为字符数组 boolean contains(CharSequence s) //包含另一个字符串 boolean equals(String s) //两字符串相等 int length() //长度 String replaceAll(String regex, String replacement) //字符串替换 String[] split(String regex) //字符串分割 boolean startsWith(String prefix) boolean endsWith(String suffix) //是否以某个字符串开始/结束 int indexOf(String str) int lastIndexOf(String str) //首次/最后出现str的位置 String substring(int beginIndex, int endIndex) //字串 ``` ### StringTokenizer 感觉不大会考,而且可以用 String.split 或者 StringBufferInputStream + Scanner 替代 ```java StringTokenizer(String str) StringTokenizer(String str, String delim) int countTokens() //计算分割后token数量 String nextToken(String delim) //获取下一个token ``` String.split等价: ```java String[] s2=s1.split("[+-?<>]") <=> StringTokenizer(s1, "+-?<>") //方括号中间就是构造Tokenizer用的delim s2.length <=> countTokens() s2[i]为第i个token ``` ### Scanner 挺好用的,不止可以读取键盘输入,而且可以从文件读取。要读取文本文件时比字符流好用。 ```java Scanner(InputStream source) Scanner(File source) //可以从InputStream构造也可以用文件 String next() String nextLine() int nextInt() //float/double/short/long同理 boolean hasNext() //判断是否有下一个,通常和while连用 Scanner useDelimiter(String pattern) //使用分隔符,默认是空格和换行 while(scanner.hasNextInt()){ int n = scanner.nextInt(); } ``` ### StringBuffer 需要对字符串进行各种操作的时候用,可以增删改 ```java StringBuffer(String str) StringBuffer(int capacity) StringBuffer append() //字符串末尾追加 StringBuffer delete(int start, int end) //删除start到end StringBuffer replace(int start, int end, String str) //从start到end用str替换 StringBuffer insert(int offset, CharSequence s) //在offset插入一段字符串, 也可以传入int等类型 char charAt(int index) //第i个字符 void setCharAt(int index, char ch) //设置第i个字符 ``` ### Date Date 类现在基本是废的,大多数方法已经弃用,转移到了 Calendar 类中。某些时候需要作为中继类,例如 SimpleDateFormat 解析出的日期,或者给 Calendar 设置日期。 ### Calendar Calendar对象只能通过getInstance获得,可以获取/设置日期时间,也可以加减时间但不能计算时间差。 ```java Calendar getInstance() void add(int field, int amount) //field通过Calerdar类中的常量指定,例如Calendar.YEAR; amount可以为负数 int get(int field) //获取某个field的值 void setTime(Date date) //设置calendar当前的时间 ``` #### Instant 这是一个 Java8 中的类,位于 java.time 包中,不确定是否可以在考试时使用,可以用来计算时间差。计算时间差需要引入 ChroniUnit。 ```java Date date = new Date(); Date anotherDate = new Date(); Instant t1 = date.toInstant(); Instant t2 = date.toInstant(); t1.until(t2, ChronoUnit.DAYS); ``` ### SimpleDateFormat 格式化时间用的,可以解析时间也可以把 Date 格式化成字符串。最常用的格式应该是 yyyy-MM-dd(年-月-日)。 ```java SimpleDateFormat(String pattern) String format(Date date) //格式化 Date parse(String text) ``` | Letter | Date or Time Component | Presentation | Examples | | ------ | ------ | ------ | | G | Era designator | Text | AD | | y | Year | Year | 1996; 96 | | Y | Week year | Year | 2009; 09 | | M | Month in year | Month | July; Jul; 07 | | w | Week in year | Number | 27 | | W | Week in month | Number | 2 | | D | Day in year | Number | 189 | | d | Day in month | Number | 10 | | F | Day of week in month | Number | 2 | | E | Day name in week | Text | Tuesday; Tue | | u | Day number of week (1 = Monday, ..., 7 = Sunday) | Number | 1 | | a | Am/pm marker | Text | PM | | H | Hour in day (0-23) | Number | 0 | | k | Hour in day (1-24) | Number | 24 | | K | Hour in am/pm (0-11) | Number | 0 | | h | Hour in am/pm (1-12) | Number | 12 | | m | Minute in hour | Number | 30 | | s | Second in minute | Number | 55 | | S | Millisecond | Number | 978 | ### Random,Class,Console Random 应该不会考,毕竟没法黑盒测试 Class 类涉及反射相关知识,也不大会考 Console 没讲过 ### 泛型集合 考的应该是 ArrayList 或 HashMap,用法和C++的 template 类似 #### ArrayList ArrayList 类似于数组,但是比数组强大很多,自带增删查改方法。 ```java ArrayList([int initialCapacity]) //具体用法像这样 //ArrayList list = new ArrayList(); boolean add(Type e) void add(int index, E element) Type remove(int index) //返回移除的元素 boolean removeAll(Collection> c) //集合做差 void clear() boolean contains(Object o) Type get(int index) boolean isEmpty() int indexOf(Object o) int lastIndexOf(Object o) Type set(int index, Type element) Object[] toArray() ``` ### HashMap HashMap 存储键值对数据,可以每一个键对应唯一的值(入射)。例如从学号到学生姓名的映射、用户名到密码的映射。 ```java HashMap(int initialCapacity) //具体用法像这样 //HashMap map = new HashMap(100); boolean containsKey(Object key) boolean containsValue(Object value) //是否有某个Key/Value Value get(Object key) Value put(Key key, Value value) Value remove(Object key) ``` ## 多线程 多线程是一个非常难的玩意,所以应该不会出现奇怪的考法,学会创建和使用线程,以及 sleep 应该就足够。(如果有 synchronized 的话那应该挂一大片) ```java class A extends Thread{ public void run(){ //do something } } class B implements Runnable{ public void run(){ //do something } } public class Main{ public static void main(String[] args){ A a = new A(); a.start(); Thread b = new Thread(new B()); b.start(); } } ``` 以上例子展示了 Thread 和 Runnable 的用法,其中 Runnable 是需要先构造成 Thread 才能运行的。 对于需要让两个线程互相通信的问题,需要用到synchronized和wait/notify,同一个对象的synchronized修饰方法只能同时被一个线程使用,而sychronized也可以用来锁定某个Object。但是我知道讲了这么多其实跟没讲一样,所以直接上福利吧: 那天小测验的A和B两个线程轮流输出,如果直接用Thread.sleep(100)的话,也可能会因为各种线程调度问题出现偏差,所以我们可以让A和B轮流使用占用某个相同的对象,从而稳定输出,代码实现如下 ```java public class MultiThread { public static void main(String args[]){ //测试 A a=new A(); a.setValue("hello world"); B b=new B(); int[] arr={1,2,3,4,5,6,7,8}; b.setArr(arr); a.start(); b.start(); } } class Lock{ static Object lock=new Object(); //lock是Lock类中的静态成员,A和B都可以直接访问 } class A extends Thread { String value; public void setValue(String value) { this.value = value; } @Override public void run() { for(int i=0;i 标签: none
萨斯噶虹虹desu
This is a test comment.