javaEE全栈基础知识问答

21.Java语言的本质是什么?

java的本质就是一门就计算机语言.帮我我们让计算机以我们的想法来运行。

2.Java语言的功能是什么?

java语言的功能Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。

3.Java跨平台原理是什么?

java的跨平台原理:由源文件(.java)--->字节码文件(.class)(二进制文件)-----> 解释---->Unix,Win,Linux等机器。

4.Java命名规则

(1)项目名全部小写。

(2)包名全部小写。

(3)类名首字母大写,其余组成词首字母依次大写。

(4)变量名,方法名首字母小写,如果名称由多个单词组成,除首字母外的每个单词的首字母都要大写。

(5)常量名全部大写。

(6)所有命名规则必须遵循以下规则 

      (6.1)名称只能由字母、数字、下划线、$符号组成。

      (6.2)不能以数字开头。

      (6.3)名称不能使用Java中的关键字。

     (6.4)坚决不允许出现中文及拼音命名。

5.构造方法何时被调用

当一个对象被创建时。

6.方法重载与重写的区别;

方法重载是方法名相同,参数类型,参数个数,返回值类型可能不同的情况。对于本身而言。

方法重写是除了方法体,其他修饰头部都相同。对于父子关系而言

7.类与对象的关系

类是一个抽象,先有类,再有对象,对象是类的具体化。只有在创建对象以后,堆才会分配一个内存出来。当创建一个对象时,是通过jvm的内存共享区中构造方法得到一个具体的堆内存,也就是对象,对象被创建以后,属于这个对象的方法才陆续出现,才能被调用。(除了 Static。修饰的方法在对象创建之前就已经存在)类的存在使得某个动作被执行成为可能,但只有对象才能真正执行这个动作。类是规则的制定者,对象是规则的执行者。

8.如何理解面向对象?

万物皆对象,面向对象的思想使得我们可以把一些过去的实现包装起来。非常有利于代码的复用。而且在这个思想下,设计者和使用者被分开了,彼此互不干扰,非常便于向用户推广。像我们这样的小白还能知道很多常用的API但一般情况下没必要知道它的实现细节。

9.面向对象的优点?

(1)提高了代码的可扩展性。

(2)提高了代码的可维护性。

(3)面向对象的封装,继承,多态。

10.int和Integer有什么区别?

(1) int 是基本数据类型,int 变量存储的是数值。Integer 是引用类型,实际是一个对象,Integer 存储的是引用对象的地址。

(2)非 new 生成的 Integer 变量指向的是 java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同。

(3)Integer 变量(无论是否是 new 生成的)与 int 变量比较,只要两个变量的值是相等的,结果都是相等。

12.final类有什么特点?

(1)被 final 修饰的类表示不可继承的(而并非是 immutable 不可变的)。

(2)被 final 修饰的方法,不能被覆写 Override。

(3)被 final 修饰的变量不能被修改的。

13.如何声明一个静态块?静态块有什么好处?

