java语言基础知识点(每日更新6.30)

javac.exe是编译功能javaCompiler
java.exe是执行程序,用于执行编译好的.class文件
javadoc.exe用来制作java文档
jdb.exe是java的调试器
javaprof.exe是剖析工具

1、JVM内存不包含如下哪个部分( )
正确答案: D
A.Stacks
B.PC寄存器
C.Heap
D.Heap Frame
image
2、java用()机制实现了线程之间的同步执行
正确答案: A
A.监视器
B.虚拟机
C.多个CPU
D.异步调用

首先jvm中没有进程的概念 ,但是jvm中的线程映射为操作系统中的进程,对应关系为1:1。那这道题的问的就是jvm中线程如何异步执行 。  在jvm中 是使用监视器锁来实现不同线程的异步执行,  在语法的表现就是synchronized  。

3、在Java中,对于不再使用的内存资源,如调用完成的方法,“垃圾回收器”会自动将其释放。( )
正确答案: B
A.正确
B.错误

方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放

总结一下HashMap和Hashtable的区别:
    (1)HashMap是Hashtable的轻量级实现,它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),而Hashtalbe不允许。
    (2)HashMap没有contains方法,而是containsValue和containsKey。
    (3)Hashtable的方法是线程安全的,而HashMap不是线程安全的。
    (4)HashMap使用Iterator,Hashtable使用Enumeration。
    (5)HashMap和Hashtable采用的hash/rehash算法都几乎一样,所以性能不会有很大的差异。
    (6)在Hashtable中,hash数组默认大小是11,增加的方式是old*2+1。在Has和Map中,hash数组的默认大小是16,而且一定是2的倍数。
    (7)hash值的使用不同,Hashtable直接使用对象的hashCode。

4、下面几个关于Java里queue的说法哪些是正确的()?
正确答案: A C
A.LinkedBlockingQueue是一个可选有界队列,不允许null值
B.PriorityQueue,LinkedBlockingQueue都是线程不安全的
C.PriorityQueue是一个无界队列,不允许null值,入队和出队的时间复杂度是O(log(n))
D.PriorityQueue,ConcurrentLinkedQueue都遵循FIFO原则

A、LinkedBlockingQueue是一个基于节点链接的可选是否有界的阻塞队列,不允许null值。
B、LinkedBlockingQueue是一个线程安全的阻塞队列,实现了先进先出等特性。
C、PriorityQueue是一个***队列,不允许null值,入队和出队的时间复杂度是O(log(n))。
D、PriorityQueue是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。ConcurrentLinkedQueue是一个基于链接节点的***线程安全队列,该队列的元素遵循FIFO原则。

5、下面有关java实例变量,局部变量,类变量和final变量的说法,错误的是?
正确答案: B
A.实例变量指的是类中定义的变量,即成员变量,如果没有初始化,会有默认值。
B.局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值
C.类变量指的是用static修饰的属性
D.final变量指的是用final 修饰的变量


定义在类中的变量是类的成员变量,可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型例如int则会默认初始化为0
局部变量是定义在方法中的变量,必须要进行初始化,否则不同通过编译
被static关键字修饰的变量是静态的,静态变量随着类的加载而加载,所以也被称为类变量
被final修饰发变量是常量

6、下面有关servlet中init,service,destroy方法描述错误的是?
正确答案: D
A.init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
B.service()方法处理客户机发出的所有请求
C.destroy()方法标志servlet生命周期的结束
D.servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的

init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始 化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求 
 service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法 
destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之 前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中 打开的与servlet相关的资源存储servlet的状态

7、下面有关JSP内置对象的描述,说法错误的是?
正确答案: C
A.session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止
B.request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应
C.application对象:多个application对象实现了用户间数据的共享,可存放全局变量
D.response对象:response对象包含了响应客户请求的有关信息

application对象是共享的,多个用户共享一个,以此实现数据共享和通信
JSP内置对象和属性列举如下:
1.request对象
     客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象
     response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象
     session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
4.out对象
     out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象
     page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
     application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
   exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

8、运用下列哪个命令能够获取JVM的内存映像
正确答案: B
A.jinfo
B.jmap
C.jhat
D.jstat

1、jps:查看本机java进程信息。

2、jstack:打印线程的栈信息,制作线程dump文件。

3、jmap:打印内存映射,制作堆dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具

6、jconsole:简易的可视化控制台

7、jvisualvm:功能强大的控制台
http:HTTP协议(HyperText Transfer Protocol,超文本传输协议),是用于从WWW服务器传输超文本到本地浏览器的传输协议。
servlet:是一套技术标准,内含与web应用相关的一系列接口,用于为web应用实现方式提供宏观解决方案
web容器:例如tomcat,用于接受、响应客户端的请求,负责将HTTP请求转换为HttpServletRequest对象,也就是创建servlet实例对象
jsp网页:java的服务器页面,其本质也是一个servlet,由html网页代码、Java代码、jsp标签组成,当servlet处理完数据后会转发给jsp,jsp负责显示数据
threadlocalmap使用开放定址法解决hash冲突,hashmap使用链地址法解决hash冲突



