第一章
Java 和c#一样都是纯面向对象的语言,所有变量和函数都要写到对象里面
Java跨平台,先编译生成java字节码,这个字节码可以放到不同OS下运行,Linux mox ,windows
C就不行 在windows下生成的是.exe文件,linux下生成是二进制文件就不行
java的跨平台要经过一遍虚拟机,那是不是这就注定了java的执行效率没有c高
显示转换必须加上(type)
高精度转换到低精度必须加上类型否则报错
BufferedReader 只能一行行读
String str = br.readline() String[] st = str.spplit(” “);
bw.write(str); bw.flush;
float 大概6~7位
double 大概15~16位
显示表示float,后面加f或F,显示表示double,后面加d或D
final 常量
显示转化(强制转换)可以大转小,隐式转化只能小转大
java和c中的/是向0取整,python中的/是向下取整
数学中的取模的结果只能是正数,但java和c中可以为负数
浮点数的比较:
直接判断可能会有误差 if(x==y)
一般通过计算两个数的差的绝对值和一个很小的数进行判断来比较 if(Math.abs(x-y)<1e-8)
如果定义过的浮点数计算过,有可能再判断的时候产生误差,没有参与运算就不会有
输入数据量超过10的五次方,一般用BufferedReader
System.out.println(a + “sd” + “sd”);只能输出一个数
浮点数在参与运算的 时候会导致精度缺失,参与运算后可能会导致比较 的时候不准确因此用到
if(a - b > 1e-8)认为相等
第二章判断语句
if(year % 100 != 0 && year % 4 == 0 || year % 400 == 0)
String[] str = sc.nextLine().spilt(” “);
基本类型都有个类 int Integer 字符串 转对应类型的API
int = Integer.parseInt(str);
double = Double
char = Character
基本类型转字符串的话用其对应的类有个函数叫toString
a.equals(“”)a为空会报异常
java 中类一定有构造函数,如果没有系统默认一个没有参数的构造函数
String str = new String();
这个时候str为空
不能String str;
if(str == null)str 没有赋值计算会报错
计算时间问题:A:B C:D小时分钟可以把其换成分钟再计算
第三章 循环语句
读数
n 输入n次
while(n – > 0)
读到某一个数为止
while(true)
{
int n = sc.nextInt();
if(n == num)break;
}
一直读直到不输入为止
while(sc.hasNext())
for(int i = 0; i < n; i )
for(int j = 0; j < m; j )
i * m + j = 1 , 2, 3, 4…
计算余数的时候注意是正是负
输入两个数时候题目没有说明谁大谁小就需要判断一下
判断约数 i是x约数 x/i也是x的约数 i <= x/i一定会成立
菱形 曼哈顿距离
换个坐标系,判断到y轴的距离输出”*或者空格
第四章 数组
数组初始化默认为0
char是int的0 也就是 ‘\0’
Arrays.toString(数组) 结果[a[1],a[2] …]
Arrays.sort()
如果要逆序,需要传入一个函数
Array.sort(a, (x, y) -> y - x) 函数可以用lambda表达式代替
自定义函数传入的a必须是类如Integer
Arrays.fill(a, val)基本类型都行
①java中数组长度可以是变量,而c++中最好是常量
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1 abs(i - j) + 1
2^(i+j) == 1 << i + j
方位问题
dx=[],dy=[]
循环问题(x+1) % n
第五章 字符串
只读字符串
每次操作会生成一个新的字符串 只能读取不能写入
⑦将基本数据类型转化为对应字符串:
方式一:利用拼接空字符串
int money=123;
String money_str=”“+money;
方式二:用对象定义基本数据类型,这样就可以利用API toString()了
Integer money=123;
String money_str=money.toString();
sc.hasNext()读到没有返回false
单词替换只能把所有的单词列出然后依次对比,不能直接用查找,找to,可能tostring也是
双指针
适用于找连续相同的字符串
for(int i = 0; i < n; )
{
int j = i + 1;
if(j < n && a[j] == a[i]) j ++; 这里一定吧j < n 写前面
i = j;
}
字符串的移位包含问题
把长度为n的主串移动n-1次能得到n种不同的子串,依次查找即可
Stringbulid 与StringBuff一个线程安全一个不安全是因为是否加锁
第六章 函数
除String以外的数据类型的对象,例如数组、StringBuilder等采用引用传递。
4.引用传递本质上也是值传递,只不过引用传递传的是地址,而地址也是一个值
5.java中没有指针的概念
数组去重 n^2
for(int i = 0; i < n; i )
{
for(int j = 0; j < i; j )
if(a[i] == a[j])
{
break;
}
}
选择排序
for (int i = l; i <= r; i )
for (int j = i + 1; j <= r; j )
if (a[j] < a[i]) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
dp 用递归 也就是数学归纳法、
第七章 类
同一串逻辑对应多种不同类型的话,我们就可以用泛型来写,相当于一个模板。 template
如Stack[HTML_REMOVED] E只能是对象,能用各种对象
Stack[HTML_REMOVED] a = Stack<>(); 这里可用省略,如果编译器可用推断出来的话。
类赋值的话 是传引用 指向同一个地方
String str = “sd”;
String s = str;
hashCode()会返回对象物理地址的哈希值”是错误的。默认hashCode()会返回物理地址的哈希值,但是String对象将这个方法重载了,变成计算字符串的哈希值了。
定义一个类 new一下就不为空
继承的类或者接口
如果定义的是父类就只能 调用父类的函数
接口同理
O(1)删节点
下个节点的值赋给当前节点,然后当前节点指向下下个节点
遍历链表
for(Node p = head; p != null; p = p.next)
二路归并
while(i < n && j < m)
{
if
i
else j
}
if 链表直接套上p = q.next 数组要循环一遍
if
如果一个链表的表头可能被修改这时候就需要建立一个虚拟头结点指向表头
第八章 常用容器
import java.util.*
定义对象
A a = new B A可以是主类也可以是接口 B只能是类不能是接口
输出前k个小的数可以用优先队列
从一个数组中找到两个数的和为n
用set
函数最后要返回一下不然会报错
return new in[]{1, 2};
return null;返回数组或者类的情况下
java
if((n >> i & 1) == 1) 优先级问题
map 遍历
for(Map.Entry[HTML_REMOVED] x:entrySet())
System.out.print(“% %d\n”, x.getKey(), x.getValue());
第九章 异常
运行时异常 可以不用管 jvm帮我们处理
1 打印出相关异常内容
2 停止程序
非运行时异常 不处理编译不通过
怎么处理?
1 捕获 自己处理
2 往外抛出 jvm处理
有时候打开文件、链接、网站等等会开辟一个缓冲区,但是遇到异常的时候可能会退出,然后把缓冲区忘记关闭就会导致资源浪费、内存泄漏等等问题!
这时候可以用个语法糖(java帮我们做好的建议这种)
或者在finally 中关闭(代码有点繁琐)
第十章
多线程
比如IO操作慢并且不占用CPU,只如只有这一个线程的话就会一直等待
比如打开一个页面 发现图片还没加载好,文字已经加载好了
重写run函数
实现的 逻辑写到run函数
线程的执行顺序不确定,取决于操作系统的调度
APi interrupt():从休眠中中断线程 或者wake中中断
不会直接停止这个线程,只是给这个线程发送一个异常
至于线程怎么处理就要看线程具体的执行逻辑
锁:解决读写读写冲突
假如多个线程共享同一片读写空间的时候可能会有冲突
cnt = cnt + 1 这时候cnt = 0 被挂起
cnt = cnt + 1 这个时候 cnt = 1;
但是上面拿到的仍然是 0
两个进程同时写 或者一个进程读一个进程写也会有冲突
那么是先读再写还是先写再读呢
当两个线程至少有一个是写的时候就会有冲突
同一时间只有一把锁,当有多个线程获取这把锁的时候只会有一个线程得到其余都要等待
Integer 对象和String 类似会变的 这里要锁住的话多个对象要传入的是同一个对象
Synchronized 锁加到对象上 对象不能变
Synchronized 锁加到函数上 函数不能变
wait与notify 等待与唤醒等待
只能用到 Synchronized代码里面