声明:static { 
System.out.println("parent static block"); 

好处:静态块主要是在main方法执行之前就执行一次,并且在整个程序的执行过程只执行一次。比构造函数先执行。主要是避免有些重复功能的代码浪费资源。比如JDBC的加载连接驱动可以写成一个静态块。

14.如何创建数组?要注意那些事项?

//第一种创建方法:
 int[] nums = new int[]{1,5,6,9,7};
 //注意:new int[] 括号中不能有数字;

 //第二种创建方法:

  int[] a ={1,2,3,4,5};
  //此方法使用与C语言中使用较为相似

  //第三种创建方法
  int b[] = new int[6];
  b[1] = 1;
  b[2] = 2;
  //其实就相当于创建了一个对象

注意事项:
1.静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
2.动态和静态初始化可以拆分为两步骤。
3.静态初始化一旦使用省略模式,就不能拆分成为两步骤了。

15.String拼接内部是如何完成的?

  运行时, 两个字符串str1, str2的拼接首先会调用 String.valueOf(obj),这个Obj为str1,而String.valueOf(Obj)中的实现是return obj == null ? “null” : obj.toString(), 然后产生StringBuilder, 调用的StringBuilder(str1)构造方法, 把StringBuilder初始化,长度为str1.length()+16,并且调用append(str1)! 接下来调用StringBuilder.append(str2), 把第二个字符串拼接进去, 然后调用StringBuilder.toString返回结果!用+号拼接时会另起堆内存,其它的会丢弃,造成资源浪费,能不用+号就尽量别用。

16.传参有几种类型?有几种特殊类型?

传入的数据类型:基本类型是值拷du贝,复杂类型(对象zhi)则是引用传递。
传入的参数个数:固定参数列表,可变参数列表(类似public static int add(int... i)这样)
另外,传递参数时还可以定义泛型,类似这样public <E> E get(Class<E> clazz, Long id)。目前只想到这些。

17.Java支持的数据类型有哪些?什么是自动拆装箱?

基本数据类型:

整数值型:byte,short,int,long
字符型:char
浮点类型:float,double
布尔型:boolean

整数默认 int 型,小数默认是 double 型。float 和 long 类型的必须加后缀。比如 float f = 100f。

不加的话,整数默认为int,即便是前面类型声明是long,也默认为int,浮点数默认为double。

引用类型:

首先知道 String 是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String 类还是 final 修饰的。

自动装箱:就是将基本数据类型自动转换为对应的包装类;自动拆箱:就是将包装类自动转换为基本数据类型。

18.String是最基本的数据类型吗?

不是。

Java中的基本数据类型只有8个:

byte、short、int、long、float、double、char、boolean
除了基本类型(primitive type),剩下的都是引用类型(reference type),枚举类型(enumeration type)也是引用类型。

其中 byte 一个字节,short两个字节,int四个字节,long八个字节,char两个字节
 

19.&和&&的区别

&不管true或false都会执行完。&&如果是false就直接不往下走了。

19.final, finally, finalize的区别。

Final:用于声明变量,方法和类,分别表示变量值不可变,方法不可覆盖,类不可以继承
Finally:是异常处理的一个关键字,表示finally里面的代码一定要执行
Finalize:是object类的一个方法,在垃圾回收的时候会调用被回收对象的此方法。

20.char a=a; a+1=?

98

21.泛型的作用

1.集合类型元素在运行期出现类型装换异常,增加编译时类型的检查,2. 解决的时重复代码的编写,能够复用算法

22.写出String类常见的5个方法,并详细解释?

(1)求字符串长度
public int length()//返回该字符串的长度

(2)求字符串某一位置字符
public char charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。

(3)提取子串
用String类的substring方法可以提取字符串中的子串,该方法有两种常用参数:
1)public String substring(int beginIndex)//该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
2)public String substring(int beginIndex, int endIndex)//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。

(4)字符串比较
1)public int compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
2)public int compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
3)public boolean equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
4)public boolean equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。

(5)字符串连接
public String concat(String str)//将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。

23.java和javac,javaw各有什么作用

javac 代码编译成字节码

javap字节码解析成代码

java.exe用于启动window console 控制台程序

javaw.exe用于启动 GUI程序

javaws.exe用于web程序。

jvm.dll就是java虚拟机规范在windows平台上的一种实现

24.简述一下封装

封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

25.简述static关键字的含义及用途,特点等

在成员的声明前面加上关键字static(静态的)就能创建这样的成员。 
你可以将方法和变量都声明为static。

static 成员的最常见的例子是main()。 
因为在程序开始执行时必须调用main() ,所以它被声明为static。

声明为static的变量称为静态变量或类变量。 
可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。

静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。 
声明为static的方法称为静态方法或类方法。

静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。

静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。 
静态方法不能被子类的静态方法覆盖。

26.多态的表现形式有哪些

多态是事物的不同表现形态,常见的有,方法的重载,继承关系的重写方法,父类指向子类的应用,如实现接口

27.介绍一下java中的异常处理机制

在JAVA语言出现以前,传统的异常处理方式多采用返回值来标识程序出现的异常情况,这种方式虽然为程序员所熟悉,但却有多个坏处。首先,一个API可以返回任意的返回值,而这些返回值本身并不能解释该返回值是否代表一个异常情况发生了和该异常的具体情况,需要调用API的程序自己判断并解释返回值的含义。其次,并没有一种机制来保证异常情况一定会得到处理,调用程序可以简单的忽略该返回值,需要调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变得晦涩冗长,当进行IO操作等容易出现异常情况的处理时,你会发现代码的很大部分用于处理异常情况的switch分支,程序代码的可读性变得很差。

Java异常处理:当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,try块出现异常后的代码不会再被执行,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序。

