if return语句 0语句被执行后说明程序运行正常?

1、面向对象的特征有哪些方面?

抽象、继承、封装、多态性

&和&&都可以用作逻辑与的运算符,表示逻辑与(and)。

&&具有短路的功能,而&不具备短路功能。

当&运算符两边的表达式的结果都为true时,整个运算结果才为true。而&&运算符第一个表达式为false时,则结果为false,不再计算第二个表达式。

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如:0x31 & 0x0f的结果为0x01。

5、用最有效率的方法计算2乘以8?

2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)

7、String是最基本的数据类型吗?

8、是否可以继承String类?

两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。

1)功能不同 "=="是判断两个变量或实例是不是指向同一个内存空间。 "equals"是判断两个变量或实例所指向的内存空间的值是不是相同。

3)运行速度不同 "=="比"equals"运行速度快,因为"=="只是比较引用。

StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰(非同步),因此它的效率也比StringBuffer要高。

14、String 类的常用方法都有那些?

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

length():返回字符串长度。

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型

构造器不能被继承,因此不能被重写,但可以被重载。

17、阐述静态变量和实例变量的区别?

静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝。

实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

18、如何实现对象克隆?

2)实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

19、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

20、普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。

抽象类不能直接实例化,普通类可以直接实例化。

21、抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类。

22、接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

构造函数:抽象类可以有构造函数;接口不能有。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

final 修饰的类叫最终类,该类不能被继承。

final 修饰的方法不能被重写。

final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。

finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。

finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

25、Java中多态的实现原理?

所谓多态,指的就是父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”。

26、Object中定义了哪些方法?

27、Java泛型和类型擦除?

泛型即参数化类型,在创建集合时,指定集合元素的类型,此集合只能传入该类型的参数。类型擦除:java编译器生成的字节码不包含泛型信息,所以在编译时擦除:1.泛型用最顶级父类替换;2.移除。

并发编程中:原子性问题,可见性问题,有序性问题。

volatile关键字能保证可见性,字能禁止指令重排序,但是不能保证原子性。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。在生成的会变语句中加入Lock关键字和内存屏障。

Lock实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题。用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而用Lock需要我们手动释放锁。

能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了

30、常用数据结构有哪些?

集合,线性结构(数组,队列,链表和栈),树形结构,图状结构。

poll()remove()都是从队列中取出一个元素,但是poll()在获取元素失败的时候会返回空,但是remove()失败的时候会抛出异常。

HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。

HashMap最多只允许一条记录的键为null,允许多条记录的值为null。

解决碰撞:当出现冲突时,运用拉链法,将相同的结点链接在一个单链表中,散列表长m,则定义一个由m个头指针组成的指针数组T,地址为i的结点插入以T(i)为头指针的单链表中。Java8中,冲突的元素超过限制(8),用红黑树替换链表。

Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

2) HashMap允许空的键值对, 但最多只有一个空对象,而HashTable不允许。

37、concurrentHashMap的源码理解以及内部实现原理,为什么他是同步的且效率高?

在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。

HashTable使用synchronized来保证线程的安全,但是在线程竞争激烈的情况下HashTable的效率非常低下。当一个线程访问HashTable的同步方法,其他方法访问HashTable的同步方法时,会进入阻塞或者轮询状态。如果线程1使用put进行元素添加,线程2不但不能用put方法添加于元素同是也无法用get方法来获取元素,所以竞争越激烈效率越低。

HashTable容器在竞争激烈的并发环境效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,假如容器有多把锁,每一把锁用于锁住容器中一部分数据,那么多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发访问率,这就是ConcurrentHashMap的锁分段技术。将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据的时候,其他段的数据也能被其他线程访问。

ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。

Comparable 接口用于定义对象的自然顺序,是排序接口,而 comparator 通常用于定义用户定制的顺序,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。

Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。

List特点:元素有放入顺序,元素可重复

Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉

Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。

缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。

优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。

缺点:因为LinkedList要移动指针,所以查询操作性能比较低。

当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不能访问共享数据。注意该方法要捕获异常

比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。

总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

yield()方法和sleep()方法类似,也不会释放“锁标志”,区别在于,它没有参数,即yield()方法只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行,另外yield()方法只能使同优先级或者高优先级的线程得到执行机会,这也和sleep()方法不同。

Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。

虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。

45、实现线程的几种方法?

46、Java创建线程之后,直接调用start()方法和run()的区别?

Java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

进程值运行中的程序(独立性,动态性,并发性),线程指进程中的顺序执行流。区别是:1.进程间不共享内存 2.创建进程进行资源分配的代价要大得多,所以多线程在高并发环境中效率高。

48、什么叫线程安全?

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

49、线程的几种状态?

新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

同步阻塞:线程在获取 synchronized同步锁失败(因为同步锁被其他线程占用)。

其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

ReenTrantLock和synchronized使用的锁都是可重入的,两者都是同一个线程每进入一次,锁的计数器都自增1,所以等到锁的计数器下降为0时才能释放锁。

synchronized是依赖JVM实现的,ReenTrantLock是JDK实现的,类似于操作系统控制实现和用户自己写代码实现。

synchronized在JDK5优化后,两者性能差不多了。如果两种方法都可以使用的情况下,官方建议使用synchronized,因为使用便利。

synchronized由编译器加锁和释放,默认是非公平锁,ReenTrantLock手动加锁和释放锁,如果忘记释放容易引起死锁,但是对于粒度控制强于synchronized关键字。

ReenTrantLock可以指定是公平锁还是非公平锁,synchronized只能是非公平锁,所谓的公平锁就是先等待的线程先获取锁。

51、解释什么是同步和异步,阻塞和非阻塞?

同步:调用方需要主动等待结果的返回。

异步:不需要主动等待结果的返回,而是通过其他手段,比如状态通知,回调函数等。

阻塞:是指结果返回之前,当前线程被挂起,不做任何事。

非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。

52、在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率?

1、在主函数中使用join()方法

53、产生死锁的四个条件?

  1. 互斥条件(进程独占资源)
  2. 请求与保持(进程因请求资源而阻塞时,对已获得的资源保持不放) 
  3. 不剥夺条件(进程已获得的资源,在末使用完之前,不能强行剥夺) 
  4. 循环等待(若干进程之间形成一种头尾相接的循环等待资源关系)

54、如何理解分布式锁?

由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。

55、同步和异步有什么区别?

同步和异步最大的区别就在于。一个需要等待,一个不需要等待。同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。

  1. 先判断线程池中核心线程池所有的线程是否都在执行任务。如果不是,则新创建一个线程执行刚提交的任务,否则,核心线程池中所有的线程都在执行任务,则进入第2步;
  2. 判断当前阻塞队列是否已满,如果未满,则将提交的任务放置在阻塞队列中;否则,则进入第3步;
  3. 判断线程池中所有的线程是否都在执行任务,如果没有,则创建一个新的线程来执行任务,否则,则交给饱和策略进行处理

Error表示系统级的错误和程序不必处理的异常,是很难恢复的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;

Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

58、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

会执行,在方法返回调用者前执行。

59、运行时异常与受检异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。

受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。

60、列出一些你常见的运行时异常?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

63、OSI七层模型,包括TCP,IP的一些基本知识?

1.OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层对于上一层来讲是透明的,上层只需要使用下层提供的接口,并不关心下层是如何实现的。

2.TCP/IP参考模型是首先由ARPANET所使用的网络体系结构。这个体系结构在它的两个主要协议出现以后被称为TCP/IP参考模型(TCP/IP Reference Model)。这一网络协议共分为四层:网络访问层、互联网层、传输层和应用层。

3.TCP/IP模型的分层及与OSI参考模型的对应关系为:

网络访问层--对应OSI参考模型的物理层和数据链路层;

网络层--对应OSI参考模型的网络层;

传输层--对应OSI参考模型的传输层;

应用层--对应OSI参考模型的会话层、表示层和应用层。

64、TCP如何保证可靠传输?三次握手过程?

在TCP的连接中,数据流必须以正确的顺序送达对方。TCP的可靠性是通过顺序编号和确认(ACK)来实现的。

TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。

第一次是客户端发起连接;第二次表示服务器收到了客户端的请求;第三次表示客户端收到了服务器的反馈。

