牛客java专项练习知识点(二)

第一题:

对于外部类来说,只有两种修饰,public和默认(default),因为外部类放在包中,只有两种可能,包可见和包不可见。对于内部类来说,可以有所有的修饰,因为内部类放在外部类中,与成员变量的地位一致,所以有四种可能。

第二题:

byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6);被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。Java中的byte,short,char进行计算时都会提升为int类型。

第三题:

在这里插入图片描述

第四题:

int i = -5;i = ++(i++);System.out.println(i);这题编译错误在于这一句: i = ++(i++);++( ) 括号里面必须是一个变量,而 i ++ 是一个字面量。

第五题:

在这里插入图片描述

第六题:

线程调度分为协同式调度和抢占式调度,Java使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)。这就是平***立的原因第

七题:

1、创建泛型对象的时候,一定要指出类型变量T的具体类型。争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。 2、JVM如何理解泛型概念 —— 类型擦除。事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。 总结:泛型代码与JVM ① 虚拟机中没有泛型,只有普通类和方法。 ② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除) ③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。

第八题:

在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类 。1.成员内部类(1)该类像是外部类的一个成员,可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员);(2)成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员内部类中的成员。如果要访问外部类中的成员,需要以下形式访问:【外部类.this.成员变量 或 外部类.this.成员方法】;(3)在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问;(4)成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;(5)内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。如果成员内部类用private修饰,则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰。2.局部内部类(1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;(2)局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。3.匿名内部类(1)一般使用匿名内部类的方法来编写事件监听代码;(2)匿名内部类是不能有访问修饰符和static修饰符的;(3)匿名内部类是唯一一种没有构造器的类;(4)匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。4.内部静态类(1)静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似;(2)不能使用外部类的非static成员变量或者方法。

第九题:

强制类型转换的优先级高于+ - * / 首先,要注意是(short)10/10.22,而不是(short) (10/10.22),前者只是把10强转为short,又由于式子中存在浮点数,所以会对结果值进行一个自动类型的提升,浮点数默认为double,所以答案是double;后者是把计算完之后值强转short。

第十题:

A.vector是线程安全的ArrayList,在内存中占用连续的空间。初始时有一个初始大小,当数据条数大于这个初始大小后会重写分配一个更大的连续空间。如果Vector定义为保存Object则可以存放任意类型。B.try{}catch{}会增加额外的开销C.接口中声明的’变量’必须为public final static,所以为常量D.子类可以访问父类受保护的成员第

十一题:

在Web应用程序中,( Web容器 )负责将HTTP请求转换为HttpServletRequest对象第

十二题:

在这里插入图片描述

第十三题:

抛InterruptedException的代表方法有:java.lang.Object 类的 wait 方法java.lang.Thread 类的 sleep 方法java.lang.Thread 类的 join 方法第

十四题:

在这里插入图片描述

第十五题:

Java表达式转型规则由低到高转换:1、所有的byte,short,char型的值将被提升为int型;2、如果有一个操作数是long型,计算结果是long型;3、如果有一个操作数是float型,计算结果是float型;4、如果有一个操作数是double型,计算结果是double型;5、被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。--------------解析--------------语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型;语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变。

第十六题:

A,Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。B,CyclicBarrier 主要的方法就是一个:await()。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。C,直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。D,Counter不是并发编程的同步器第

十七题:

采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。

第十八题:

Set 不能有重复的元素,且是无序的,要有空值也就只能有一个。因为它不允许重复。 L ist 可以有重复元素,且是有序的,要有空值也可以有多个,因为它可重复第

十九题:

This调用语句必须是构造函数中的第一个可执行语句。this()才必须是构造函数中的第一个可执行语句,用this调用语句并不需要。

第二十题:

System是java.lang中的一个类,out是System内的一个成员变量,这个变量是一个java.io.PrintStream类的对象,println呢就是一个方法了。

第二十一题:

intValue()是把Integer对象类型变成int的基础数据类型;parseInt()是把String 变成int的基础数据类型;Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)