28.什么是异常

在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如用户的坏数据、试图打开一个不存在的文件等。为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。

29.每个关键字的的含义以及作用

https://www.cnblogs.com/alloevil/p/5939375.html

30.异常的分类

https://www.cnblogs.com/niceyoo/p/10585459.html

31.java中有几种类型的流?

子节流和字符流

32.字符流和字节流有什么区别?

字符流用来传递文字和字符,字节除了文字以外都可以传递。

就像搬砖,字节一次搬一块,字符往缓冲区放(推车)放满了再推走

33.什么是java 的序列化?

序列化就类似于编码,把对象转换为字节序列,反序列化就说把字节序列转换为对象。

34.static存在的主要意义

static主要是减少成员变量和方法的多次创建,一旦声明为静态,该成员变量或方法就属于这个类,可以被该类所创建的所有对象共享,就能直接用类名来调用。也就是说大家都要用的东西,我声明为静态,就不会浪费内存,静态的成员变量在编译字节码文件时,是被分配到内存中的静态区,非静态的成员变量是被分配到堆内存。

35.static的独特之处

  • 静态成员随着类的加载而加载;
  • 静态成员优先于对象存在;
  • 静态成员被所有对象所共享;
  • 静态成员多了一个中调用方式,可以被类名直接调用。

36.static应用场景

static是一个修饰符,通常用于修饰变量和方法,如开发过程中用到的字典类数据都会用到static来修饰,工具类方法,如Dateutils,Stringutils这类工具方法也会用到static来修饰,那么除了这两种最常用的场景外,是否还有其他场景呢,答案是:有的,总共五种:

  1. static变量
  2. static方法
  3. static代码块
  4. static内部类
  5. static包内导入

https://www.cnblogs.com/LiaHon/p/11075178.html

37.static注意事项

java中由static修饰的变量,长量,方法称为静态变量,长量,方法。

缘由:有时候需要两个类需要在同一个内存区域共享一个数据,这样就可以将这个变设为静态的,静态成员属于类所有,区别于个别对象。

注意事项:1,虽然静态成员也可以使用对象.静态成员,但这样不好区分静态成员和非静态成员。

              2,静态方法中不可以使用this关键字。

              3,静态方法中不可以直接调用非静态方法

              4,不能将方法中的局部变量设为静态的

              5,可以使用静态区域先执行类的初始化。

38.面向对象和面向过程的区别

面向过程:
  一种较早的编程思想,顾名思义就是该思想是站着过程的角度思考问题,强调的就是功能行为,功能的执行过程,即先后顺序,而每一个功能我们都使用函数(类似于方法)把这些步骤一步一步实现。使用的时候依次调用函数就可以了。

面向过程的设计:
  最小的程序单元是函数,每个函数负责完成某一个功能,用于接受输入数据,函数对输入数据进行处理,然后输出结果数据,整个软件系统由一个个的函数组成,其中作为程序入口的函数称之为主函数,主函数依次调用其他函数,普通函数之间可以相互调用,从而实现整个系统功能。
  面向过程最大的问题在于随着系统的膨胀,面向过程将无法应付,最终导致系统的崩溃。为了解决这一种软件危机,我们提出面向对象思想。

面向过程的缺陷:
  是采用指定而下的设计模式,在设计阶段就需要考虑每一个模块应该分解成哪些子模块,每一个子模块又细分为更小的子模块,如此类推,直到将模块细化为一个个函数。

存在的问题

设计不够直观,与人类的思维习惯不一致。
系统软件适应新差,可拓展性差,维护性低
面向对象:
  一种基于面向过程的新编程思想,顾名思义就是该思想是站在对象的角度思考问题,我们把多个功能合理放到不同对象里,强调的是具备某些功能的对象。
  具备某种功能的实体,称为对象。面向对象最小的程序单元是:类。面向对象更加符合常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
  在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。

三大特征:

1:封装(Encapsulation)
2:继承(Inheritance)
3:多态(Polymorphism)
封装是指将对象的实现细节隐藏起来,然后通过公共的方法来向外暴露该对象的功能。

继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类是一种特殊的父类,能直接或简介获得父类里的成员。

多态是可以直接把子类对象赋给父类变量,但是运行时依然表现出子类的行为特征,这意味着同一类型的对象在运行时可能表现出不同的行为特征。

39.什么是多态机制?Java语言是如何实现多态的?