TCP(Tranfer Control Protocol)的缩写,是一种面向连接的保证传输的协议,在传输数据流前,双方会先建立一条虚拟的通信道。可以很少差错传输数据。

UDP(User DataGram Protocol)的缩写,是一种无连接的协议,使用UDP传输数据时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的 路径传到目的地,因此,能否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。

所以TCP比UDP多了建立连接的时间。相对UDP而言,TCP具有更高的安全性和可靠性。

TCP协议传输的大小不限制,一旦连接被建立,双方可以按照一定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K。

66、表单提交中,get和post区别?

  • get从服务器获取信息,post向服务器传信息
  • get传送数据量比较小,post可以比较大

cookie 是 Web 服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个 Web 服务器存储 cookie。以后浏览器在给特定的 Web 服务器发请求的时候,同时会发送所有为该服务器存储的 cookie。

无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用 cookie,但是, session 仍然是能够工作的,因为客户端无法禁用服务端的 session。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

69、描述一下JVM加载class文件的原理机制?

Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 

java中的类大致分为三种

    1).隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中

一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再 

运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现

Java中的类装载器实质上也是类,功能是把类载入jvm中,值得注意的是jvm的类装载器并不是一个,而是三个,层次结构如下: 

为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模型,下面会谈到该模型

类加载器之间是如何协调工作的

类加载器的工作原理基于三个机制:委托、可见性和单一性

当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abc.class,首先加载这个类的请求由 Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器 会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这 个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被 Extension类加载器找到,那么再由Application类加载器从classpath中寻找。记住classpath定义的是类文件的加载目 录,而PATH是定义的是可执行程序如javac,java等的执行路径。

可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。

根据这个机制,父加载器加载过的类不能被子加载器加载第二次。虽然重写违反委托和单一性机制的类加载器是可能的,但这样做并不可取。

1)装载:查找并加载类的二进制数据;

3)初始化:为类的静态变量赋予正确的初始值;

类什么时候才被初始化:

1)创建类的实例,也就是new一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

5)初始化一个类的子类(会首先初始化子类的父类)

6)JVM启动时标明的启动类,即文件名和类名相同的那个类

1)如果这个类还没有被加载和链接,那先进行加载和链接

2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)

3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句

70、Java中会存在内存泄漏吗?

理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。

71、GC是什么?为什么要有GC?

GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()Runtime.getRuntime().gc(),但JVM可以屏蔽掉显示的垃圾回收调用。

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。

72、你能保证 GC 执行吗?

当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

74、Java 中堆和栈有什么区别?

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

75、怎么获取 Java 程序使用的内存?堆使用的百分比?

类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory()方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory()返回最大内存的字节数。

76、JVM分为哪些区,每一个区干吗的?

1)方法区(method):被所有的线程共享。方法区包含所有的类信息和静态变量。

2)堆(heap):被所有的线程共享,存放对象实例以及数组,Java堆是GC的主要区域。

3)栈(stack):每个线程包含一个栈区,栈中保存一些局部变量等。

4)程序计数器:是当前线程执行的字节码的行指示器。

77、JVM新生代,老年代,持久代,都存储哪些东西?

持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。所有新生成的对象首先都是放在年轻代的,年老代中存放的都是一些生命周期较长的对象。

78、内存溢出和内存泄漏?

内存溢出:程序申请内存时,没有足够的内存,out of memory;

内存泄漏值垃圾对象无法回收,可以使用memory analyzer工具查看泄漏。

}

3.浏览器发起请求到页面展现有那几个步骤 4.linux部署项目出现过什么问题 5.怎么解决线程死锁

8.讲一下垃圾回收机制

1、Filter涉及了哪些设计模式

2、单例模式中的内部静态类为什么能够懒加载

4、线程单例;线程synchronized(静态和非静态有什么区别)

5、一个先递增后递减的数列,如何找到最大值?(使用二叉树,lgn/log2)

6、二叉树的非递归算法(不用栈)

9、找出数组中出现次数为1的数字(其他的出现偶数次)

5.除jquery用过什么网页脚本语言 6.在工作中有没有用过设计模式

7.在工作中有没有遇到过难题,怎么解决的 8.servlet同步异步

