自己面试遗忘重要知识点总结(整理中...)

自己面试遗忘重要知识点总结(整理中…)

1.String类为什么是final

参考网址:

https://mp.weixin.qq.com/s/M8tOF7tiP9I5Ku_-PfZD2g

1.性能(效率)
如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

2.安全性
String类的内部好多方法的实现都不是Java编程语言本身编写的,好多方法都是调用的操作系统本地的API,也就是“本地方法调用”,这种类是非常底层的,和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的,这不就成了核心病毒了么?

3.天生服务性
当时设计时,就是不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了,就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性,如果随便能改了,那么Java编写的程序肯定就很不稳定。

2.抽象类和接口区别

参考网址:

https://mp.weixin.qq.com/s/HD8aXbdcWnTovqWO5ZP_Gw

区别1:

首先抽象类是一个“类”,而接口只是一个“接口”,两者的概念和应用场景不一样,这也是抽象类和接口的主要区别。

区别2:

即使在 Java 8 中接口也能写实现方法了,但却不能写构造方法,而在抽象类是可以写构造方法的,意味着抽象类是参与类的实例化过程的,而接口则不是。

区别3:

抽象类可以有自己的各种成员变量,并且可以通过自己的非抽象方法进行改变,而接口中的变量默认全是 public static final 修饰的,意味着都是常量,并且不能被自己和外部修改。

区别4:

接口可以实现多继承,而抽象类只能单继承。

3.http报文内容

请求

1**、请求行**

GET /news/hello.html HTTP/1.1

GET:请求方式(或提交方式),在HTTP中一共规定了7种提交方式,其中5种不常用,常用的只有GET和POST。

/news/hello.html:请求资源路径,表明浏览器请求的是哪一个Web应用下的哪一个资源文件

HTTP/1.1:请求所遵循的协议和版本。

2**、若干请求头(请求报头)**

Host: localhost – 通知服务器,浏览器请求的是哪一台虚拟主机

Accept: text/html, application/xhtml+xml, /

– 通知服务器浏览器能接收哪些格式的数据

Cookie: 和cookie技术相关的一个头(会话技术中介绍)

xxx: xxx

(一个空白行)

3**、请求实体内容**

如果请求方式为GET提交,请求实体没有内容

如果请求方式为POST提交,并且请求中携带了数据,请求实体才会有内容。

响应

1**、状态行**

HTTP/1.1 200 OK

HTTP/1.1:响应信息所遵循的协议和版本

200:三位的数字(100~600)状态码,作用是用于表示请求处理的结果。

200:最常用的,表示请求处理成功!

404:表示浏览器请求的资源不存在!

500:表示服务器端程序在处理请求的过程中抛出了异常。

。。。

OK:描述短语,也表示请求处理的结果,和状态码相对应

200 OK

404 Not Found

500 Internal Server Error

2**、若干响应头(响应报头)**

Content-Type: text/html – 通知浏览器,服务器响应的数据类型

text/html – 服务器响应是一个html格式的网页