多态就是指一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

特点:

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。
若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
 

Java实现多态有三个必要条件:继承、重写、向上转型。

40.普通类和抽象类有哪些区别?

关键点:abstract修饰符(抽象方法)、具体实现过程、实例化、子类实现父类的抽象方法

  1. 普通类中不可含有抽象方法,可以被实例化;
  2. 抽象类,则抽象类中所有的方法自动被认为是抽象方法,没有实现过程,不可被实例化;抽象类的子类,除非也是抽象类,否则必须实现该抽象类声明的方法

41.抽象类能使用 final 修饰吗?

不能,因为final修饰的,是不能被继承,而抽象类本身不能被实例化,需要被继承实现。

42.什么是方法的返回值?返回值的作用是什么?

return

1、退出方法,告诉你我已经完工了
2、返回值的产生

43.变量与方法的作用域分别是什么

变量分为成员变量和局部变量,成员变量被存储在堆中,作用域为整个类,局部变量存储在栈中,作用域是代码块从创建到结束,被static修饰的变量都存在方法区中,作用域是整个类,方法创建于类中,作用在主线程和其余方法中。

44.变量与方法的储存位置分别是什么

变量的作用范围是指成员变量和局部变量的有效范围。局部变量只在定义它的方法内部有效,不能在其他方法中使用;成员变量在整个类的内部都是有效的,可以被类中的任何方法使用。

45.变量与方法的生命周期分别是什么

类的加载是由JVM完成的,当需要使用类时,JVM先查找,导入类,然后进行解析和校验,并准备对应的资源,如静态资源,之后会进行初始化,初始化对象,代码块,方法等,当不在使用类时,JVM会卸载这个类。

46.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换。

赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样。

第一题:short s1 = 1; s1 = s1 + 1;

错! s1 + 1,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,要向左侧的short类型的s1看齐,即需要通过强制类型转换。正确写法:s1 = (short) (s1 + 1);

第二题:short s1 = 1; s1 += 1;

正确! 执行s1+=1;其实执行的是s1 = (short) (s1 + 1); 其中会有一个强制转换的过程。

47.如果有三个线程需要轮流工作需要怎么操作?

用线程池和锁的方式,代码例子:https://blog.csdn.net/perrywork/article/details/16819153?locationNum=14&fps=1

48.HashMap的扩容操作是怎么实现的?

解释:https://www.jianshu.com/p/9919bffc30a3

具体代码:https://blog.csdn.net/objact/article/details/100062259

49.HashMap是怎么解决哈希冲突的?

1. 使用链地址法(使用散列表)来链接拥有相同hash值的数据;

2. 使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;

3. 引入红黑树进一步降低遍历的时间复杂度,使得遍历更快;

https://mp.weixin.qq.com/s?src=11&timestamp=1596464150&ver=2500&signature=9ABPXjqtbkH4m3DG550uTgTfz-HQ7uvIGHGE7v74EGe0UtOsskOkpJ8oYHLYeri5zafSWFBNuOPOBtULrRWu8ePOd-WsGkYFCP6jXhtvhesMmP-zHqbABtgzyw5AT8gr&new=1

50.请写出至少5个HTML块元素标签

div、p、h1...、ul、header

51.请写出至少5个HTML行内元素标签

span、a、input、b、strong、img

52.请写出table标签下面会包含哪些标签元素

tr 元素定义表格行,th 元素定义表头,td 元素定义表格单元。
复杂的 HTML 表格包括 caption、col、colgroup、thead、tfoot 以及 tbody 元素。

53.很多网站不常用table  iframe这两个元素,知道原因吗?

iframe
坏处:
是一个单独的容器,因此不会应用全局的CSS样式
会和网页共用域名连接池,因此可能由于iframe占用了连接数导致加载阻塞
搜索引擎爬虫不易爬取,不利于SEO
相比直接操作DOM元素,使用iframe更耗费资源
好处:
可以用其展示广告,可以避免由于添加广告而网站被爬虫拒绝收录的情况

table
坏处:
table的内容会等内部的所有内容加载完成才会显示,比基于div+css实现的表格布局加载速度慢。会导致网页语义发生错误,不利于无障碍功能改动内部内容会造成整个table重绘,消耗更多资源

好处:
前期广泛用于后台管理系统,由于普通的后台管理系统大多都是表格布局,基于table编程难度低且面向内网的管理系统对性能要求没那么高