9.有没有用过远程调试页面 10.linux查看流量的指令

1、面向对象的四个特征:封装、继承、多态、抽象

继承:子类继承父类,除private修饰以外的所以方法和属性 多态:一个对象多种状态,可以把子类对象当作父类对象来看,一旦这样做了,就只能

去调用父类中原有定义的属性和方法,也就是子类中扩展的方法或属性就不能调用了。

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

4、匿名内部类是否可以作为父类被其他类继承,或做为接口被实现?

匿名内部类不被继承也不能被实现,因为它没有名字,而一个内部类只要有名字就可以作为父类被继承,也可以作为借口被实现。

5、多线程有几种实现方法,同步有几种实现方法,都是什么?

多线程有两种实现方法,分别继承继承Thread类与实现runnable借口。

String的长度是不可变的,而stringbuffer的长度是可变的。如果你对字符中的内容经常进行操作,特别是内容修改时,那么就要使用stringbuffer,如果最后需要使用string,那么使用stringbuffer的tostring()方法。

7、解析XML文件的几种方式和区别

DOM:处理大型文件时其性能下降的非常厉害

SAX:SAX是事件驱动型的XML解析方式,它是顺序读取XML文件,不需要一次性全部装载整个文件。

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

数组没有length()这个方法,有length这个属性

10、LinkedList、ArrayList和Vector的区别? ArrayList和Vector是采用数组方式存储数据,此数组元素总数大于实际存储的数据个数以便增加和插入元素,二者都允许直接序号索引元素,但是插入数据要移动数组元素等内存操作,所以它们索引数据快、插入数据慢。

LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!LinkedList双向链表,是指可以从first依次遍历至last(从头到尾),也可以从last遍历至first(从尾到头),但首尾没有构成环,不同于双向循环链表(注意区分):

都属于Map接口的类,实现了将惟一键映射到特定的值上。

HashMap类没有分类或者排序。它允许一个null键和多个null值。

12、Jsp有哪些内置对象,作用分别是什么?(至少能说出五个)

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

page表示从该页面产生的一个servlet实例

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

Overload:方法名相同,参数不同,与返回值无关

Override:方法名相同,参数相同,相同的返回值,建立在继承的基础之上

15、什么是单例模式,在程序中如何使用?

单例模式确保一个类只有一个实例 饿汉式单例类

IOC:控制反转,是一种设计模式,一层含义控制权的转移,由传统的在程序中控制依赖转移到由容器来控制,第二层是依赖注入将互相依赖的对象分离,在spring配置文件中描述它们的依赖关心,它们的依赖关系只是在使用的时候才建立

AOP:面向切面,是一种编程思想,oop的延续,将系统中非核心的业务提取出来,进行单独的处理,比如事务、日志和安全等

Spring的AOP和IOC都是为了解决系统代码耦合度过高的问题,使用代码重用性高,易于维护,不过AOP和IOC并不是spring中特有的,只是spring把它们应用的更灵活方便。

1>两者都是JAVA的数据库操作中间件。

2>两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。

3>两者都可以对数据库的更新操作进行显式的事务处理。

2>操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。3>数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。

19、struts中的标签库有几种,分别是?

有5种标签,分别是:bean标签库、html标签库、logic标签库、tiles标签库nested标签库

Error表示系统级的错误和程序不必处理的异常,Exception表示需要捕捉或者需要程序进行处理的异常。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

22、GC是什么?为什么要有GC?(基础)。

GC是垃圾收集器。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

要请求垃圾收集,可以调用下面的方法之一:

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方

27、MVC的各个部分都有那些技术来实现?如何实现?

MVC 是Model-View-Controller的简写。“Model” 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View” 是应用的表示面(由JSP页面产生),“Controller” 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

29、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数

30、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP 是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑

31、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 不能,一个对象的一个synchronized方法只能由一个线程访问。

32、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

北京千渡网讯科技有限公司博宝艺术网http://

北京千渡网讯科技有限公司博宝艺术网http://

9..抽象类和接口的区别

10.写一个方法,实现字符串的反转,如:输入abc,输出cba

12.下列哪些集合能够改变其容量大小,同时能够根据索引访问其元素,并且访问方法是非线形安全的?