序列化:将数据结构转换称为二进制数据流或者文本流的过程。序列化后的数据方便在网络上传输和在硬盘上存储。
反序列化:与序列化相反,是将二进制数据流或者文本流转换称为易于处理和阅读的数据结构的过程。

本质其实还是一种协议,一种数据格式,方便数据的存储和传输。


9、HashSet子类依靠()方法区分重复元素。
正确答案: C
A.toString(),equals()
B.clone(),equals()
C.hashCode(),equals()
D.getClass(),clone()

HashSet的底层还是用HashMap来实现的。将Entry<K,V>的V都变成了同一个Object对象,public static final PRESENT = new Object()。
而HashMap的数据结构是数组+链表+红黑树。

调用K的hashCode方法,然后高低16位进行&运算。得到的hash值,与数组tab[](桶)的长度-1进行&运算,确定插入对象在哪一个桶上。然后调用对象的equals方法,形成链表。当链表长度大于8时,链表转红黑树。
mock对象:也成为伪对象,在测试中的利用mock对象来代替真实对象,方便测试的进行。
java的封装性:指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,通过该类提供的方法实现对内部信息的操作访问。
反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

10、关于 Socket 通信编程,以下描述错误的是:( )

正确答案: D
A.服务器端通过new ServerSocket()创建TCP连接对象
B.服务器端通过TCP连接对象调用accept()方法创建通信的Socket对象
C.客户端通过new Socket()方法创建通信的Socket对象
D.客户端通过new ServerSocket()创建TCP连接对象

Socket套接字 
就是源Ip地址,目标IP地址,源端口号和目标端口号的组合
服务器端:ServerSocket提供的实例
ServerSocket server= new ServerSocket(端口号)
客户端:Socket提供的实例
Socket soc=new Socket(ip地址,端口号)

11、Java数据库连接库JDBC用到哪种设计模式?
正确答案: B
A.生成器
B.桥接模式
C.抽象工厂
D.单例模式

桥接模式:
定义 :将抽象部分与它的实现部分分离,使它们都可以独立地变化。
意图 :将抽象与实现解耦。
桥接模式所涉及的角色
1.  Abstraction :定义抽象接口,拥有一个Implementor类型的对象引用
2.  RefinedAbstraction :扩展Abstraction中的接口定义
3.  Implementor :是具体实现的接口,Implementor和RefinedAbstraction接口并不一定完全一致,实际上这两个接口可以完全不一样Implementor提供具体操作方法,而Abstraction提供更高层次的调用
4.  ConcreteImplementor :实现Implementor接口,给出具体实现
Jdk中的桥接模式:JDBC
JDBC连接 数据库 的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不动,原因就是JDBC提供了统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了
关于封装:
封住、继承、多态是面向对象的三大特征,其重要性与使用频率不言而喻。
1 、什么是封装?
封装就是将属性私有化,提供公有的方法访问私有属性。

做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值( getter )方法和赋值( setter )方法,用于对这些属性的访问。

如: private String name;

public String getName(){

                    return;

           }

        public void setName(String name){

                    this.name=name;

           }

2、     为什么需要封装?

    通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性。

   由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强

12、下面关于JAVA的垃圾回收机制,正确的是( )
正确答案: B
A.当调用“System.gc()”来强制回收时,系统会立即回收垃圾
B.垃圾回收不能确定具体的回收时间
C.程序可明确地标识某个局部变量的引用不再被使用
D.程序可以显式地立即释放对象占有的内存

java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。当对象的引用变量被赋值为null,可能被当成垃圾。


RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的***,为远程通信开辟新的里程碑。

RMI的开发步骤

先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
最后客户端查找远程对象,并调用远程方法

13、final、finally、finalize三个关键字的区别是()
正确答案: A B C
A.final是修饰符(关键字)可以修饰类、方法、变量
B.finally在异常处理的时候使用,提供finally块来执行任何清除操作
C.finalize是方法名,在垃圾收入集器将对象从内存中清除出去之前做必要的清理工作
D.finally和finalize一样都是用于异常处理的方法

final:可用来定义变量、方法传入的参数、类、方法。
finally:只能跟在try/catch语句中,并且附带一个语句块,表示最后执行。
finalize:是垃圾回收器操作的运行机制中的一部分,进行垃圾回收器操作时会调用finalize方法,因为finalize方法是object的方法,所以每个类都有这个方法并且可以重写这个方法,在这个方法里实现释放系统资源及其他清理工作,JVM不保证此方法总被调用。
synchronized保证三大性,原子性,有序性,可见性,volatile保证有序性,可见性,不能保证原子性