53.synchronized 和 ReentrantLock 的区别

两者的共同点: 
1. 都是用来协调多线程对共享对象、变量的访问 
2. 都是可重入锁,同一线程可以多次获得同一个锁 
3. 都保证了可见性和互斥性
两者的不同点: 
1. ReentrantLock 显示的获得、释放锁,synchronized 隐式获得释放锁 
2. ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的,为处理锁的 不可用性提供了更高的灵活性 
3. ReentrantLock 是 API 级别的,synchronized 是 JVM 级别的 
4. ReentrantLock 可以实现公平锁 
5. ReentrantLock 通过 Condition 可以绑定多个条件 
6. 底层实现不一样, synchronized 是同步阻塞,使用的是悲观并发策略,lock 是同步非阻塞,采用的是乐观并发策略 
7. Lock 是一个接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言实现。   
8. synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 fifinally 块中释放锁。 
9. Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中断。 
10. 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。 
11. Lock 可以提高多个线程进行读操作的效率,既就是实现读写锁等。

https://www.jianshu.com/p/afc6ea1d15a6

54.img标签上title属性与alt属性的区别是什么?

alt 设置或返回无法显示图像时的替代文本。
图片不加载在网页上显示
title 设置或返回元素的 title。
图片触发onmouseove事件的提示信息

55.h5的新特性你了解哪些?

HTML5 中的一些有趣的新特性:
• 用于绘画的 canvas 元素
• 用于媒介回放的 video 和 audio 元素
• 对本地离线存储的更好的支持
• 新的特殊内容元素,比如 article、footer、header、nav、section
• 新的表单控件,比如 calendar、date、time、email、url、search

56.DOCTYPE有什么作用?标准模式和混杂模式如何区分?他们有什么意义?

<!DOCTYPE>的作用

<!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该文件的类型。让浏览器解析器知道应该用哪个规范来解析文档。

严格模式:是浏览器按照w3c标准解析代码

混杂模式:是浏览器按照自己的标准解析代码

严格模式和混杂模式存在的意义:如果说只存在严格模式,那么许多旧网站必然受到影响,如果只存在混杂模式,那么会回到当时浏览器大战时的混乱,每个浏览器都有自己的解析模式。

57.网页验证码是干嘛的,是为了解决什么安全问题?

网页验证码是区分计算机还是人的程序,可以有效防止黑客入侵,且由于设置验证码,在大并发情况下,可以缓解服务器压力,起到分流作用

58.HTML5存储类型有什么区别?

cookies:请求头上带着数据、大小是4k之内,不同浏览器对每个域名存放cookie个数有限制;

localStorage:适用于长期存储数据,浏览器关闭后数据不丢失;

sessionStorage:存储的数据在浏览器关闭后自动删除。

59.link和@import的区别是?

https://www.cnblogs.com/my--sunshine/p/6872224.html

60.对语义化标签的理解

https://blog.csdn.net/linayangoo/article/details/86647968

61.html是一种什么语言?

超文本标签语言

62.索引的作用,优点和缺点?

https://www.cnblogs.com/daisyyang/p/10907817.html

63.数据库三大范式是什么?

  • 第一范式(1NF):数据库表的列必须是不可再分的,满足每一列的原子性;

比如:表中字段地址信息 -> 划分成省、市、区、县

  • 第二范式(2NF):不能够出现多个数据列重复的现象;即一张表如果包含了多个实体的属性,那么就要分表;

比如:订房间情形下,会出现多列相同,比如:人名、年龄、联系电话、身份证=》 将人的信息分离出去,只需保留分离出去的人的id即可

  • 第三范式(3NF):表中的每一列和主键直接相关;即保证一张表只能有一个主键,那么所有的行必须和主键意义相关;

故:必须先满足第一范式才能满足第二范式,必须同时满足第一第二范式才能满足第三范式。

64.使用索引查询一定能提高查询的性能吗?为什么?

     通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用; 基于非唯一性索引的检索 索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

65.两个对象值相同(x.equals(y)==true),但却可有不同你的hash code ,这句话对不?

对,如果自定义对象重写了equals方法,没有重写hashCode方法,条件成立。

如果一个对象没有重写hashCode哈希值默认的是对象的地址,而上面两个对象地址不同

66.String s=new String("xzk");创建了几个字符串对象?

