Java中--XX和XX的区别

把2------8用最快的办法  

2 <<3

super关键字与this关键字的区别:

1. 代表的事物不一致。

1. super关键字代表的是父类空间的引用。

2. this关键字代表的是所属函数的调用者对象。

2. 使用前提不一致。

1. super关键字必须要有继承关系才能使用。

2. this关键字不需要存在继承关系也可使用。

3. 调用构造函数的区别:

1. super关键字是调用父类的构造函数。

2. this关键字是调用本类的构造函数。

super() 和this()不能同时出现,因为二者都需要在第一行子类当中至少有一个来

而不是super/this 或者this.name这种

构造函数和一般函数的区别

1.两个函数定义格式不同

2.构造函数在对象创建时就被调用,用于初始化,且初始化动作只执行一次

一般函数,是在对象创建之后,需要调用才执行,且可以被调用多次

构造代码块和构造函数的区别

构造代码块:给所有对象进行初始化,也就是说,所有的对象都会调用一个代码块,只要对象一建立,就会调用这个代码块【构造静态代码块会在类加载的时候就创建】

构造函数:是给与之对应的对象进行初始化,具有针对性

成员变量和静态变量和局部变量的区别

成员变量:也叫成员属性,描述行为和属性,属于对象,存在堆内存中,随着对象创建而存在,随着对象被回收而消失,只能被对象调用

局部变量:属于方法体,存在于栈内存中,实质上就是一个全局变量

静态变量:属于类,存在于方法区中,随着类加载而存在,随着对象的消失而消失,可以被对象调用,也可以被类名调用

成员变量:

①成员变量定义在类中,在整个类中都可以被访问。

②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。

③成员变量有默认初始化值。

局部变量:

①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。

②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。

③局部变量没有默认初始化值

成员变量和静态变量

1、两个变量的生命周期不同

成员变量随着对象的创建而存在,随着对象被回收而释放。

静态变量随着类的加载而存在,随着类的消失而消失。

2、调用方式不同

成员变量只能被对象调用。

静态变量可以被对象调用,还可以被类名调用。

3、别名不同

成员变量也称为实例变量。

静态变量也称为类变量。

4、数据存储位置不同

成员变量存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

抽象类和接口的区别

1.抽象类只能被继承,而且只能单继承

接口需要被实现,而且可以多实现

2.抽象类中可定义非抽象方法,子类可以直接继承使用

接口中都是抽象方法,需要子类去实现

3.抽象类使用的是 is a 的关系

接口使用的是 like a 的关系

4.抽象类的成员修饰符可以自定义

接口中的成员修饰符是固定的:成员变量:public static final 成员方法:public abstract

error和exception的区别

error属于编译时的错误,根本不会通过编译,即不会生成.class文件

exception属于运行时错误,只有在调用时才会报错,如空指针,数组下标越界等

简单来说就是error要想恢复比较困难,如内存溢出,Exception只要你的程序设计没有问题是不会出现的。

throw和throws的区别

throw:在方法体中(case语句块)

throws:方法体中抛

overload和override的区别

overload是指多个方法具有相同的名字,但这些方法的参数列表不同。方法的返回值类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使返回值类型相同,也必须保证参数不同。overload的方法可以有不同的返回值类型。

override是父类与子类之间多态性的一种表现,子类override父类方法时,必须满足的条件是子类override的方法与父类的方法同名、返回值类型相同、参数个数和参数类型相同,而且子类方法的权限不低于父类方法的权限。

进程和线程的区别

进程: 正在进行的程序。(内存+CPU)

单进程:DOS

多进程:WIN

怎么实现的?时间片

线程:进程执行的步骤。

迅雷(Process--cpu+内存)----1-下载(Thread) 2-播放(Thread)

单线程:下载完才能播放。

多线程:在线播放,边下载,边播放---时间片

效率最高的解决方案:多进程的OS+多线程的APP

进程:每个独立执行的程序称为进程

线程:是一个程序内部的一条执行路径,Java虚拟机允许应用程序并发地运行多个执行程序

线程安全和线程同步的区别

线程同步是实现线程安全的一个途经

ArrayList与Vector的区别

ArrayList:底层的数据结构是数组,线程不同步,代替了Vector,查询元素的速度非常快

LinkedList:底层数据结构是链表,线程不同步,增删速度非常快

Vector:底层数据结构是数组,线程同步,不论查询还是删除都很慢【最早出现的一个集合】

final-finally-finalize的区别

final修饰的基本类型相当于常量,不能修改,修饰的类不能继承

finally用在try...catch语句块中,一般用来释放资源

finalize在GC垃圾回收处出现

String-StringBuilder-StringBuffer的区别

String 字符串常量(理解为常量,一经修改就开辟新空间,会产生垃圾)

StringBuffer 字符串变量(线程安全的可变字符序列)

StringBuilder 字符串变量(非线程安全的可变字符序列)

 

String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

 

StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下

 

java.lang.StringBuilder,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

 

StringBuffer和StringBuilder的主要区别在于前者线程安全(等价于同步),后者是线程不安全(等价于异步)

 