13.下列关于泛型的说法,错误的是()

A、泛型是一种参数化类型

B、可以取代继承机制。

C、避免了运行时进行类型转换可能的潜在性错误

D、增强了程序的灵活性和安全性

题目:古典问题:有一对公母猪,从出生后第3个月起每个月都生一对猪,小猪长到第三个月后每个月又生一对猪,假如猪都不死,问每个月的猪总数为多少?

2.1 Java程序中的起始类名称必须与存放该类的文件名相同。()

2.2 原生类中的数据类型均可任意转换。()

会执行,在return前执行。

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会 释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

编写一条sql语句,希望从艺术家表artist_tab中,看到只有一个专长specialty的是哪些专长

1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面:1)抽象2)继承3)封装4)多态性

类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

5、int 和Integer 有什么区别? 答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的封装类就是Integer,从JDK 1.5开始引入了自动封箱/解封箱机制,使得二者可以相互转换。

Java 为每个原始类型提供了封装类:

7、在Java 中,如何跳出当前的多重嵌套循环?

答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。

9、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对象的引用是永远不会改变的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。

一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。

抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

11、静态变量和实例变量的区别?

答:静态变量也称为类变量,属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。

答:两个对象,一个是静态存储区的“xyx”,一个是用new创建在堆上的对象

13、接口是否可继承(extends)接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承具体类,但前提是具体类必须有明确的构造函数

答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)

15、Error 和Exception 有什么区别? 答:Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

Applet程序用户自定义的Applet子类中,一般需要重载父类的(D)方法来完成一些画图操作。

2、Java语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点?(B)

3、下列哪个类声明是正确的?(D)

4、在Java语言中,下列哪些语句关于内存回收的说明是正确的?(B)

A.程序员必须创建一个线程来释放内存;

B.内存回收程序负责释放无用内存

C.内存回收程序允许程序员直接释放内存

D.内存回收程序可以在指定的时间释放内存对象

5、字符串是Java已定义的类型,关于它的构造函数,下面说法不正确的是: B

6、下列说法中正确的是: C

A.导入包会影响程序的性能 B.包存储在类库中

C.包是类的容器D.上述说法都不对

7、哪个关键字可以对对象加互斥锁? B

D.static8、下列叙述中,错误的是: D

9、下列关于Java多线程并发控制机制的叙述中,错误的是:BC

A、Java中对共享数据操作的并发控制是采用加锁技术

C、共享数据的访问权限都必须定义为private

D、Java中没有提供检测与避免死锁的专门机制,但应用程序员可以采用某些策略防止死锁的发生

10、下列哪一个方法不是applet程序的组成部分:D

11、下列Applet类的方法中,在Applet的整个生命周期里至多只执行一次的是:A

12、启动一个线程所调用的方法是:C

Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为(B)。

二、填空题(每空格1分,共20分)

1、开发与运行Java程序需要经过的三个主要步骤为编辑源程序、编译生成字节码和解释运行字节码。

Applet源程序文件只定义有一个类,该类的类名MyApplet,则类MyApplet必须是Applet类的子类并且存储该源程序文件的文件名为MyApplet。

4、抽象(abstract)方法方法是一种仅有方法头,没有具体方法体和操作实现的方法,该方法必须在抽象类之中定义。最终(final)方法方法是不能被当前类的子类重新定义的方法。

5、在Java程序中,通过类的定义只能实现单重继承,但通过接口的定义可以实现多重继承关系。

}

1、return语句就是把执行结果返回到调用的地方,并把程序的控制权一起返回

程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return。

 

2、但是也并不意味着一个函数体中只能有一个return 语句,例如:

 

递归函数中没有return 的情况:

 

分析:else 中没有 return 就没有出口,这个程序是自己内部运行,程序没有返回值,

4、在交互模式下,return的结果会自动打印出来,而作为脚本单独运行时则需要print函数才能显示。

函数的return 语句只能返回一个值,可以是任何类型。

因此,我们可以“返回一个 tuple类型,来间接达到返回多个值 ”。


  

到此这篇关于python中return如何写的文章就介绍到这了,更多相关python中return一般怎么写内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

}

我要回帖

更多关于 if return语句 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信