(1)如果是第一次运行这句话,则创建两个对象;
这句话相当于:string s=new String("xyz");
首先在调用string类的构造方法时需要传入一个字符串参数,这里传入
"xyz",但"xyz"是从哪里来?它其实也是被new出来的,因此这里就
创建一个string对象;然后再创建对象s,因此第一次运行这句话时一共创建两个string对象。
(2)如果不是第一次运行这句话(例如上一句是String a=new String("xyz")),
则只创建一个对象,因为string类的底层构建技术使用了单例模式,因此对于外部
传入相同的参数后,并不再实例化一个string类,而只是将s的引用指向a,
因此此时只创建了这个外部传入的参数"xyz"的string对象。

67.用java代码怎么将GBK编码的字符串转为UTF-8编码的字符串?

new String(str.getByte("GBK"),"utf-8")

68.java和javaScript的区别是什么?

没有关系

69.什么叫视图?游标是什么?

什么是视图?

视图是一张虚拟的数据表,该数据表是由数据库的查询语句查询出来的结果得到的。

视图的作用:1.将重复、复杂的查询语句创建一个视图,查询时,直接用select * from 视图,即可轻松得到查询结果,提高效率(对于更新和删除也一样)。

      2.将多张表联接在一起,使他们看起来像一张表。

      3.增强安全性及保密性,根据不同的用户,创建不同的视图,限制其所能查看和编辑的数据。

      4.方便维护。

      5.增强可读性。

      6.降低查询复杂度。

 什么是游标?

游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。

游标的作用:

  1. 定位到结果集中的某一行。
  2. 对当前位置的数据进行读写。
  3. 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
  4. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

70.什么是事务?什么是锁?

https://segmentfault.com/a/1190000018640896

71.什么是主键?什么是外键

主键:一列(或一组列),其值能够唯一区分表中每个行。外键:某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

72.什么是servlet?

servlet是web开发中的一个标准,主要是交互式地浏览和修改数据,生成动态Web内容。

72.servlet的生命周期?

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

73.数据库中触发器的作用

触发器是一种特殊的存储机制,可以跟踪用户对数据库的操作,实现复杂的操作,可以复制表中的数据,还可以自动计算数值等。

74.线程的六种状态是什么,是如何转换的

https://mp.weixin.qq.com/s?src=11&timestamp=1598029586&ver=2536&signature=SBsZhs1qVZD0lXW2LG*s1YLQRTkwrVzFhbfKAneHUaWl4QTy13xx6vvuiw04BaeBC2wjl996v00k2MfDXLdlTJSj7yVULqyD4vKinwyIqntPo8bWowX*a-x0*qel4d1J&new=1

75.float f=3.4;是否正确?

3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

76.char型变量中能不能存储一个中文汉字?为什么

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

77.form表单提交的方式

1.表单submit提交

2.button提交

3.ajax提交

78.转发跟重定向的区别

重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。

https://mp.csdn.net/console/editor/html/107501283

79.列出一些常见的运行时异常

  • ArithmeticException(算术异常)
  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • IndexOutOfBoundsException (下标越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)

80.什么是线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务

81.一个.java源文件中是否可以包含多个类(不是内部类)?有什么限制

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名一致。

82.当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递??
答:是值传递,Java编程语言中只有值传递参数。当一个对象作为参数传递到方法中时,参数的值就是该对象的引用。对象的内容可以在方法中被改变,但对象的引用是永远不会改变的

83.Collection与Collections的根本区别是:

   Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

   Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

84.servlet接口有哪些方法?

1.void init(ServletConfig) 当Servlet对象被服务器创建时调用,仅调用一次。

2.void service(ServletRequest, ServletResponse) 可被服务器调用多次。

3.void destroy() 服务器关闭连接之前调用,仅一次,另外的两个。

4.ServletConfig getServletConfig()

5.String getServletInfo()

85.JSP有哪些内置对象?作用分别是?

  request 用户端请求,此请求会包含来自GET/POST请求的参数
   response 网页传回用户端的回应
   pageContext 网页的属性是在这里管理
   session 与请求有关的会话期
   application servlet 正在执行的内容
   out 用来传送回应的输出
   config servlet的构架部件
   page JSP网页本身
   exception 针对错误网页,未捕捉的例外

86.过滤器有哪些作用和用法

对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。

87.get和post请求的区别

