java相关面试题

今天有时间,把当初面试大数据岗时用到的java,mysql,Linux相关的知识点整理一下

java部分

垃圾回收

反射

进程和线程

Linux部分

数据库部分

Nosql:not only sql

mysql

java部分

垃圾回收

  1. 引用计数算法
    被引用计数加一,如果删除引用计数减一,计数为0的时候,就会被回收
    优点:实现简单效率高
    缺点:难以解决相互引用的问题。(引用计数一直存在,没办法被回收)
    根搜索算法,不可达的回收

java中的回收算法

  1. 标记清除算法
    遍历找到对象,清除不可达对象
    清除不会进行对象的移动,会造成大量的内存碎片
    在这里插入图片描述
  2. 复制算法
    内存只是用一半,要清除的时候,将存活的对象移动到未使用的内存中,连续存储,这种算法适合用在存活率低的地方,新生代,存活率低,移动的少,内存利用率低
    在这里插入图片描述
  3. 标记整理算法
    从根部进行扫描,将存活的移动到一起,然后清除,适用于存活率高的场景,老年代
    内存整理比较耗时

stop-the-world 这是程序运行时可能发生的情况,
jvm运行过程中,进行垃圾回收而暂停整个项目的运行,这个会耗费一定的时间,是jvm调优主要调整的

反射

在运行过程中可以获取一个类的方法和属性,
在运行过程中可以调用任意一个类的方法和属性。
动态获取对象信息,动态调用的功能就是反射
通过反射,可在String类型的List中添加其他类型数据

List<String > aa = new ArrayList<String>(  );
Class<? > clazz= aa.getClass();
Method add = clazz.getDeclaredMethod( "add", Object.class );
add.invoke(aa, 100 );

属性填充,key要跟类的属性名对应上

Map map = new HashMap<>();
Map.put(“name”,”jack”);
Map.put(“age”,20)
Student s = new Studen();
BeanUtils.populate(s,map) 
System.out.println(student);// Student{name='jack', age=20, sex='null'}
通过PropertyDescriptor设置属性
PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name",Student.class );
Method writeMethod = propertyDescriptor.getWriteMethod();  
//还有getReadmethod方法           就是相当于get方法
writeMethod.invoke( student,"jack" );

GetsimpleName 获取类名
GetdeclaredMethod 获取方法
Getfileds 获取属性

进程和线程

区别
根本区别:进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位。

  1. 每一个进程都有自己独立的代码和空间。同一类线程的代码和数据空间是共享的,线程有自己独立运行栈和程序计数器。
  2. 操作系统中可以同时运行多个进程,一个进程中可以包含多个线程
  3. 在没有实现线程的操作系统中,进程是资源分配的基本单位,又是调度的基本单位,是系统中并发执行的单元,实现了线程的系统中,线程是并发执行的基本单位

线程之间的通信方式

  1. 同步,多线程通过synchronized关键字进行线程之间的通信
  2. While 轮询方式 线程a不停地改变条件,线程b不停的通过while检测条件是否成立,从而实现线程之间的通信
  3. Wait/ notify机制

Start和run的区别

  1. Run是线程的任务处理逻辑入口,由虚拟机运行时直接调用,而不是代码调用。直接调用run方法,就是跟直接调用一个普通的方法没有什么区别,无法达到多线程的目的。
  2. Start是启动线程,线程处于就绪状态,被jvm调度,jvm来调run方法。何时运行是由线程调度器决定的。

获取线程返回值的方式

  1. 主线程sleep (等待线程执行完返回结果)
  2. 调用join方法 Waits for this thread to die. (join方法本身就是等待线程死亡)
  3. 使用callable方法、线程池的方法
public class AntCallable implements Callable<String> {
    public String call() throws Exception {
        String value = "i am ant";
        Thread.sleep( 5000 );
        return value;
    }
}
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> task = new FutureTask<String>( new AntCallable() );
        Thread thread = new Thread( task );
//ExecutorService service = Executors.newCachedThreadPool();
//Future<String> submit = service.submit( new AntCallable() );

        thread.start();
        if (!task.isDone()){
            System.out.println("稍等片刻");
        }
        System.out.println("the value is " + task.get());
    }
}

锁机制
synchronized 修饰的普通方法是对对象加锁,作用整个方法,作用对象是调用该方法的对象,
修饰的static方法是对对象加锁,作用的是整个静态方法,作用的对象是这个类的所有对象。

loadClass 和class.forname的区别
类加载的过程
1)加载:classLoader加载class字节码文件,生成class对象
2)链接:校验、准备、解析
3)初始化:执行类变量的赋值和静态代码块
Loadclass 仅仅是完成第一步,也就是加载过程
Class.forname 初始化已经完成,也就是第三步完成
Springbean 的 lazy 机制,就是借助loadclass实现的,只是实现加载,并没有初始化

Linux部分

管道操作符 “|”
前一个的结果作为第二个的输入 ps-ef | grep “” | grep –v “”
查看文件夹内文件的个数 ls | wc -c
可以用-v把某些结果剪掉

查看当前操作系统的内核信息

uname –a

查看当前操作系统的版本信息

cat /proc/version
cat /proc/version

查看当前系统cpu的信息

cat /proc/cpuinfo

创建用户

useradd username

设置密码

passwd username

创建用户组 用户组的所有信息都存放在/etc/group里面

groupadd groupname

删除

userdel username
groupdel groupname

Kill 命令
强制杀死进程

kill –KILL 123

彻底杀死进程

