把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修饰,不能被子类继承。