1.编译
1 | // hello.c |
1 | # 头文件所在目录 |
typedef还能这么写?
1 | typedef const struct JNIInvokeInterface_ *JavaVM; |
直接生成预编译的文件
1 | gcc -I "/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers" -E hello.c -o hello.i |
static
1 | 静态变量保存在数据区 |
1 | // hello.c |
1 | # 头文件所在目录 |
1 | typedef const struct JNIInvokeInterface_ *JavaVM; |
1 | gcc -I "/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers" -E hello.c -o hello.i |
1 | 静态变量保存在数据区 |
1 | sudo apt-get install build-essential |
1 | // 0. #include 预处理指令 |
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 | // cin 输入的字符串会自动在末尾追加'\0' |
1 | // getline 获取指定长度的字符串 |
1 |
|
1 | // 字符串拼接,c和c++两种方式 |
1 |
|
1 |
|
1 | // +*( 会被当作分隔符 |
1 |
|
1 |
|
1 |
|
1 |
|
1 | // 指向结构体的指针 |
1 | // 复合类型指针 |
1 |
|
1 |
|
1 | // 统计总字符数和空格数 |
1 |
|
1 |
|
1 |
|
1 | // int* const src = new int[len]; |
1 |
|
1 |
|
1 | // 使用typedef简化声明和定义的写法 |
1 | // 当函数调用的开销,占函数执行的开销比重比较大的时候,可以使用内联,否则意义不大 |
1 |
|
1 |
|
1 | // Dog和Dog&是两个类型 |
1 |
|
1 |
|
1 |
|
1 | // 具体化模版 |
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 | // 编译的时候,为每个类添加了一个成员,就是虚表指针。 |
1 | // 父类 |
1 |
|
1 |
|
1 |
|
1 | // 子类对外的接口,是基类和子类的叠加,选择较小的范围 |
1 |
|
1 |
|
1 |
|
1 | // 1.隐式实例化 |
1 | // 即模版类中的成员的类型,使用另一个模版类创建 |
1 |
|
1 |
|
1 |
|
1 | // |
1 | // 类中的所以方法都是友元函数 |
1 | // 没啥可说的 |
1 |
|
1 |
|
1 |
|
1 | // 1. dynamic_cast: 父子类的转换 |
1 |
|
1 | wha's hhhh aabb ends well |
1 |
|
1 |
|
1 |
|
ArrayList 底层是数组,默认10个元素,每次增加原来size的一半
LinkedList 底层是双向列表,可以当作列表用(add/remove), 可以当做队列用(offer/poll),也可以当作栈用(push/pop)
HashSet 底层用HashMap实现的
TreeSet 使用TreeMap实现
HashMap 哈希表的实现
Hashtable 相当于HashMap加了synchronized
LinkedHashMap 继承了HashMap,每个Entry加了前驱和后继指针,用于保持插入顺序
TreeMap 底层是二叉搜索树
Vector 与ArrayList类似,是线程安全的,一般不用
Stack 继承了Vector,栈的实现
Class.forName(“xxx”);
泛型是一种类模版,就比如ArrayList,如果不用泛型,数组只能定义为Object,如果这样,编译的时候,就没办法做类型检查。为了兼容老版本的java,使用了类型擦除,也就是字节码中,不保存元素的类型信息。
并发是什么
并发就是同时执行两段指令。
为什么要用并发
因为cpu的速度远远超过存储器和其他硬件的速度,如果不用并发,大部分时间,cpu是空闲的,为了充分利用cpu,所以并发。
并发面对的问题
开了太多线程,线程切换会消耗一些资源,如果耗费在线程切换上资源太多,性能下降太快。
死锁,主要的死锁场景包括:
原子操作
DCL单例
1 | public class Singleton { |
java并发解决的三个性质
java线程状态机
1 | public class PC { |
1 | public class TestJoin { |
1 | import java.util.concurrent.locks.Condition; |
1 | import java.util.concurrent.locks.ReentrantReadWriteLock; |
队列同步器(AQS)
ConcurrentHashMap
ConcurrentLinkedQueue
阻塞队列
原子操作类
线程池
java内存布局:
GC的几个问题:
怎样找到垃圾
通过搜索GC root,如果没有引用被GC根指向,则认为是垃圾。
引用的类型分四种:
GC root是什么:
怎样回收
分代回收。
回收算法:
分代:
何时回收
怎样分配对象内存
垃圾回收器:G1,CMS。。。
类加载
1 | # 1、Standard commands (标准命令) |
1 | #查看命令查找的顺序 |
1 | hello=kkk |
1 | export hello |
1 | myver=kkk`uname -r` |
1 | declare -i num=$RANDOM%10 |
1 | echo $$ |
1 | echo $? |
1 | read myname |
1 | #声明int类型 |
1 | ulimit -a |
1 | #/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin |
1 | #替换, 把kkk替换成aaa |
1 | #如果hello不存在或者是空,则打印默认值ming |
1 | #新增别名 |
1 | #查看命令历史 |
1 | #/etc/issue |
1 | # 标准输出重定向到11.log |
1 | # 按顺序执行多条命令 |
1 | # 把前一个标准输出作为下一个命令的标准输入 |
1 | #/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin |
1 | # 对/etc/passwd文件按:分隔的第3列, 按数字大小排序,然后,输出包含bash的行 |
1 | # 保存一份标准输出到文件 |
1 | # 小写改大写 |
1 | # 搜索包含the的行, 忽略大小写-i, 并显示行号-n |
1 | # 删除文件中2-5行 |
1 | # grep对+要转义才能当作正则的+ |
1 | # 获取登陆信息的第1和3列 |
1 | # 删除第4行,并替换第6行 |
1 | # 格式化日期 |
1 | # -e 测试文件是否存在 |
1 |
|
1 | # 创建用户 |
1 | # 启动atd服务 |
1 | # 查看服务进程是否启动 |
1 | # 在后台执行tar命令, 标准错误重定向到标准输出,标准输出写入到tar.log中 |
1 | # 忽略父进程的信号 |
1 | # 查看所有进程 |
1 | # 查看系统信息 |
1 | # 查看tcp的连接 |
1 | dmesg | more |
1 | fuser -uv . |
1 | lsof -u ming -Ua |
1 | # 1.BIOS |
1 | # http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html |
1 | # 修改 用户:组 |
1 | # 压缩 |
Android NDK 从入门到精通(汇总篇)(https://blog.csdn.net/afei__/article/details/81290711)
1 | public class TestJni { |
1 | # 自动生成native方法的头文件 |
1 | /* DO NOT EDIT THIS FILE - it is machine generated */ |
1 |
|
1 | # -I表示在这个目录中搜索用到的头文件, 这因为没写完整的jni.h的全路径,所以要加上 |
1 | java TestJni |
1 | JNIEXPORT jstring JNICALL Java_TestJni_hello(JNIEnv * env, jclass cls, jstring str); |
1 | jstring stringFromJNI(JNIEnv *env, jclass clazz) { |
1 | public int strStr(String haystack, String needle) { |
从dp[i-1] 推导出 dp[i]
从dp[0]…dp[i-1] 推导出 dp[i]
1 | public int lengthOfLIS(int[] nums) { |
1 | public int maxSubArray(int[] nums) { |
1 | public int rob(int[] nums) { |
1 | // 从后向前冒泡,每次选出一个最小的 |
1 | // 对于一个已经排好序的数组,先找到插入的位置,然后移动后续的元素,最后插入 |
1 | // 每次扫描数组,找到最小的值,然后交换 |
1 | // 相当于拓展了插入排序的步长 |
1 | // 先拆分,再合并 |
1 | private static void quickSort(int[] arr) { |
1 | // 每次堆化后,都能选出一个最大的元素 |
1 | // 每个桶只存储单一键值 |
1 | // 每个桶存储一定范围的数值 |
1 | // 根据键值的每位数字来分配桶 |
1 | public class Singleton { |
1 | public class ShapeFactory { |
1 | // 创建工厂的工厂 |
1 | // 使用多个简单的对象一步一步构建成一个复杂的对象 |
1 | // 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能 |
1 | // 统一一套接口给外部使用,不同的适配器,可以把不同的数据类型整合到一个接口里 |
1 | // 把变化的部分隔离开,当发生变化的时候,互不影响 |
1 | // XXXFilter 就做简单数据筛选 |
1 | // View里包含子view |
1 | // java中的IO流, 一层套一层的装饰 |
1 | // 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 |
1 | // 共享原型的模式 |
1 | // 为其他对象提供一种代理以控制对这个对象的访问 |
1 | // okhttp里面的拦截器 |
1 | // Message就是命令,Message里持有Handler的引用 |
1 | // 编译器 |
1 | // JAVA 中的 iterator。 |
1 | // 多对多关系,转成多对1关系 |
1 | // 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 |
1 | // 点击监听 |
1 | // 就是状态机 |
1 | public class StrategyPatternDemo { |
1 | int main(int argc, char const *argv[]) |
1 | void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) { |
1 | gcc -v -o ev_server file_server.c ../demo/wrap.c -lev |
1 | LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/ |
段错误的core文件,怎么分析, 出错的位置显示了一个内存地址?
tcpdump怎么用?
nc怎么用
find命令,搜索文件, 默认递归搜索
1 | find / -type f -name 'libev*' |