1. Get的请求参数被放在请求的URL中,用户可见;Post的所有操作对用户来说都是不可见的
2. Get传送的数据量较小,受URL长度限制;Post传送的数据量较大
3. Get的执行效率比Post高

88.web.xml可以配置哪些内容

web.xml用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等

89.服务器收到用户表单数据,到底是调用Servlet的doGet()还是doPost()?

看用什么方式提交,get的话,就会调用doget,post的话就调用dopost

90.表达式EL支持哪些运算符?

91.接口可以继承接口,抽象类可以实现接口,不能继承接口,抽象类可以继承实体类

92.阐述ArrayList、Vector、LinkedList的存储性能和特性

ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用。

93.如何取得年月日、小时分钟秒?

Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));
System.out.println(cal.get(Calendar.MINUTE));
System.out.println(cal.get(Calendar.SECOND));
// Java 8
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt.getYear());
System.out.println(dt.getMonthValue()); // 1 - 12
System.out.println(dt.getDayOfMonth());
System.out.println(dt.getHour());
System.out.println(dt.getMinute());
System.out.println(dt.getSecond())

如何取得从1997年1月1日0时0分0秒到现在的毫秒数?

System.currentTimeMillis();

如何某月的最后一天?

int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); //获取某月最大天数

如何格式化日期?

  1. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

  2. LocalDate localDate = LocalDate.now();

  3. String date = localDate.format(dateTimeFormatter);

  4. System.out.println("date:"+date);

94.如何设置请求的编码以及响应内容的类型?

设置请求的编码:request.setCharacterEncoding(String)

例如:request.setCharacterEncoding(“utf-8”)

设置响应内容的类型:response.setContentType(String) or response.setHeader(String, String)

例如:response.setContentType(“text/html; charset=utf-8”)

95.什么是web service?

从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法透明的调用这个应用程序,不需要了解它的任何细节,跟你使用的编程语言也没有关系。例如可以创建一个提供天气预报的Web Service,那么无论你用哪种编程语言开发的应用都可以通过调用它的API并传入城市信息来获得该城市的天气预报。之所以称之为Web Service,是因为它基于HTTP协议传输数据,这使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。

96.阐述session加载实体对象的过程?

Session加载实体对象的步骤是:
① Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存查找命中且数据状态合法,则直接返回;
② 如果一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑名单,如果出现重复的无效查询可以迅速做出判断,从而提升性能)中进行查找,如果NonExists中存在同样的查询条件,则返回null;
③ 如果一级缓存查询失败则查询二级缓存,如果二级缓存命中则直接返回;
④ 如果之前的查询都未命中,则发出SQL语句,如果查询未发现对应记录则将此次查询添加到Session的NonExists中加以记录,并返回null;
⑤ 根据映射配置和SQL语句得到ResultSet,并创建对应的实体对象;
⑥ 将对象纳入Session(一级缓存)的管理;
⑦ 如果有对应的拦截器,则执行拦截器的onLoad方法;
⑧ 如果开启并设置了要使用二级缓存,则将数据对象纳入二级缓存;
⑨ 返回数据对象。

97.jsp中的静态包含和动态包含有什么区别?

静态和动态包含的区别与联系

  注:下文将包含有其它文件的jsp文件称为主体文件,比如上文中的index.jsp文件。将被包含的文件称为包含文件,比如上文中的header.jsp文件。

  1. <%@ include file=” ”%>是指令元素。<jsp:include page=” ”/>是行为元素
  2. 最终编译成java文件的数目不同。(从上面的例子可以看出)
    1. 静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。

    2. 动态包含是各个jsp文件分别转换,分别编译。最终编程成多个java文件。

  1. 执行时间不同

静态包含发生在:JSP---->java文件阶段。

动态包含发生在:执行class文件阶段。动态加入。

  1. 静态包含在两个文件中不能有相同的变量,动态包含允许。

由于静态包含相当于将包含文件内容直接复制到主体文件中,如果出现相同的变量,就会出现覆盖等问题,导致文件出错。而动态包含相当于调用不同的jsp,变量所在的空间不同,自然不会出现覆盖等现象。

  1. 无论是动态包含还是静态包含,其request对象都是相同的。也就是同一个request对象。

静态包含最终编译成一个java文件,有一个request对象很好理解。而动态包含最终编译成多个jsp文件,为何会使用一个request对象呢?其实这些jsp组合的过程是一个请求转发的过程,自然也使用同一个request对象了。