image/* – 服务器响应是一个image图片

。。。

Content-Length: 143 – 服务器响应的数据长度,143单位是字节

Date: Tue, 15 Oct 2019 07:14:46 GMT – 响应时间

3**、响应实体内容**

当我们请求一个静态资源文件时(html、css、js、图片等),服务器会将这个文件的内容通过响应实体发送给浏览器。

比如浏览器请求news/hello.html,服务器在响应时直接将hello.html文件的所有内容,通过响应实体发送给浏览器。

4.http常见状态码和含义

100  Continue  继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
200  OK   正常返回信息
201  Created  请求成功并且服务器创建了新的资源
202  Accepted  服务器已接受请求,但尚未处理
301  Moved Permanently  请求的网页已永久移动到新位置。
302 Found  临时性重定向。
303 See Other  临时性重定向,且总是使用 GET 请求新的 URI。
304  Not Modified  自从上次请求后,请求的网页未修改过。

400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
401 Unauthorized  请求未授权。
403 Forbidden  禁止访问。
404 Not Found  找不到如何与 URI 相匹配的资源。

500 Internal Server Error  最常见的服务器端错误。
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。

5.ajax过程

(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.

(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.

(3)设置响应HTTP请求状态变化的函数.

(4)发送HTTP请求.

(5)获取异步调用返回的数据.

(6)使用JavaScript和DOM实现局部刷新.
详细介绍上面步骤的第三步
//readyState==4表示通讯结束
    	  //status==200 表示服务端响应OK
    	  if(xhr.readyState==4&&xhr.status==200){
    		  //responseText表示服务端响应的结果
    		  //console.log(xhr.responseText);//json格式字符串
    		  //将服务端响应的json格式字符串,转换为json格式的JS对象
    		  var result=JSON.parse(xhr.responseText);
    		  doHandleResponseResult(result);
    	  }

jQuery发送ajax异步的模板

$.ajax({
        url : "userList.json",//请求的url
        method : "GET",//请求的方式
        contentType: "application/json",//请求数据为json格式
        data : null,//请求的参数
        async : true,//默认为true,表示异步请求
        dataType : "text",//返回的数据时json格式的对象,如果是字符窜,简单类型一般就是text类型
        success : function(data){
            console.log(data);
        },//定义成功的回调函数
        error : function() {
            alert("ajax请求失败");
        }//失败的回调函数
    });

6.get和post请求区别

(1)GET提交会将发送给服务器的请求参数,拼接在地址栏URL地址的后面,相对不安全!

(2)GET提交通过地址栏URL地址后面拼接参数,数据量不能太大,不能超过1kb或者4kb。

(3)POST提交是通过请求实体发送数据给服务器,相对更加安全!

(4)POST提交通过请求实体发数据,理论上数据量是没有限制的!

7.cookie 和session 的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。
 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
     考虑到减轻服务器性能方面,应当使用COOKIE4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
 5、所以个人建议:
    将登陆信息等重要信息存放为SESSION
    其他信息如果需要保留,可以放在COOKIE

8.重定向与转发的区别

1.重定向访问服务器两次,转发只访问服务器一次。
✦ 2.重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。
✦ 3.重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了。
✦ 4.在request级别使用信息共享,使用重定向必然出错

✦ 5.还有一个大的区别就是,重定向可以访问自己web应用以外的资源

请求转发是一种资源的跳转方式,此外重定向也是一种资源的跳转方式

请求转发的特点:

(1)请求转发是一次请求,一次响应

(2)请求转发前后,地址栏地址不会发生变化

(3)请求转发前后,request对象是同一个(域对象)

(4)进行转发的两个资源必须属于同一个Web应用(属于不同web应用的资源之间是不能进行转发的)

request.getRequestDispatcher(转发到资源的URL地址).forward( req, res);

重定向也是一种资源的跳转方式

重定向的特点:

(1)重定向是两次请求,两次响应

(2)重定向前后,地址栏地址会发生变化

(3)重定向前后,request对象不是同一个

(不能使用域对象)

(4)进行重定向的两个资源可以不是同一个Web应用(属于不同web应用的资源之间是可以进行重定向的)

实现重定向:

response.sendRedirect( 重定向到资源的地址 );

9.String常用API

面试官突然冷不丁会问String常用api

参考网址:

https://mp.weixin.qq.com/s/VGbjHFB9YG1Fij9k2Yj9tQ

1、用字符数组value创建一个String对象

方法:

public String(char[] value)

实例:

char[] value ={"a","b","c","d"};
String str = new String(value);
//相当于String str = newString("abcd");

2、用字符数组以x开始的n个字符创建一个String对象。

方法:

public String(char chars[], int x, int n)

实例:

char[] value ={"a","b","c","d"};
String str = new String(value, 1, 2);
//相当于String str = newString("bc");

3、获取字符串长度

方法:

public int length()

实例:

String str = new String("478bhjd56");
int strlength = str.length();

4、获取字符串某一位置的字符

方法:

public char charAt(int index)

实例:

String str = new String("43dfzyd");
char ch = str.charAt(4);//ch = z

注意:字符串中第一个字符索引是0,最后一个是length()-1。

**
**

5、获取字符串的子串

方法:

public String substring(int beginIndex)
//该方法从beginIndex位置起,
//从当前字符串中取出剩余的字符作为一个新的字符串返回。

public String substring(int beginIndex, intendIndex)
//该方法从beginIndex位置起,从当前字符串中
//取出到endIndex-1位置的字符作为一个新的字符串返回。

实例:

String str1 = newString("asdfzxc");
String str2 = str1.substring(2);//str2 ="dfzxc"
String str3 = str1.substring(2,5);//str3 ="dfz"

6、字符串的比较

方法:

public int compareTo(String str)
//该方法是对字符串内容按字典顺序进行大小比较,
//通过返回的整数值指明当前字符串与参数字符串的大小关系。
//若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。

public int compareToIgnoreCase (String str)
//与compareTo方法相似,但忽略大小写。

public boolean equals(Object obj)
//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。

public boolean equalsIgnoreCase(String str)
//与equals方法相似,但忽略大小写。

实例:

String str1 = new String("abc");
String str2 = new String("ABC");
int a = str1.compareTo(str2);//a=32
int b = str1.compareToIgnoreCase(str2);//b=0
boolean c = str1.equals(str2);//c=false
boolean d =str1.equalsIgnoreCase(str2);//d=true

7、查找子串在字符串中的位置

方法:

public int indexOf(String str)
//用于查找当前字符串中字符或子串,返回字符或
//子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。

public int indexOf(String str, intfromIndex)
//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。

public int lastIndexOf(String str)
//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。

public int lastIndexOf(String str, intfromIndex)
//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。

实例:

String str = "welcome to readzhiyin";
int a = str.indexOf('t');//t = 8
int b = str.indexOf("read");//b =11
int c = str.indexOf("l",3);//c =-1
int d = str.lastIndexOf("e");//d= 12
int e =str.lastIndexOf("i",2);//e = -1

8、字符串中字符的大小写转换

方法:

public String toLowerCase()
//返回将当前字符串中所有字符转换成小写后的新串

public String toUpperCase()
//返回将当前字符串中所有字符转换成大写后的新串

实例:

String str = new String("JavaStudy");
String str1 = str.toLowerCase();
//str1 = "javastudy"
String str2 = str.toUpperCase();
//str2 = "JAVASTUDY"

9、字符串两端去空格

方法:

String trim()
//去除字符串两端的空格,中间的空格不变,一般用于登陆注册时

实例:

String str = " z dali ";
String str1 = str.trim();
int a = str.length();//a = 8
int b = str1.length();//b = 6
System.out.println(a+"\n"+b);

10、将字符串分割成字符串数组

方法:

String[] split(String str)

实例:

String str = "sgs#jkc#eer";
String[] str1 = str.split("#");
for (int i = 0; i < str1.length; i++) {
  System.out.println(str1[i]);  
  //输出结果是sgs  jkc eer
}

11、基本类型转换为字符串

方法:

static String valueOf(xxx xx)

实例:

String s1 = String.valueOf(12.99);
System.out.println(s1);
//double类型转string类型

12、替换字符串

方法:

public String replace(char oldChar, charnewChar)
//用字符newChar替换当前字符串中所有的oldChar字符,
//并返回一个新的字符串。

public String replaceFirst(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的
//第一个和字符串regex相匹配的子串,应将新的字符串返回。

public String replaceAll(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的所有
//和字符串regex相匹配的子串,应将新的字符串返回。

实例:

String str = "hjdfjdskdd";
String str1 = str.replace('h','g');
//str1 ="gjdfjdskdd"
String str2 =str.replace("hj","xxx");
//str2 = "xxxdfjdskdd"
String str3 =str.replaceFirst("d","c");
//str3 = "hjcfjdskdd"
String str4 =str.replaceAll("hj","xxx");
//str4 = "xxxdfjdskdd"
System.out.println(str1+"\n"+str2+"\n"+str3+"\n"+str4);

10.String s = new String(“111”)会创建几个对象

参考网址:

https://mp.weixin.qq.com/s/YTbs8NaKpcljpg19seKrEw

**如果常量池中存在,则只需创建一个对象,否则需要创建两个对象。**

11.Java中Comparable和Comparator的区别

Comparable

Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现。

如果add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:

  • 比较者大于被比较者,返回正整数
  • 比较者等于被比较者,返回0
  • 比较者小于被比较者,返回负整数

Comparator

Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

  • o1大于o2,返回正整数
  • o1等于o2,返回0
  • o1小于o3,返回负整数

总结

如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法。

实现Comparable接口的方式比实现Comparator接口的耦合性要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。因此:

  • 对于一些普通的数据类型(比如 String, Integer, Double…),它们默认实现了Comparable 接口,实现了 compareTo 方法,我们可以直接使用。
  • 而对于一些自定义类,它们可能在不同情况下需要实现不同的比较策略,我们可以新创建 Comparator 接口,然后使用特定的 Comparator 实现进行比较。

不同之处:

个人感觉说出上文观点,这个提问就算回答完了,如果非要说不同之处,那就是:

  • Comparator位于java.util包下,而Comparable位于java.lang包下
  • 实现Comparable接口的方式比实现Comparator接口的耦合性要强
  • 等等…………

12.面试官:如何决定使用 HashMap 还是 TreeMap?

HashMap 和 TreeMap 的实现

**HashMap:**基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()equals()[可以重写hashCode()equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

  • HashMap(): 构建一个空的哈希映像
  • HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
  • HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
  • HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像

**TreeMap:**基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

  • TreeMap():构建一个空的映像树
  • TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
  • TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
  • TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序

HashMap 和 TreeMap 都是非线程安全

HashMap继承AbstractMap抽象类,TreeMap继承自SortedMap接口。

**AbstractMap抽象类:**覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。

**SortedMap接口:**它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一个实现。

TreeMap中默认是按照升序进行排序的,如何让他降序

通过自定义的比较器来实现

定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:

  • 如果参数字符串等于此字符串,则返回 0 值;
  • 如果此字符串小于字符串参数,则返回一个小于 0 的值;
  • 如果此字符串大于字符串参数,则返回一个大于 0 的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Java高级架构面试知识整理.pdf"是一份关于Java高级架构的面试知识点的文档。该文档主要包括以下几个方面的内容: 1. Java多线程和并发:讲解Java的多线程概念、线程安全性、线程的生命周期和状态转换、线程同步与锁、并发工具类(如CountDownLatch、Semaphore等)、线程池等相关知识点。 2. JVM与GC算法:了解Java虚拟机(JVM)的基本原理、内存结构和内存模型,理解垃圾回收(GC)算法的原理和常见的垃圾回收器(如Serial、Parallel、CMS、G1等),掌握GC调优的一般方法。 3. 分布式架构和并发编程模型:认识分布式系统的基本概念、CAP定理、分布式存储和分布式计算的方案,了解常见的并发编程模型(如Actor模型、异步编程等)和实现方式。 4. 高性能网络编程:熟悉Java NIO的基本原理、底层实现和使用方式,了解Java网络编程的相关API和概念(如Socket、ServerSocket、Selector等),了解基于Netty框架的高性能网络编程。 5. 分布式消息队列和间件:了解消息队列的基本概念、常见的消息间件(如RabbitMQ、Kafka等)的特点和使用场景,理解消息队列的高可用、持久化、消息顺序等特性。 6. 微服务和服务治理:理解微服务的概念、优劣势和架构特点,了解微服务的拆分和组织原则,熟悉常见的服务治理框架(如Spring Cloud、Dubbo等)和相关的技术组件。 7. 高可用和容灾设计:掌握高可用架构的设计原则和常见的高可用技术方案(如集群、负载均衡、故障切换等),了解容灾方案的设计和实现方法,学习如何保证系统的可靠性和稳定性。 8. 性能优化与调优:了解性能优化的基本思路和方法,熟悉性能调优的一般流程和工具,掌握常见的性能调优技术(如缓存、异步、批处理等)和优化手段。 以上就是对于"Java高级架构面试知识整理.pdf"文档的简要回答,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值