Java基础-1
一、HelloWord
/**
*打印字符串
*@author 01
*@version 1.0 2019-7-15
*/
public class Main {
public static void main(String[] args){
System.out.println("Hello world!");//打印
}
}
- 每个文件可以有多个class,但只能有一个public class 其中类名与文件名相同
- public 是权限修饰符,所有类都可以访问;private是只有所在的类内可以访问,子类可以继承但是不能访问;protected是子类可以继承也能访问,包外不能访问;默认是define,只有包内可以访问。
- import写在package之后
- 注释写法和C语言一样
- 最好是一个类一个文件
-
类名最好大写
-
编译后的后缀名是.class 是执行文件,源代码后缀是.java
-
源代码编译成.class文件,class文件由JVM解释执行,所以java是半编译,半解释型语言。
二、数据类型
- boolean //1位 不能类型转换
- byte //1个字节 ASCII编码,和C的char相等,本质其实是整形
- char //2个字节 UTF-16即unicode编码
- short //2个字节
- int //4个字节
- long //8个字节 18位以内一定不会溢出
- float //4个字节
- double //8个字节
数据写法与类型转换
- 整数数值默认int,long的写法是加L或l后缀
- 浮点默认是double,自动加后缀D,float要加f或F后缀
- 数据转换:大内存类型不能转小内存类型、int 不能转float,long不能转double
- char可以转int,但不能按d%打印
- 0b或0B表示2进制
- 0x或0X表示16进制
- 浮点16进制科学计数法 0XFF00P2,p后面跟的是2的指数,e后跟的是10的指数,只有16进制浮点有p
- 非10进制小数写法只有科学计数法
- 数值为了方便看,可以加_分割符,比如0B0100_0100,1_000_000
- 0.0d/0=>Double.NaN
- 1.0d/0是无穷大,0/0或1/0报错,因为只有double有无穷大无穷小和NaN(not is number)
- 2.0-1.1结果为0.8999......
三、变量
- final 修饰常量
- 变量定义可以有$,其他和C一样,但是$最好不用
- java没有逗号表达式
- 变量必须初始化才能用,属性会默认初始化
- 超过18位的整数用BigInteger类
- 复杂数学计算用java.lang.Math类
四、字符串
常用函数
- charAt(int index)
- codePoinAt(int index)
- compareTo(String other)
- subSyting(int n)
- subString(int n,int m)
- equals(String s)
- length()
- replace()
- replaceAll()
- toLowerCase()
- trim()
- String.join(...)
- indexOf(String s)
- lastIndexOf(String s)
- startWith(String s)
- endWith(String s)
- Integer.toBinaryString(int i)
- repeat(int n) //java12才有
- String.format
StringBuilder
- insert
- delete
- append
- reverse
- setCharAt
五、输入输出
1、格式化输出
System.out.format()
- %d
- %x
- %a //16进制浮点
- %o //8进制
- %,3.2f
- %e
- %g
- %s //类型转字符串输出
- %c
- %b
2、输入输出
用java写PTA的题,如果输入选scanner,很容易发生超时。用缓存流输入效率会高很多。不过代码比较多,没办法,java语言没有像C语言一样的scanf。
下面是一个输入n行矩阵放入整形数组中,然后打印出来的代码。很简单的功能,但是要写这么多,有时候java比C还啰嗦很多。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Solution {
private static void outputArray(int[] a){
var s=Arrays.stream(a).mapToObj(x-> x+"").collect(Collectors.joining(" "));
System.out.println(s);
}
private static int[] inputArray(BufferedReader br, int n) throws IOException {
int[] a=new int[n];
String[] str = br.readLine().split("\\s");
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(str[i]);
}
return a;
}
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
int[][] a=new int[n][n];
for(int j=0;j<n;j++) {
a[j]=inputArray(br,n);
}
for (int[] i:a)
outputArray(i);
}
}
六、数组
int[] a={1,2,5,4,3,6,1};
//copy#1
int[] b=new int[10];
System.arraycopy(a,0,b,0,a.length);
System.out.println(Arrays.toString(b));
//copy#2
b=Arrays.copyOf(a,9);
System.out.println(Arrays.toString(b));
//copy#3
int[] c=Arrays.copyOfRange(a,0,4);
System.out.println(Arrays.toString(c));
//快排
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//二分查找
int i=Arrays.binarySearch(a,3);
System.out.println(i);
//fill
Arrays.fill(a,3);
System.out.println(Arrays.toString(a));
七、正则表达式
pattern新建方法:调用Pattern.compile
正则符号 | 意思 |
---|---|
\\d | 一个数值 |
\\w | a-zA-Z0-9 |
\\s | 空格和会车 |
\\\\ | \ |
\n | 回车 |
+ | {1,} |
* | {0,} |
? | {0,1} |
. | 任意字符 |
$ | 结束 |
^ | 开始 |
[^] | 表示不是括起来的内容 |
[] | 表示括起来的内容中选其中一个 |
| | 或者 |
\b | 单词边界,非捕获 |
.*? | 非贪婪 |
(?=) |
八、数据结构
HashMap根据hashcode进行存储,调用key的equals,hashcode和==判断key是否相等,key只能是唯一的,hash碰撞时,用红黑树存储。
get取值根据equals和hashcode取值。根据hashcode获取数组下标,根据equals查找对应的key。
如果equals和hashcode不一致,就很容易出现错误,造成取不出来的情况。数组下标一样,hashcode不一定一样,但是hashcode不一样,equals又恰好一样,就会产生取不出来的情况。
另外,如果重写hashcode方法,根据属性内容计算hashcode,变量的hash值会根据变量的内容变化,同时数组下标位置不会变,这样也会发生错误。比如本来equals相等,hashcode相等的key是不能同时存在的,但如果放进去的时候不同,经过后来变量的赋值,变的一样了,其中一个值就会取不出来。
但如果不重写呢?不重写是根据内存地址计算hashcode,这样就不能根据内容取数据,只能根据实例取数据。这样的话,最好把equals重写成==。这样万无一失。
LinkedList作为栈的操作是push和pop,队列是offer和poll。