第二十二题:

解析:这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。 年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收永久代:存储的是final常量,static变量,常量池。

第二十三题:

编译看左边,运行看右边。 父类型引用指向子类型对象,无法调用只在子类型里定义的方法第

二十四题:

我们在执行URL u =new URL(“http://www.123.com”);这句话的时候确实要抛出异常,但是这个异常属于IOException,不管网址是否存在,最后都会返回该网址的一个连接,打印出来就是该网址。

第二十五题:

1,新生代:(1)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。(2)保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。2,老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。3,持久代:持久代如果满了,将触发Full GC。

第二十六题:

HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值前,会去判断当前Map中是否含有该key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。

第二十七题:

hashCode()方法和equals()方法的作用其实是一样的,在Java里都是用来对比两个对象是否相等一致。那么equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。那么hashCode()既然效率这么高为什么还要equals()呢? 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。所有对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

第二十八题:

System.out.println((-3)%2);System.out.println(4%3);System.out.println((-3)%(-2));System.out.println(4%(-3));-11-11取模运算,余数的符号跟被除数符号相同

第二十九题:

A,CopyOnWriteArrayList适用于写少读多的并发场景B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥, 读与读之间可以并发执行。在读多写少的情况下可以提高效率C,ConcurrentHashMap是同步的HashMap,读写都加锁D,volatile只保证多线程操作的可见性,不保证原子性

第三十题:

Servlet 与 CGI 的比较
和CGI程序一样,Servlet可以响应用户的指令(提交一个FORM等等),也可以象CGI程序一样,收集用户表单的信息并给予动态反馈(简单的注册信息录入和检查错误)。然而,Servlet的机制并不仅仅是这样简单的与用户表单进行交互。传统技术中,动态的网页建立和显示都是通过CGI来实现的,但是,有了Servlet,您可以大胆的放弃所有CGI(perl?php?甚至asp!),利用Servlet代替CGI,进行程序编写。 对比一:当用户浏览器发出一个Http/CGI的请求,或者说 调用一个CGI程序的时候,服务器端就要新启用一个进程 (而且是每次都要调用),调用CGI程序越多(特别是访问量高的时候),就要消耗系统越多的处理时间,只剩下越来越少的系统资源,对于用户来说,只能是漫长的等待服务器端的返回页面了,这对于电子商务激烈发展的今天来说,不能不说是一种技术上的遗憾。而Servlet充分发挥了服务器端的资源并高效的利用。每次调用Servlet时并不是新启用一个进程 ,而是在一个Web服务器的进程敏感词享和分离线程,而线程最大的好处在于可以共享一个数据源,使系统资源被有效利用。 对比二:传统的CGI程序,不具备平台无关性特征,系统环境发生变化,CGI程序就要瘫痪,而Servlet具备Java的平台无关性,在系统开发过程中保持了系统的可扩展性、高效性。 对比三:传统技术中,一般大都为二层的系统架构,即Web服务器+数据库服务器,导致网站访问量大的时候,无法克服CGI程序与数据库建立连接时速度慢的瓶颈,从而死机、数据库死锁现象频繁发生。而我们的Servlet有连接池的概念,它可以利用多线程的优点,在系统缓存中事先建立好若干与数据库的连接,到时候若想和数据库打交道可以随时跟系统"要"一个连接即可,反应速度可想而知。

第三十一题:

在这里插入图片描述

第三十二题:

A、标准ASCII只使用7个bit,扩展的ASCII使用8个bit。B、ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。不同 ANSI 编码之间互不兼容。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。C、ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符,即ASCII码D、ASCII码包含一些特殊空字符第

三十三题:

在这里插入图片描述

第三十四题:

在这里插入图片描述

USES-A:依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。关联关系:A类会用到B类,这是一种强依赖关系,是长期的并非偶然。在代码中的表现为:A类的成员变量中含有B类。HAS-A:聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟。IS-A:表示继承。父类与子类,这个就不解释了。要注意:还有一种关系:组合关系也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分的关系,但这种整体和部分是不可分割的。

第三十五题:

动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

第三十六题:

StringBuffer s = new StringBuffer(x); x为初始化容量长度s.append(“Y”); "Y"表示长度为y的字符串length始终返回当前长度即y;对于s.capacity():1.当y<x时,值为x以下情况,容器容量需要扩展2.当x<y<2x+2时,值为 2x+23.当y>2*x+2时,值为y

第三十七题:

Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的remove() 方法是个安全的做法。

第三十八题:

存根类是一个类,它实现了一个接口,它的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。但是一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无关方法。而如果通过继承存根类就实现接口,就免去了这种麻烦。RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当远程对象的客户端***,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端***对象stub来完成的。每个远程对象都包含一个***对象stub,当运行在本地Java虚拟机上的程序调用运行在远程Java虚拟机上的对象方法时,它首先在本地创建该对象的***对象stub, 然后调用***对象上匹配的方法。每一个远程对象同时也包含一个skeleton对象,skeleton运行在远程对象所在的虚拟机上,接受来自stub对象的调用。这种方式符合等到程序要运行时将目标文件动态进行链接的思想

第三十九题:

在J2EE中,使用Servlet过滤器,需要在web.xml中配置()元素,

第四十题:

suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态第

四十一题:

Float是类,float不是类.查看JDK源码就可以发现Byte,Character,Short,Integer,Long,Float,Double,Boolean都在java.lang包中.Float正确复制方式是Float f=1.0f,若不加f会被识别成double型,double无法向float隐式转换.Float a= new Float(1.0)是正确的赋值方法,但是在1.5及以上版本引入自动装箱拆箱后,会提示这是不必要的装箱的警告,通常直接使用Float f=1.0f.

第四十二题:

线程安全(Thread-safe)的集合对象:Vector 线程安全:HashTable 线程安全:StringBuffer 线程安全:非线程安全的集合对象:ArrayList :LinkedList:HashMap:HashSet:TreeMap:TreeSet:StringBulider:

第四十三题:

在这里插入图片描述

第四十四题:

十进制的小数转换为二进制小数,主要是利用小数部分乘2后,取整数部分,直至小数点后为0

第四十五题:

运行异常,可以通过java虚拟机来自行处理。非运行异常,我们应该捕获或者抛出

第四十六题:

int i = 0;i = i++ + i; 先执行i + 执行到一半,然后i++,此时i=1, 此时是0+1赋值于i第

四十七题:

在这里插入图片描述

第四十八题:

Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)