静态包含和动态包含的使用

简单总结一下,就一句话:被包含的页面是静态页面就用静态包含,是动态页面就用动态包含。(当然,不是很绝对,但是这样用没有错。)

98.页面导入样式时,使用link和@import有什么区别?

1、从属关系:link是html的标签,不仅可以加载 CSS 文件,还可以定义 RSS、rel 连接属性等;而@import是css的语法,只有导入样式表的作用。
2、加载顺序:页面被加载时,link会和html同时被加载而;@import引入的 CSS 将在页面加载完毕后被加载。
3、兼容性:@import是 CSS2.1 才有的语法,所以只能在 IE5以上 才能识别;而link是 HTML 标签,所以不存在兼容性问题。
4、DOM:javascript只能控制dom去改变link标签引入的样式,而@import的样式不是dom可以控制的。
5、link方式的样式权重高于@import的权重。

99.xml和json的区别

1、数据体积方面
JSON相对于XML来讲,数据的体积小,传递的速度更快些。
2、数据交互方面
JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互
3、数据描述方面
JSON对数据的描述性比XML较差
4、传输速度方面
JSON的速度要远远快于XML

100.如何实现浏览器内多个标签页之间的通讯?

1.localStorage

在一个标签页调用localStorage.setItem(name,val)保存数据localStorage.removeItem(name)删除数据的时候会触发 'storage'事件。
在另外一个标签页监听document对象的storage事件,在事件event对象属性中获取信息

event事件对象包含以下信息

  1.  domain
  2.  newValue
  3.  oldValue
  4. key

2.cookie

在A页面将需要传递的消息存储在cookie当中

在B页面设置setInterval,以一定的时间间隔去读取cookie的值

101.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中

暴力的做法就是一一比较

https://blog.csdn.net/weixin_43311389/article/details/82933638

102.sql脚本注入原理?如何进行?防御手段?

sql注入原理,通过拼接sql语录来获取或篡改数据库数据,防御手段,使用preparement接口,可以进行预编译。预编译时把,输入框传入的数据强制转化为非sql关键字的字符串或者其他数据类型,这样就避免了sql注入。

103.什么是java序列化?如何实现java序列化?

序列化就是将java对象转化为字节流,用类去实现serializable接口

104.集合和数组的区别

(1)数组存放基本类型和对象,集合类存放都是对象的引用,而非对象本身。
(2)数组长度固定无法动态改变,集合类容量动态改变。
(3)数组无法判断其中实际存有多少元素,length只是告诉了数组的长度是多少,定义了多长的长度后,即使没有存放那么多的元素,没有存放元素的空间就浪费了,而集合的size()可以知道元素的个数。
(4)集合以类的形式存在,具有封装,继承,多态等类的特征,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率

105.线程的基本 概念,线程的基本状态以及状态之间的关系

一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此,线程也被称为轻负荷进程。一个进程中可以包含多个线程。

(1)new(初始化状态),线程被创建的状态,即是可以分配CPU去执行这个线程。

(2)Runnable (可运行/运行状态),就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行。

(3)Blocked (阻塞状态)

在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态。

(4)Waiting (无时间限制的等待状态)

1.调用无参的object.wait()方法。等到notifyAll()或者notify()唤醒就会回到Runnable状态。

2.调用无参的Thread.join()方法。也就是比如你在主线程里面建立一个线程A,调用A.join(),那么你的 主线程是得等A执行完了才会继续执行,这是你的主线程就是等待状态。

3,调用LockSupport.park()方法。LockSupoort是java6引入的一个工具类java并发包中的锁都是基 于它实现的,再调LockSupport.unpark(Thread thread),就会回到Runable状态。

(5)Timed_Waiting (有时间限制的等待状态)

其实这个状态和waiting就是有没有超时时间的差别,这个状态下也是不能分配CPU执行的。有五种情况会使Runnable状态到waiting状态。

1.Object.wait(Long timeout)

2.Thread.join(long millis)

3.Thread.sleep(long millis)。注意:Thread.sleep(long millis,int nanos)内部调用的其实也是Thread.sleep(long millis).

4.LockSupport.parkNanos(Object blocked,long deadline)

5.LockSupport.parkUntil(long deadline)

(6)Terminated(终止状态)

在我们的线程正常run结束之后或者run一半异常了就是终止状态!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值