本文写给正在努力的自己,努力的补基础知识,五道题一篇(今天的文字有点多,参考了很多文章,由于是自己写的,比较容易理解)
ps:我把答案都放在解析下面了
- 下面属于java引用类型的有?
A. String
B. byte
C. char
D. Array
初识想法:前面一直在说java的引用传递(又称地址传递)跟值传递,引用类型用的是引用传递,基本类型用的是值传递,那么引用类型有什么,基本类型又有什么呢?
解析:在我们看这道题之前,我们知道java中基本类型有以下的八种,1. byte 2. shot 3. int 4. long 5. float 6. double 7. char 8. boolean 这些基本类型采用的均是值传递,值传递什么意思呢?引用传递什么意思呢?
我们通过代码来看
public static void main(String[] args) {
int a = 19;
String b = "hello";
method(a, b);
System.out.println(a);
System.out.println(b);
}
static void method(int a, String b) {
a = 20;
b = "world";
}
相信大家已经知道这个代码输出是多少了,但是我们关注的是他们的地址值(哈希值),顺带一提java中有地址值,但是我们看不到,看到的都是哈希值,其是通过地址值用哈希算法算出来的
我们会发现int类型的a没有地址值,而Sring类型b有地址值,被拆分为char类型的字符数组,还有了他的哈希值
但是我们进入method方法的时候,我们会发现b的哈希值产生了变化又原来的491变为了493,而a却没有变化原因就在于int是基本数据类型,而String不是,所以我们得出结论a是值传递,而b是引用传递
答案:AD
- 有关会话跟踪技术描述正确的是()
A. Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端
B. 关闭浏览器以为着临时会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期
C. 在禁用Cookie是可以使用URL重写技术跟踪会话
D. 隐藏表单域将字段添加到HTML表单并在客户端浏览器中显示
初识想法:Cookie跟Session,一个是在客户端保留信息,一个是创建会话,访问网页经常能看到是否保留Cookie,但是Cookie的原理是什么呢?
解析:我们先聊聊为什么需要这些技术:在程序中,会话跟踪是很重要的事情,理论上,一个用户的所有请求都应该属于同一个会话,而另一个用户的所有请求应该在他自己的会话中,二者信息不应该放在一起提交,会导致意想不到的后果,加入小明在逛某宝,将《JAVA从入门到精通》这本书放到购物车中,应该放入小明的购物车,而不是小红的购物车,所以必须保证小明的会话应是同一个会话。
而Web应用程序是使用HTTP协议传输数据的,HTTP协议是无状态(一次性)的协议,一旦数据交换完成,客户端与服务器端的连接就会关闭,再次交换数据则需要重新建立新的连接,这就意味着服务器无法从连接上跟踪会话,例如:小明将《JAVA从入门到精通》这本书放到购物车中后,发现还需要《JVM从入门到精通》,则需要与服务端建立新的连接,这个时候小红想买《化妆从入门到精通》,这个时候,服务器就无法判断他们各加入的什么书籍到购物车中,就需要会话跟踪技术来帮助服务端识别加入购物车这个行为是谁做的。
那么我们了解了为什么需要这个技术之后,我们再来看看Cookie跟Session有什么区别呢?
Cookie
由W3C组织踢出的,既然HTTP是一种无状态的协议,那么就为每个客户端分发一张通行证吧,这样一个会话一个通行证,就能确认身份了,每当需要建立新的连接,则需要想服务端展示其通行证,这样就不怕小明加购物车的书加到小红的购物车里了。
了解了它的原理我们了解一下它的特性:
- Cookie能记录用户的访问次数,和gc的寄存器有异曲同工之处
- Cookie不可跨域名使用,比如小红在某宝买完东西她逛累了,打开了B站,这个时候某宝的Cookie就对B站没有用了,需要重新分发通行证了
- 保存中文,小红很有个性,就要将名称设置为中文,这个时候Cookie就会用Unicode编码来防止乱码
- Cookie将图片转换为二进制来保存
- Cookie的有效期,所有通行证都有有效期的,Cookie的有效期可以有程序猿自己设置,根据网站类型不同选择的时间也不太一样
- Cookie的安全性 由于HTTP协议不仅是无状态的,而且也是不安全的,HTTP协议的数据不经过任何加密就直接在网络上传播,黑客就可以轻松截取到信息,所以使用他会有一定的安全风险,可以在设置Cookie的时候讲secure属性设置为true,浏览器就只会在HTTPS和SSL等安全协议中传输了,但是secure属性不能对Cookie内容加密,因而不能保证绝对的安全,如果需要提高安全性,就需要在程序中为Cookie内容加密,解密,防止被截取泄密
- 永久登录,小明觉得在家里很安全,不会有别人来偷窥,所以就可以将自己的账号密码保存在Cookie中,并将Cookie的有效期设置为几年甚至更久
额外知识:查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了
Session
如果说Cookie是给客户端发通行证,那么Seesion则是在服务器端简历一个“客户表”来确认用户的身份,所有来访的用户只需要对应上表就可以了
了解了它的原理我们了解一下它的特性:
- Session的生命周期:由于Session保存在服务器但,为了获得更高的存取速度,服务器一般将Session放到内存中,me米格用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器则会导致内存溢出等危险,所以Session里的信息都会比较精简,当用户第一次访问服务器的时候会自动创建,Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间
- Session的有效期,当越来越多的用户访问服务器,Session的数量也会越来越多,如果不及时清理一些Session,会导致内存溢出,系统崩溃,我们知道,jvm在清理垃圾的时候会根据gcroot,根节点如果没有连接到的或者gc寄存器来清理垃圾,服务器的清理原则跟jvm的很像,服务器会将长时间没有活跃的Session从内存中清理掉,例如:小明在6年前在小米商城买了小米6,今天想买小米12,假设小米的Session只保留半年,则小明需要重新登录他的小米账号进行购买
- Seesion对浏览器也是有要求的,虽然说Session保存在服务器内,但是对客户端是完全公开的,它的正常运行仍需要客户端浏览器的支持,因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,所以Session不能依据HTTP连接来判断是否为同一用户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,他的值为Session的id(就是HttpSession.getId()的值),Session依据该Cookie来识别是否为同一用户
我们了解完他们各自的属性后我们来看看他们有什么区别吧
区别
- cookie数据存在客户端的浏览器上,session数据放在服务器上。当小明登录了一个网站,如果他登录的网站的web服务器端使用的是session,那么除了SessionID以外的所有的数据保存在服务器上,客户端每次请求服务器都会发送当前会话的session_id,服务器再根据当前的session_id判断用户数据,由于数据是保存在服务端,所以一般伪造,当黑客获取了小明的session_id之后,用特殊的浏览器伪造就能成功的伪造出小明的请求,一般session_id是不会重复的,但是如果有超大并发量请求的时候,也是有可能重复的,而SessionID是用Cookie保存在客户端的,如果客户端禁用了Cookie,那么Session也会失效
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
- session会在一定时间内保存在服务器上,当访问增多的时候,会比较占用我们服务器的性能,如果追求性能方面使用cookie较好
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。而session没有数量限制,而且可以保存更为复杂的数据类型
- session很容易失效,用户体验较差,虽然cookie不安全,但是可以加密,使其相对安全一点,可以将账号密码存放在cookie中,下次登录就可以直接跳出来,用户体验较好、
- 两者的最大区别在于声明周期,小明将账号密码放在cookie中可以使用很久,但是session是在打开浏览器的时候创建,一旦关闭session也就销毁了
答案:ABC
- String与StringBuffer的区别是?
A. String是不可变的对象,StringBuffer是可以再编辑的
B. 字符串是常量,StringBuffer是变量
C. String是可变的对象,StringBuffer是不可以再编辑的
D. 以上说法都不正确
初识想法:String和StingBuffer和StringBuilder好像有不像,有什么区别呢?StingBuffer和StringBuilder他们的方法使用一模一样,有什么区别的呢?
解析:String和StingBuffer和StringBuilder的区别
-
可变与不可变
String类中使用字符数组保存字符串,因为有final修饰符,所以String对象是不可变的,一旦创建,就不能修改他的值,这个时候有小伙伴就要问,老师说可以拼接字符串呀,为什么不能变呢?但是我们要注意他们拼接完真的还是原来的字符串吗?我们通过代码来证实这个说法吧
我们不难看出他们的哈希值(地址值变了),意思就是jvm会创建一个新的地址来存s1,理解为第一行的s1和第3行的s1只是名字一样但是是不同的人。
而StringBuilder与StringBuffer都继承AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组来保存字符串的,但是由于没有final修饰,所以是可变的,我们还是通过观察他们的哈希值(地址值)来证明
-
是否为线程安全
String中由于是final修饰的,也可以理解为常量,所以是线程安全的
StringBuffer对方法加了同步锁或者调用的方法加了同步锁所以是线程安全的,以下为StingBuffer的部分源码所以也是线程安全
而StringBuilder并没有为其内置方法加同步锁,所以它是非线程安全 -
StringBuilder和StringBuffer的共同点
他们有共同父类AbstractStringBuilder,方法的使用方法也都一样 -
StringBuilder和StringBuffer的区别
由于StringBuffer是线程安全的而StringBuilder是非线程安全的,所以StringBuffer效率低于低于StringBuilder。
答案:AB
- 看了这么多复杂的题解来一道轻松点的题,以下代码输出结果是什么?
public static void main(String[] args) {
String s1 = "tomcat";
String s2 = "tomcat";
char s3[] = {'t', 'o', 'm', 'c', 'a', 't'};
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
System.out.println(s1 == s2);
System.out.println(s2.equals(new String("tomcat")));
}
初识想法:最近跟String是好朋友,又爱又恨
解析:至于java的数据类型第一题我们已经讲的很细了,如果没理解可以在下方评论区留下你的问题。
这里讲解对于equals方法,这个方法不能用来比较基本数据类型,只能用来比较引用类型,比较的是他的值
我们来看看==和equals这两个方法的区别
==强调栈中的比较,可以理解为地址值比较,而equals强调的是对象内容的比较
答案:
- 现在是凌晨两点,终于写到第五题了,真累人啊,回归题目,以下哪些说法是正确的?
A. IOException在编译是会被发现
B. NullPointerEception在编译时不会被发现
C. SQLException在编译时会被发现
D. FileNotFoundException在编译时会被发现
初识想法:先想想什么叫做编译时能发现?
解析:我们在看这道题之前先了解一下异常的分类,一种是运行时异常,一种是编译时异常,他们有什么区别呢?
运行时异常:让我最头疼的运行时异常就是空指针了,在刷算法题的时候经常能遇到,在编译的时候我们发现不了,只有运行的时候才会报错
编译异常:这个就是jvm将已知可能出现的错误告诉程序猿这里应该添加异常处理,最常见的就是try(){}catch{}处理,初学者会使用throws将问题向上抛出。
答案:ABCD