第四十九题:

变量名称 字节 位数byte 1 8short 2 16char 2 16int 4 32long 8 64float 4 32double 8 64boolean 1 8

第五十题:

如果int x=20, y=5,则语句System.out.println(x+y +""+(x+y)+y); 的输出结果是(25255)1)不论有什么运算,小括号的优先级都是最高的,先计算小括号中的运算,得到x+y +""+25+y2)任何字符与字符串相加都是字符串,但是是有顺序的,字符串前面的按原来的格式相加,字符串后面的都按字符串相加,得到25+“”+25+53)上面的结果按字符串相加得到25255

第五十一题:

在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。

第五十二题:

java的垃圾收集机制主要针对新生代和老年代的内存进行回收,不同的垃圾收集算法针对不同的区域。所以java的垃圾收集算法使用的是分代回收。一般java的对象首先进入新生代的Eden区域,当进行GC的时候会回收新生代的区域,新生代一般采用复制收集算法,将活着的对象复制到survivor区域中,如果survivor区域装在不下,就查看老年代是否有足够的空间装下新生代中的对象,如果能装下就装下,否则老年代就执行FULL GC回收自己,老年代还是装不下,就会抛出OUtOfMemory的异常

第五十三题:

ServletContext:getParameter()是获取POST/GET传递的参数值;getInitParameter获取Tomcat的server.xml中设置Context的初始化参数getAttribute()是获取对象容器中的数据值;getRequestDispatcher是请求转发。