1.sleep会使当前线程睡眠指定时间,不释放锁
2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁

14、Java1.8之后,Java接口的修饰符可以为()
正确答案: D
A.private
B.protected
C.final
D.abstract
15、Java1.8之后,Java接口的修饰符可以为()
正确答案: D
A.private
B.protected
C.final
D.abstract

A在类中定义的变量称为类的成员变量,在别的类中不可以直接使用局部变量的
C使用别的类的方法需要通过该类的对象引用方法的名字
D只要没有定义任何构造函数,JVM都会为类生成一个默认构造函数

16、
以下哪个事件会导致线程销毁?()

正确答案: D
A.调用方法sleep()
B.调用方法wait()
C.start()方法的执行结束
D.run()方法的执行结束

A. 调用sleep()方***让线程进入睡眠状态---睡眠指定的时间后再次执行;
B. 调用wait()方***让线程进入等待状态 ----等待别的线程执行notify()或notifyAll()唤醒后继续执行;
C.调用start()方***让线程进入就绪状态---得到CPU时间就执行线程;
D.run()方法是线程的具体逻辑方法,执行完,线程就结束。

17、下面叙述那个是正确的?()
正确答案: B
A.(如Vector)可以用来存储任何类型的对象,且大小可以自动调整。但需要事先知道所存储对象的类型,才能正常使用。
B.在java中,我们可以用违例(Exception)来抛出一些并非错误的消息,但这样比直接从函数返回一个结果要更大的系统开销。
C.java接口包含函数声明和变量声明。
D.java中,子类不可以访问父类的私有成员和受保护的成员。

B选项说的情况就是我们自定义异常的情况,请仔细读:我们可以用违例(Exception)来抛出一些并非错误的消息,可以,并非错误的消息。比如我自定义一个异常,若一个变量大于10就抛出一个异常,这样就对应了B选项说的情况,我用抛出异常说明这个变量大于10,而不是用一个函数体(函数体内判断是否大于10,然后返回true或false)判断,因为函数调用是入栈出栈,栈是在寄存器之下的速度最快,且占的空间少,而自定义异常是存在堆中,肯定异常的内存开销大!所以B对。
C选项说的是接口包含方法声明和变量声明。因为接口中方法默认是 abstract public,所以在接口只写函数声明是符合语法规则。但是变量默认是用public final static 修饰的,意思它是静态常量,常量不管在接口中还是类中必须在声明时初始化!所以C的后半句是错的,必须在声明时并给出初始化!

18、在开发中使用泛型取代非泛型的数据类型(比如用ArrayList取代ArrayList),程序的运行时性能会变得更好。()
正确答案: B
正确
错误

使用泛型的好处
1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
 

2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

 

3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

所以泛型只是提高了数据传输安全性,并没有改变程序运行的性能

String, StringBuffer,StringBuilder的区别

java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。

1.可变与不可变

String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

private final char value[];

      String 为不可变对象,一旦被创建,就不能修改它的值. . 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

char[] value;

     StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 , 它只能通过构造函数来建立,  如: StringBuffer sb = new StringBuffer();

不能通过赋值符号对他进行付值. , 如 sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法.      sb.append("hello");

2.是否多线程安全

String中的对象是不可变的,也就可以理解为常量, 显然线程安全 。

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是 线程安全的 。看如下源码:

 

1   public   synchronized  StringBuffer reverse() {

2       super .reverse();

3       return   this ;

4  }

5  

6   public   int  indexOf(String str) {

7       return  indexOf(str, 0);         //存在 public synchronized int indexOf(String str, int fromIndex) 方法

8  }

 

StringBuilder并没有对方法进行加同步锁,所以是 非线程安全的 。

 3.StringBuilder与StringBuffer共同点

StringBuilder与StringBuffer有公共父类AbstractStringBuilder( 抽象类 )。

抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

 

效率比较String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”时,String效率最高。
1、super()表示调用父类构造函数、this()调用自己的构造函数,而自己的构造函数第一行要使用super()调用父类的构造函数,所以这俩不能在一个构造函数中会出现重复引用的情况
2、super()和this()必须在构造函数第一行,所以这一点也表明他俩不能在一个构造函数中
3、this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块(里面不能使用非static类型的)。

19、下面哪项技术可以用在WEB开发中实现会话跟踪实现?
正确答案: A B C D
A.session
B.Cookie
C.地址重写
D.隐藏域

会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能。
HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。当一个客户在多个页面间切换时,服务器会保存该用户的信息。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
1).隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mingshengda

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

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

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

打赏作者

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

抵扣说明:

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

余额充值