1. 什么是值传递和引用传递
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象.
一般认为,java内的传递都是值传递.
2. 线程状态有哪些,它们之间是如何转换的
1.新建( new ):新创建了一个线程对象。
2.可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start () 方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
3.运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行 程序代码。
4.阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占 用,则JVM会把该线程放入锁池( lock pool )中。
(三). 其他阻塞: 运行( running )的线程执行 Thread.sleep(long ms)或t.join ()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当 sleep()状态超时、 join() 等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行( runnable )状态。
5.死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该 线程结束生命周期。死亡的线程不可再次复生。
3. 线程与进程的区别,各有什么优缺点
-进程是资源竞争的基本单位
-线程是程序执行的最小单位
区别:
-进程具有独立的空间地址,一个进程崩溃后,在保护模式下不会对其他进程产生影响。
-线程只是一个进程的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
优缺点:
进程:
优点:提高计算机CPU的利用率
缺点:-进程只能在一个时间内执行一件事,如果想执行多件事,进程就无能为力了。
-进程在执行的过程中如果堵塞,例如等待用户输入信息,整个进程就会挂起,即使进程中有些工作不依赖输入的数据,也将无法执行。
线程:
优点:-创建一个新线程的代价要比创建一个新进程小的多
-与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
-线程占用的资源要比进程少很多
缺点:-性能损失 -健壮性降低 -缺乏访问控制 -编程难度提高
4. 索引的作用及代价?如何建好索引?索引的原理?
索引的原理:
作用:创建索引可以大大提高查询的性能,加速对数据的检索。
代价:1)索引需要占用数据表以外的物理存储空间。
2)创建索引和维护索引要花费一定的时间。
3)当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
如何创建合适的索引:
1) 表与表之间经常join的字段
2) 经常在where条件中列
3) 复合索引创建指引:当where条件中出现多个条件列的时候,应该按照重复值越低且符合大部分业务场景查询的列作为前导列,减少数据的回表,直接能从索引中返回要的数据
例如:where idcard_no ='1111’and update_time=trunc(sysdate)
身份证号(唯一)可以作为复合索引的前列,号码的更新时间,该字段重复值很多,可以结合身份证号创建复合索引。
9. 如何确定某个对象是需要被回收?
引用计数法:
优点:执行效率高,程序执行受影响较小
缺点:无法检测出循环引用的情况,导致内存泄露
在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了。
可达性分析法:(解决上述缺点)
通过判断对象的引用链是否可达来决定对象是否可以被回收。通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。
2. jvm会在什么时候进行回收
1.会在cpu空闲的时候自动进行回收
2.在堆内存存储满了之后
3.主动调用System.gc()后尝试进行回收
3.如何回收?(见以下垃圾回收算法)
总体GC经过三个过程:标记 --> 清除 -->压缩:
10. 标记:首先第一次GC时,回收器会把对象标记使用与未使
11. 清除:这一步删除所有未引用的对象
12. 压缩:为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。
垃圾回收算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法
13. 标记-清楚法:
分为“标记”和“清除”两个阶段:标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间
优点:简单
缺点:空间的浪费
14. 复制算法:
解决标记-清楚算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题
缺陷:内存的移动消耗太大,虽然内存不是零散的,但是代价太高
15. 标记-整理算法:
为了解决Copying算法的缺陷,充分利用内存空间,提出了标记-整理算法。该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
9. JAVA的反射机制
什么是反射机制 ?
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
优点:可以实现动态创建对象和编译,体现出很大的灵活性,体现了多态的应用,有以降低类之间的藕合性。
缺点:
a.使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码,一般Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
b. 使用反射会模糊程序内部逻辑:程序员希望在代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂
10.Java集合类有哪些,分别在哪些场景使用
11. Linux下如何快速查找某个文件
查找的命令主要有find和grep;
区别:
(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
find: 基本格式:find path expression
find /etc -name httpd.conf #在/etc目录下查找文件名为httpd.conf
find /etc -name ‘srm’ #在/etc目录下查找文件名中含有字符串‘srm’的文件,通配符*(0或者任意多个),/ :表示根目录
(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
#grep ‘test’ d* #显示在所有以d开头的文件中包含 test的行
(3)locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/located
语法格式:locate [参数] [样式]
#locate /etc/sh 搜索/etc目录下所有以sh开头的文件
#locate pwd 查找和pwd相关的所有文件
#locate –version 显示版本信息
12. Linux下如何设置环境变量
a. 直接用export命令
#export PATH=KaTeX parse error: Expected 'EOF', got '#' at position 52: …b. 修改profile文件 #̲vi /etc/profile…PATH:/opt/au1200_rm/build_tools/bin
c. 修改.bashrc文件
#vi /root/.bashrc
在里面加入: export PATH=$PATH:/opt/au1200_rm/build_tools/bin
注:后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:♦# echo $PATH
♦看看输出里面是不是已经有了/my_new_path这个路径了。
13.Linux下如何查看TCP连接状态
查看哪些IP连接本机:netstat –an
netstat -an |grep tcp 查看所有tcp连接包括LISTEN状态
netstat -an |grep ESTABLISHED 查看所有正在连接中的tcp连接
14.简述一次HTTP请求的基本流程
1) 域名解析
2) 建立tcp链接,三次握手确定双方协议一致,可通信
3) 发送http请求数据包
4) 服务器处理http请求,浏览器得到HTML代码
5) 客户端接收服务端返回数据,解析HTML代码, 请求html代码中的资源(如js、css、图片等)
6) 浏览器对页面进行渲染呈现给用户
15. 什么是JDBC,为什么需要JDBC?实现原理是什么?
JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库(JDBC是Java和关系型数据库之间的桥梁)。JDBC接口及相关类在java.sql包和javax.sql包 里。我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。
实现原理:DriverManager (是一工厂实现类,用了工厂方法模式)
1) 加载驱动
2) 建立连接
3) 创建语句对象
4) 执行SQL语句
5) 处理结果集
6) 关闭连接
16.Get和Post的区别
GET:查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
POST:查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的
POST 请求不会被缓存
POST 请求不会保留在浏览器历史记录中
POST 不能被收藏为书签
POST 请求对数据长度没有要求
17.Cookie和Session的区别,分别用于什么场景
Session和cookie都是会话(Seesion)跟踪技术【会话技术:当你打开浏览器,访问一个网站,认为会话开始了,当你关闭浏览器的时候,会话结束了】。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。但是 Session的实现依赖于Cookie,sessionId(session的唯一标识需要存放在客户端)。
区别:
1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。cookie只能存放4k的数据,而session理论上没有做限制
3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
联系:
session虽说存放在服务器端,但是仔细看刚才的执行流程你会明白,session是依赖于cookie的。
适用场景:
1.将登陆验证信息存放为SESSION Session(“Logon”)=T/F的形式
2.其他信息如果需要保留,可以放在COOKIE中,比如购物车。购物车最好使用cookie,但是cookie是可以在客户端禁用的,这时候我们要使用cookie+数据库的方式实现,当从cookie中不能取出数据时,就从数据库获取。
18. 为什么需要编码?UTF-8和GBK是如何进行编码的
编码是为了在数据传输的过程中节省数据存储空间,可以节省带宽,加快传输速度。
UTF-8: 用1到4个字节编码UNICODE字符,它对英文使用8位/8Bit(即1个字节/1Byte),中文使用24位/24Bit(3个字节/3Byte)来编码。
GBK:英文1字节(半角1字节,全角2字节),中文2字节通用性比UTF8差,不过UTF8占用的数据库比GBK大
19. 分别介绍下JDK,JRE和JVM
可以理解为:JDK包含了JRE,JRE包含了JVM
J JDK:Java Development Kit,Java开发工具包,JDK是整个JAVA的核心,包括了Java的运行环境(Java Runtime Environment)、一堆Java工具(javac、java、jdb等)和Java基础的类库(即Java API包括rt.jar)
JRE:Java Runtime Environment,Java运行环境,为Java的运行提供了所需环境。JRE是指java运行环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。 在JDK的安装目 录里可以找到jre目录,里面有两个文件夹bin和lib,在 这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JVM: Java Virtual Machine,用来解释执行字节码文件(class文件)的,JVM是Java实现跨平台最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行。
20.如何确保N个线程可以访问N个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了.
21.MyISAM和InnoDB适用场景?
MyISAM适合:
(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:
(1) 可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
注:一张自增的表里有7条数据,删除了两条,重启数据库,又插入一条数据,此时id是几?
答:如果表的类型是 MyISAM,id=8;
如果表的数据类型是 InnoDB,id=6;