第五十四题:

Java致力于检查程序在编译和运行时的错误。Java虚拟机实现了跨平台接口类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。注意,是避免数据覆盖的可能,而不是数据覆盖类型

第五十五题:

客户端通过new Socket()方法创建通信的Socket对象服务器端通过new ServerSocket()创建TCP连接对象 accept接纳客户端请求

第五十六题:

线程同步:喂,SHE喂(Vector)S(Stack)H(hashtable)E(enumeration)

第五十七题:

Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ).12 ,-11floor : 意为地板,指向下取整,返回不大于它的最大整数 ceil : 意为天花板,指向上取整,返回不小于它的最小整数 round : 意为大约,表示“四舍五入”,而四舍五入是往大数方向入。Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11而不是-12。

第五十八题:

public static void main (String[] args) { String classFile = “com.jd.”. replaceAll(".", “/”) + “MyClass.class”; System.out.println(classFile);}结果:///MyClass.class由于replaceAll方法的第一个参数是一个正则表达式,而".“在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成”/"。如果想替换的只是".",那么久要写成"\.".

第五十九题:

Java体系结构包括四个独立但相关的技术:Java程序设计语言Java.class文件格式Java应用编程接口(API)Java虚拟机我们再在看一下它们四者的关系: 当我们编写并运行一个Java程序时,就同时运用了这四种技术,用Java程序设计语言编写源代码,把它编译成Java.class文件格式,然后再在Java虚拟机中运行class文件。当程序运行的时候,它通过调用class文件实现了Java API的方法来满足程序的Java API调用

第六十题:

复制的效率System.arraycopy>clone>Arrays.copyOf>for循环,这个有兴趣自己测试一下就知道了。这里面在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。而Arrays.copyOf(注意是Arrays类,不是Array)的实现,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。前面几个说System.copyOf的不要看,System类底层根本没有这个方法,自己看看源码就全知道了

第六十一题:

t.join(); //使调用线程 t 在此之前执行完毕。t.join(1000); //等待 t 线程,等待时间是1000毫秒

第六十二题:

java的访问权限有public、protected、private和default的,default不能修饰变量普通变量不能用abstract修饰,abstract一般修饰方法和类被定义为abstract的类需要被子类继承,但是被修饰为final的类是不能被继承和改写的心存疑问可以实验一下,看是否能通过编译

第六十三题:

事务属性的种类: 传播行为、隔离级别、只读和事务超时 a) 传播行为定义了被调用方法的事务边界。 传播行为意义PROPERGATION_MANDATORY表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常PROPAGATION_NESTED表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样PROPAGATION_NEVER表示方法不能运行在一个事务中,否则抛出异常PROPAGATION_NOT_SUPPORTED表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起PROPAGATION_REQUIRED表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务PROPAGATION_REQUIRES_NEW表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起PROPAGATION_SUPPORTS表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中 b) 隔离级别在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:隔离级别意义ISOLATION_DEFAULT使用后端数据库默认的隔离级别ISOLATION_READ_UNCOMMITTED允许读取未提交的数据(对应未提交读),可能导致脏读、不可重复读、幻读ISOLATION_READ_COMMITTED允许在一个事务中读取另一个已经提交的事务中的数据(对应已提交读)。可以避免脏读,但是无法避免不可重复读和幻读ISOLATION_REPEATABLE_READ一个事务不可能更新由另一个事务修改但尚未提交(回滚)的数据(对应可重复读)。可以避免脏读和不可重复读,但无法避免幻读ISOLATION_SERIALIZABLE这种隔离级别是所有的事务都在一个执行队列中,依次顺序执行,而不是并行(对应可序列化)。可以避免脏读、不可重复读、幻读。但是这种隔离级别效率很低,因此,除非必须,否则不建议使用。 c) 只读如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。d) 事务超时如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。Spring的API设计很不错,基本上根据英文翻译就能知道作用:Required:必须的。说明必须要有事物,没有就新建事物。supports:支持。说明仅仅是支持事务,没有事务就非事务方式执行。mandatory:强制的。说明一定要有事务,没有事务就抛出异常。required_new:必须新建事物。如果当前存在事物就挂起。not_supported:不支持事物,如果存在事物就挂起。never:绝不有事务。如果存在事物就抛出异常