kill -9 123

默认不写是kill -15 ,程序接收信号,立即停止,释放相关的资源之后再停止

磁盘管理
Df 列出文件系统的整体磁盘使用情况
Du 列出文件和目录磁盘的使用空间查看

Sudo
Sudo以系统管理员的身份执行指令,也就是说经过sudo执行的指令好像是root亲自执行

对内容统计
Awk 默认分割符是空格,可以使用正则表达式对内容进行过滤
awk ‘{print $1,$2}’ a.txt 获取文件第一列第二列
awk ‘{$1==8888}’ a.txt 获取第一列是8888的
awk –F ‘:’ ‘{print $1}’ a.csv 使用冒号分割

对内容替换
sed -i ‘s/A/a/ ;/s/B/b’ b.txt 将b文件中的A 替换成 a, 多个替换中间可以使用分号或-e
sed -i ‘s/A/a/g’ b.txt 加个g 全局替换
sed –n ‘3,6p’ b.txt 输出3到6行
sed ‘1d’ b.txt 删除第一行
set ‘3ihello’ b.txt 第三行之前插入hello

wc -l test 统计test文件的行数

文件权限
在这里插入图片描述
第一段是指文件类型
-表示文件
D 表示文件夹
L 表示连接文件
第二段是指拥有者可以拥有的权限:
第三段是指所有者组可以拥有的权限:
第四段是指其他人对这个文件的权限

数据库部分

Nosql: not only sql

Sql代表了传统型数据库,nosql是针对传统数据库的升级和补充
Nosql的分类:

  • k-v 键值对类型 需要定义数据结构
  • 面向列存储 需要定义数据结构
  • 面向文档 无序机构化
  • 面向图论

Redis有事务机制 运行很快,
适合用在数据变化非常快,并且数据库大小适合内存容量的应用程序

Redis持久化方式

  • RDB持久化的方式能够在指定的时间间隔对数据进行快照存储
  • AOF持久化方式记录每次对服务器写的操作,服务器重启的时候会重新执行命令来恢复这些数据,aof命令以redis协议追加到每次操作的文件末尾

RDB和AOF的优点

  • RDB方式可以保存过去一段时间内的数据,而且保存结果是一个单一的文件,可以将文件备份到其他服务器,在恢复大量数据的时候,RDB方式要比AOF好。
  • AOF方式默认每分钟备份一次,效率很高,用追加的方式保存日志而不是数据

RDB和AOF的缺点

  • RDB由于备份频率不高,可能会丢失一段时间内的数据,
  • AOF文件体积比较大,而且由于保存频率很高,整体速度会比RDB慢一些

mysql

Mysql 创建表

Create table a(
Id int(2) primary key AUTO_INCREMENT comment ‘编号’,
Name varchar(10) not null
) comment = ‘信息’;

Comment 是注释
删除主键约束

`alter table info drop primary key`

修改表的结构

Alter table a rename to b;

修改注释

Alter table a comment’啊啊啊’;

修改字段类型

alter table a modify column pnum int

增加字段

Alter table a add aname not null;

删除字段

Alter table a drop aname;

where 和 groupby
如果where后面是字段 比如 id>10 是可以执行的,如果是 max(id)>10 有函数就会报错,这时候就需要用 groupby having,groupby having 后面还可以加单纯的字段 id>10

Truncate delete drop 的特点和区别
Truncate
Truncate 是ddl操作,是隐式提交,一旦执行,就无法回滚
清空一个大表的所有数据行,truncate比delete高效
如果表被锁住,或者表有外键约束,truncate也会报错
Truncate 不会返回操作影响的行数,返回0

Delete
Delete 是dml语言,执行之后,如果没有提交,可以rollback
(事务自动提交 mysql默认模式是 auto commit)
Delete from table 后要加where 否则的话,数据就全被删除了
Delete 可以返回删除影响的行数
执行的速度没有truncate快

Drop
是ddl语言,是删除数据库层面的表。执行drop之后,将表所占的空间全部释放掉

三者速度 drop>truncate>delete

Mysql分表和分区
分表
是将一个大的表按照一定的规则,分解成多张具有独立存储空间的实体表,每个表都对应三个文件,myd数据文件,myi索引文件,frm表结构文件,这些表可以分布在同一块磁盘上,也可以在不同的机器上,app读写的时候,按照事先定义好的规则得到对应的表名,然后去操作它
分表分为垂直和水平切分,分表之后,总表只是一个外壳,存取数据发生在各个子表里面

分区
是将数据划分在多个位置存放,分区后,表还是一张表,但是数据散列到了多个位置,分区类型有range分区,list分区(基于列的值来匹配一个散列集合中的某个值来进行选择),hash分区。

实现方式上
分表是真正的分表,一张表分成很多表后,每个小表都是完整的一张表,都对应三个文件,myi 索引,myd数据,frm 表结构
分区不一样,分区还是一张表,但是存放数据的区块变多了

数据处理上
分表后,数据放在分表里面,总表只是一个外壳,读取数据发生在各个分表里面。
分区,数据文件分成了许多小块,分区后的数据还是存放在一个表内,数据处理还是由自己完成

性能提高上
分表之后,单表的并发能力提高了,磁盘的io性能也提高了,
分区主要是想突破磁盘的io瓶颈,提高磁盘的读写能力,来增加mysql的性能。

分区和分表的联系
都能提高mysql的性能,高并发状态下都是一个良好的表现。
分区和分表并不矛盾,可以相互配合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值