如果StringBuffer想要输出的话,则必须用toString()方法先转换成String类型,才能输出

并发和并行的区别

并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时

并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

wait和sleep的区别

wait:可以用来指定时间也可以不指定。不指定时间,只能由notify或者notifyAll来唤醒

线程会释放执行权,而且线程会释放锁

sleep:必须指定时间,时间会自动从冻结状态转成运行状态(临时阻塞状态)

线程会释放执行权,但是不释放锁

集合和数组之间的区别

数组-->字符串 toString

字符串-->数组 split

 

数组:保存基本数据类型

集合:对象

 

数组-->集合 asList

集合-->数组 toArray

length和length()的区别

数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆

Hashtable和HashMap的区别

1.Hashtable是线程安全的,hashMap线程不安全

2.Hashtable不可以存储null值,HashMap可以

ArrayList和LinkedList的区别

1.ArrayList是实现了动态数组操作,LinkedList类似于链表的数据结构

2.对于增删而言,LinkedList更快,而对于查找ArrayList更快

equals和==

1.对于基本数据类型,==判断的是二者的值

对于引用数据类型,==判断的是二者的地址

1.==是判断两个变量或实例是不是指向同一个内存空间

equals是判断两个变量或实例所指向的内存空间的值是不是相同

2.==是指对内存地址进行比较

equals()是对字符串的内容进行比较

3.==指引用是否相同

equals()指的是值是否相同

Collection和Collections的区别

Collection是接口,它是Set、List等容器的父接口;

Collections是工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等

indexOf,charAt,subString的区别

基本类型和引用类型

普通类型传递的是参数(值)本身,而引用类型传递的是地址

基本类型数据传递的是该数据的值本身(变量的副本)。

引用类型数据传递的是这个对象的引用(的副本),而非对象本身。

next()--nextInt()--nextLine()

next()--String--只读取空格之前的数据,next方法不能得到带空格的字符串。

nextLine()--读取整行,返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

nextInt()--int--只读取int数值

读取数字也可以使用nextLine(),不过需要转换:Integer.parseInt(cin.nextLine())

注意在next()、nextInt()与nextLine()一起使用时,next()、nextInt()往往会读取部分数据(会留下"\n"或者空格之后的数据)

字符,字符串,数字之间的转换

string 和int之间的转换

string转换成int  :Integer.valueOf("12")

int转换成string : String.valueOf(12) 

char和int之间的转换

首先将char转换成string

String str=String.valueOf('2')

Integer.valueof(str) 或者Integer.PaseInt(str)

Integer.valueof返回的是Integer对象,Integer.paseInt返回的是int

PreparedStatement和Statement区别

前者效率更高,且可以防止sql注入问题

executeQuery和executeUpdate 和execute

executeQuery:返回一个结果集,用于select查询语句中

executeUpdate:用于执行insert,delete,update语句中,其返回值是一个整数(int), 指示受影响的行数(即更新行数)

execute:可用于执行任何SQL语句,返回值是一个boolean类型,表示执行该SQL语句是都返回了ResultSet,如果执行后第一个结果是ResultSet,则返回true,否则返回false.

String 的subString是如何实现的?

标注截取的前后角标,从标注位置开始截取

RuntimeException和一般Exception的区别

RuntimeException和error都是非运行时异常,Exception是需要编译才能显示的异常

Object和Class

Java中Object是所有类的父类,所有类的对象都是Class类的实例。

重定向和转发

重定向:两次请求,一次响应

转发:一次请求,一次响应

servlet请求转发与重定向的区别:

request.setAttribute("test","hello");

request.getRequestDispacther("/test.jsp").forword(request,response); 

response.sendRedirect("test.jsp");

 

一、显示结果:

1、当用request.getRequestDispacther("/test.jsp").forword(request,response); 请求转发后,结果页面输出:hello

 

2、当用response.sendRedirect("test.jsp");重定向后,结果页面输出:null

 

 

二、底层分析:

 

1、请求转发(RequestDispatcher)的过程:

 

 

         客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

 

2、重定向(sendRedirect)的工作原理:

 

 

             客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。

 

 

三、表面分析:

 

1、当用RequestDispatcher请求转发后,地址栏为http://localhost:8080/test/TestServlet

这真好应正了上面的分析,我们起初请求的就一个servlet,至于你服务器端怎么转,流程怎么样的,我客户端根本就不知道,我发了请求后我就等

 

着响应,那你服务器那边愿意怎么转就怎么转,我客户端不关心也没法知道,所以当服务器端转发到jsp后,它把结果返回给客户端,客户端根本就

 

不知道你这个结果是我真正访问的servlet产生的,还是由servlet转发后下一个组件产生的。

 

2、当用sendRedirect重定向后,地址栏为http://localhost:8080/test/test.jsp

因为这个时候,客户端已经知道了他第二次请求的是test.jsp,服务器已经告诉客户端要去访问test.jsp了,所以地址栏里会显示想要访问的结果。

常量池和连接池

常量池:专门存放字符串

连接池:数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

构造方法不能被static、final、native、abstract和synchronized修饰,不能被子类继承。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸小波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值