第六十四题:

1、jps:查看本机java进程信息。2、jstack:打印线程的栈信息,制作线程dump文件。3、jmap:打印内存映射,制作堆dump文件4、jstat:性能监控工具5、jhat:内存分析工具6、jconsole:简易的可视化控制台7、jvisualvm:功能强大的控制台

第六十五题:

通常一个类实现序列化方式是实现序列化接口 Serializable序列化的作用:把数据长久的保存在磁盘中,磁盘和内存是不同的,内存一般在程序运行时占用,数据保存周期短,随程序结束而结束,磁盘可以长久保存数据transient关键字的作用,在已实现序列化的类中,有的变量不需要保存在磁盘中,就要transient关键字修饰,如银行卡密码等,就这个作用------在已序列化的类中使变量不序列化

第六十六题:

A| |B C|DD属于B,D属于A,D属于D,D不属于Cinstanceof是判断前者是否可以类型可以转化为后者,可以转化即为true,分为向上转型和向下转型B D都是A的子类向下转型,

第六十七题:

ResultSet跟普通的数组不同,索引从1开始而不是从0开始

第六十八题:

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对象)

第六十九题:

java与C***很大的一点区别就是java是不需要使用者关注内存分配以及管理的

第七十题:

静态内部类不可以直接访问外围类的非静态数据,而非静态内部类可以直接访问外围类的数据,包括私有数据。
在这里插入图片描述

第七十一题:

三元运算符会对两个结果的数据类型,进行自动的类型提升。因此,可以把Object o1 = true ? new Integer(1) : new Double(2.0);看作Object o1 = true ? new Double(1.0) : new Double(2.0);

第七十二题:

main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。 前台线程和后台线程的区别和联系:1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。说明: 应用程序的主线程以及使用Thread构造的线程都默认为前台线程 使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序

第七十三题:

在这里插入图片描述

第七十四题:

synchronized关键字和volatile关键字比较:volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性。

第七十五题:

类加载器不加载接口

第七十六题:

1、抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。原因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以。锁应该归其子类所有。所以。抽象方法也就不能用synchronized关键字修饰了;native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢?2、接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。题考察修饰符,函数定义等,故从网上搜罗了下相关资料,总结如下: 类、方法、成员变量和局部变量的可用修饰符修饰符类成员访求构造方法成员变量局部变量abstract(抽象的)√√---static (静态的)-√-√-public(公共的)√√√√-protected(受保护的) √√√-private(私有的)-√√√-synchronized(同步的)-√---native(本地的)-√---transient(暂时的)---√-volatie(易失的)---√-final(不要改变的)√√-√√ 类 修饰符 Public可以从其他类中访问Abstract本类不能被实例化Final不能再声明子类构造函数修饰符 Public可以从所有的类中访问Protected只能从自己的类和它的子类中访问Private只能在本类中访问域/成员变量修饰符 Public可以从所有的类中访问Protected只能从本类和它的子类中访问Private只能从本类中访问它Static对该类的所有实例只能有一个域值存在transient不是一个对象持久状态的一部份Volatile可以被异步的线程所修改final必须对它赋予初值并且不能修改它局部变量 修饰符 final必须对它赋予初值并且不能修改它方法修饰符 Public可以从所有的类中访问它Protected只能从本类及其子类中访问它Private只能从本类中访问它abstract没有方法体,属于一个抽象类final子类不能覆盖它static被绑定于类本身而不是类的实例native该方法由其他编程语言实现asnchronized在一个线程调用它之前必须先给它加类的修饰符整合一.类类的修饰符:Public:可以在其他任何类中使用,默认为统一包下的任意类。Abstract:抽象类,不能被实例化,可以包含抽象方法,抽象方法没有被实现,无具体功能,只能衍生子类。Final:不能被继承。二.变量变量修饰符:一个类的成员变量的声明必须在类体中,而不能在方法中,方法中声明的是局部变量。1. 可访问修饰符:2. static:类变量:一个类所拥有的变量,不是类的每个实例有的变量。类变量是指不管类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量,因此可以通过类本身或者某个对象来访问类变量。3. final:常量。4. volatile:声明一个可能同时被并存运行的几个线程所控制和修改的变量。实例变量:和类变量对应,即每个对象都拥有各自独立的实例变量。三.方法:(和变量对象分为实例方法和类方法,并用有无static修饰区别)类方法:使用static关键字说明的方法1.第一次调用含类方法的类是,系统只为该类创建一个版本,这个版本被该类和该类的所有实例共享。2.类方法只能操作类变量,不能访问实例变量。类方法可以在类中被调用,不必创建实例来调用,当然也可以通过对象来调用。实例方法:实例方法可以对当前对象的实例变量操作,而且可以访问类变量。方法可以重载,要求:方法名相同,但是参数必须有区别。(参数不同可以使类型不同,顺序不同,个数不同)方法的返回类型:若无返回类型,则声明为void.方法中的变量作用域:1. 成员变量:整个类。2. 局部变量:定义起到方法块结束为止。3. 方法参数:整个方法或者构造方法。4. 异常处理参数:参数传递给异常处理方法。构造方法:和类同名的方法。为新建对象开辟内存空间后,用于初始化新建的对象。不能用对象显式的调用。静态初始化器:格式:static{<赋值语句组>}静态初始化器与构造方法的区别: 静态初始化器构造方法对类的静态域初始化对新建的对象初始化类进入内存后,系统调用执行执行new后自动执行属特殊语句(仅执行一次)属特殊方法方法的修饰符:抽象方法:用abstract修饰,只有声明部分,方法体为空,具体在子类中完成。类方法:静态方法,用static修饰,1. 调用时,使用类名作为前缀,而不是类的某个实例对象名2. 不能被单独对象拥有,属于整个类共享。3. 不能处理成员变量。最终方法:用final修饰,不能被子类重新定义的方法。本地方法:用native修饰的方法,表示用其他语言书写的特殊方法,包括C,C++,FORTRAN,汇编语言等。四.类成员的访问控制符:即类的方法和成员变量的访问控制符,一个类作为整体对象不可见,并不代表他的所有域和方法也对程序其他部分不可见,需要有他们的访问修饰符判断。权限如下: 访问修饰符同一个类同包不同包,子类不同包,非子类private√ protected√√√ public√√√√默认√√ 发表于 2017-10-27 15:27:56

第七十七题:

在这里插入图片描述

第七十八题:

创建Servlet的实例是由Servlet容器来完成的,且创建Servlet实例是在初始化方法init()之前Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet(2)创建:通过调用servlet构造函数创建一个servlet对象(3)初始化:调用init方法初始化(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求(5)卸载:调用destroy方法让servlet自己释放其占用的资源

第七十九题:

final类型的变量一定要初始化,因为final的变量不可更改。

第八十题:

元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配\n。“\n”匹配换行符。序列“\”匹配“\”而“(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,也匹配“\n”或“\r”之后的位置。 匹 配 输 入 字 符 串 的 结 束 位 置 。 如 果 设 置 了 R e g E x p 对 象 的 M u l t i l i n e 属 性 , 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性, RegExpMultiline也匹配“\n”或“\r”之前的位置。匹配前面的子表达式任意次。例如,zo能匹配“z”,也能匹配“zo”以及“zoo”。等价于o{0,}+匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。{n}n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。{n,}n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o”。{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+”将尽可能多的匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少的匹配“o”,得到结果 [‘o’, ‘o’, ‘o’, ‘o’].点匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。(?:pattern)非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。(?=pattern)非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。(?<=pattern)非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。(?<!pattern)非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。这个地方不正确,有问题此处用或任意一项都不能超过2位,如“(?<!95|98|NT|20)Windows正确,“(?<!95|980|NT|20)Windows 报错,若是单独使用则无限制,如(?<!2000)Windows 正确匹配x|y匹配x或y。例如,“z|food”能匹配“z”或“food”(此处请谨慎)。“[zf]ood”则匹配“zood”或“food”。[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。[xyz]负值字符集合。匹配未包含的任意字符。例如,“[abc]”可以匹配“plain”中的“plin”。[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.[a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。\b匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。\d匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持\D匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持\f匹配一个换页符。等价于\x0c和\cL。\n匹配一个换行符。等价于\x0a和\cJ。\r匹配一个回车符。等价于\x0d和\cM。\s匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。\S匹配任何可见字符。等价于[^ \f\n\r\t\v]。\t匹配一个制表符。等价于\x09和\cI。\v匹配一个垂直制表符。等价于\x0b和\cK。\w匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集。\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

八十一:

枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成对应的实体类型,上例中AccountType变成了个class AccountType,并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数,如上例子中:1private AccountType(){ System.out.println(“It is a account type”); }会变成:12private AccountType(String s, int i){ super(s,i); System.out.println(“It is a account type”); }而在这个类中,会添加若干字段来代表具体的枚举类型:123public static final AccountType SAVING;public static final AccountType FIXED;public static final AccountType CURRENT;而且还会添加一段static代码段:123456static{ SAVING = new AccountType(“SAVING”, 0); … CURRENT = new AccountType(“CURRENT”, 0); KaTeX parse error: Expected 'EOF', got '}' at position 65: …, CURRENT } }̲以此来初始化枚举中的每个具体类…VALUE数组中,以便用序号访问具体类型)在初始化过程中new AccountType构造函数被调用了三次,所以Enum中定义的构造函数中的打印代码被执行了3遍。

八十二:

在这里插入图片描述

  1. 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 Checked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.2. 绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除…3. 而声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。

八十三:

/** * String split 这个方法默认返回一个数组, * 如果没有找到分隔符, * 会把整个字符串当成一个长度为1的字符串数组 * 返回到结果, 所以此处结果就是1 */ private static void testSpringSpilte(){ String str = “12,3”; String str2 = “123”; System.out.print(str.split(",").length); System.out.print(str2.split(",").length); }}结果 2 1

八十四:

ThreadLocalMap中使用开放地址法来处理散列冲突,而HashMap中使用的是分离链表法。之所以采用不同的方式主要是因为:在ThreadLocalMap中的散列值分散得十分均匀,很少会出现冲突。并且ThreadLocalMap经常需要清除无用的对象,使用纯数组更加方便。

八十五:

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效率最高。

八十六:

ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制.

八十七:

HttpSessionAttributeListener:可以实现此侦听器接口获取此web应用程序中会话属性列表更改的通知;HttpSessionBindingListener:当该对象从一个会话中被绑定或者解绑时通知该对象,这个对象由HttpSessionBindingEvent对象通知。这可能是servlet程序显式地从会话中解绑定属性的结果,可能是由于会话无效,也可能是由于会话超时;HttpSessionObjectListener:没有该接口API;HttpSessionListener:当web应用程序中的活动会话列表发生更改时通知该接口的实现类,为了接收该通知事件,必须在web应用程序的部署描述符中配置实现类;HttpSessionActivationListener:绑定到会话的对象可以侦听容器事件,通知它们会话将被钝化,会话将被激活。需要一个在虚拟机之间迁移会话或持久会话的容器来通知所有绑定到实现该接口会话的属性。

八十八:

混合赋值运算符的使用<<表示左移位>>表示带符号右移位>>>表示无符号右移但是没有<<<运算符

八十九:

Integer i=100;//没有问题Integer i2=100.0;//报红杠,因为默认是doubleInteger i3=(byte)100;//报红杠 Short s = (byte) 100;//没有问题,是不是很神奇?说明上面的规律对Short不适用 Double d=100; //报红杠Double d=100.0;//没有问题Double d=100.0f;//报红杠 double d=100;//没有问题,100是int类型,自动转换为double.Double d=Double.valueOf(“100”); //正确Double d=Double.valueOf(100);//正确Double d=new Double(100);//正确

九十:

在这里插入图片描述

九十一:

jar 将许多文件组合成一个jar文件javac 编译javadoc 它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。javah 把java代码声明的JNI方法转化成C\C++头文件。 JNI可参考java核心技术卷二第12章

九十二:

File类是 文件和目录路径名的抽象表示形式。

九十三:

接口是一种特殊的抽象类,先说明抽象类中的抽象方法,再说明接口抽象类中的抽象方法(其前有 abstract1修饰)不能用 private、 static、 synchronized、native访回修饰符修饰。原因如下:1. private抽象方法没有方法体,是用来被继承的,所以不能用 private修饰;2.staticstatic修饰的方法可以通过类名来访间该方法(即该方法的方法体),抽象方法用sttic修饰没有意义;3. synchronized该关键字是为该方法加一个锁。而如果该关键字修饰的方法是 static方法。则使用的锁就是class变量的锁。如果是修饰类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以,锁应该归其子类所有。所以,抽象方法也就不能用 synchronized关键字修饰了;3. nativenative这个东西本身就和 abstract冲突,他们都是方法的声明,只是一个把方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢终于说到了接口!接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的 abstract可以省略),所以抽象类中的抽象方法不能用的访间修饰符这里也不能用。同时额外说明一下protect关键词4. protectprotected访同修饰符也不能使用,因为接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

九十四

首先要知道toLowerCase()的底层实现是return new String(result, 0, len + resultOffset);

九十五:

java.util.*,只能读取其目录下的类,不能读取其子目录下的类。因为其根目录和子目录下可能有同名类,若都能读取,则会混淆。

九十六:

wait()、notify()和notifyAll()是 Object类 中的方法从这三个方法的文字描述可以知道以下几点信息:1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;有朋友可能会有疑问:为何这三个不是Thread类声明中的方法,而是Object类中声明的方法(当然由于Thread类继承了Object类,所以Thread也可以调用者三个方法)?其实这个问题很简单,由于每个对象都拥有monitor(即锁),所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作了。而不是用当前线程来操作,因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。上面已经提到,如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor,然后进入等待状态,等待后续再次获得此对象的锁(Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁);notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。同样地,调用某个对象的notify()方法,当前线程也必须拥有这个对象的monitor,因此调用notify()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。Condition是个接口,基本的方法就是await()和signal()方法;Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用Conditon中的await()对应Object的wait(); Condition中的signal()对应Object的notify(); Condition中的signalAll()对应Object的notifyAll()

九十七:

Math.cos为计算弧度的余弦值,Math.toRadians函数讲角度转换为弧度

九十八:

关于抽象类JDK 1.8以前,抽象类的方法默认访问权限为protectedJDK 1.8时,抽象类的方法默认访问权限变为default关于接口JDK 1.8以前,接口中的方法必须是public的JDK 1.8时,接口中的方法可以是public的,也可以是default的JDK 1.9时,接口中的方法可以是private的

九十九:

子类构造方法在调用时必须先调用父类的,由于父类没有无参构造,必须在子类中显式调用,修改子类构造方法如下即可:public Derived(String s){ super(“s”); System.out.print(“D”); }

知识点三:http://47.99.117.17/blog/#/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值