-
Java用监视器机制实现了线程之间的同步执行。
-
byte b = (byte)129
的值是-127,因为byte的存储数字范围为[-128,127],在计算机中,数值用补码表示,相当于一个环,因此是-127。 -
一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。错误,因为忽略了在类和接口里面还可以定义内部类和匿名内部类。
-
String str = ""; System.out.print(str.split(",").length); //输出结果是1,因为String split这个方法默认返回一个数组,如果没有找到分隔符,会把整个字符串当成一个长度为1的字符串数组返回到结果,所以此处结果就是1。
-
Java7特性中,abstract class和interface的区别:抽象类可以有构造方法,接口中不能有构造方法;抽象类中可以有普通成员变量,接口中没有普通成员变量;一个类可以实现多个接口,但只能继承一个抽象类。
-
int i=0; Integer j = new Integer(0); System.out.println(i==j); System.out.println(j.equals(i)); //在jdk1.5之后,输出结果为true和true,原因是自动装箱机制,equals方法首先判断类型是否一致,再判断值是否相同。
-
<<<=
不是赋值符号,>>>=
无符号右移赋值。 -
protected访问权限大于包(default)访问权限。
-
public static void main(String args[]) { Thread t=new Thread(){ public void run(){ dianping(); } }; t.start(); System.out.print("dazhong"); } static void dianping(){ System.out.print("dianping"); }
如果线程调用了run()方法,此时仍是只有main一个线程,程序就只能顺序执行;开启线程是调用start()方法,这样才能并发执行。
-
java命名规则:名称只能由字母、数字、下划线、$符号组成;不能以数字开头;名称不能使用JAVA中的关键字。
-
Java取余操作,负数间取余先忽略符号。再根据被取余数符号决定结果的符号,
-
基本数据类型都是值传递;类,数组,接口是引用传递;由于String对象本身的特殊性,导致它值传递的特征。
-
public class Test { public static void main(String args[]) { String s = "祝你考出好成绩!"; System.out.println(s.length()); } } 的输出是8,因为java的String底层是char数组,它的length()返回数组大小,而unicode中一个汉字是可以用一个char表示的
-
static可以用来修饰内部类,但是不可以用来修饰外部类。static修饰符总的来说有四种作用:修饰字段或方法、修饰代码块、静态导入包、构造静态内部类。
-
JDK提供的用于并发编程的同步器有:Semaphore、CyclicBarric、CountDownLatch。
-
intValue()是把Integer对象类型变成int的基础数据类型; parseInt()是把String变成int的基础数据类型;Valueof()是把String转化成Integer对象类型。
-
局部内部类是放在代码块或方法中的,不能有访问控制修饰符,且不能用static修饰。
-
Integer的范围是-128~127,如果超出范围的话会新建一个对象,否则就是使用内存中的那个对象。
-
String str="abc",执行这句话时,会先去“字符数据池”搜索时候有“abc”这个字符串,如果有,则将字符串的首地址赋值给str,如果没有,生成一个新的字符串“abc”并且将首地址赋值给str,且存放与”字符数据池“中。String str=new String("abc"),执行这句话时,不会考虑时候已经存在了“abc”这个字符串,而是直接生成一个新的字符串“abc”并将首地址赋值给str,注意“abc”并不放在“字符数据池”中。java字符串池和字符串堆内存分配
-
在异常处理中国:finally代码块在return中间执行。return的值会被放入临时空间,然后执行finally代码块,如果finally中有return,会刷新临时空间的值,方法结束返回临时空间值。
-
一个抽象类并不需要其中所有的方法都是抽象的。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。而父类没有无参的构造函数,所以子类需要在自己的构造函数中显示的调用父类的构造函数。
-
局部变量没有默认值。
-
String s1 = "coder"; String s2 = "coder"; String s3 = "coder" + s2; String s4 = "coder" + "coder"; String s5 = s1 + s2; System.out.println(s3 == s4); System.out.println(s3 == s5); System.out.println(s4 == "codercoder"); 输出结果是false;false;true
- jre判断程序是否执行结束的标准是所有的前台线程执行完毕。
- interface中的方法默认为public abstract 的 ,变量默认为public static final。
- 泛型只在编译的时候保证数据类型的正确性,和运行期间的性能无关。
- java运行时内存分为“线程共享”和“线程私有”两部分,私有:java虚拟机栈,程序计数器,本地方法栈;共享:java堆,方法区。
- Switch判断支持byte、short、int、char和String。
-
class Car extends Vehicle { public static void main (String[] args) { new Car(). run(); } private final void run() { System. out. println ("Car"); } } class Vehicle { private final void run() { System. out. println("Vehicle"); } }
final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。
-
public void test() { int a = 10; System.out.println(a++ + a--); } //a++ + a--等价于下面的代码 int b = a++;//b=10,a=11 int c = a--;//c=11,a=10 System.out.println(b+c);//10+11=21
-
Integer i01=59; int i02=59; Integer i03=Integer.valueOf(59); Integer i04=new Integer(59); 以下输出结果是: (i01==i02);//True,当包装类与基本数据类型对比时,包装类会自动拆箱变为基本类型再进行比较 (i01==i03);//True,包装数据类直接赋值,默认调用其对用的valueOf()方法,在-128~127范围内会查找是否已存在 (i03==i04);//false,包装类是基础数据类型的引用类型,i04的定义使用了new关键字,这会开辟出一块新内存来放置值为59的Integer对象。 (i02==i04);//True,当包装类与基本数据类型对比时,包装类会自动拆箱变为基本类型再进行比较
-
接口的抽象方法默认是public的,因此实现该接口的类的实现方法也需要是public的。
-
强引用不回收,软引用内存不足时回收,弱引用JVMGC时回收,虚引用随时会被回收。
-
导包只可以导到当前层,不可以再导入包里面的包中的类。
-
final类型的变量一定要初始化,因为final的变量不可更改。
-
一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存。
-
在接口里面的变量默认都是public static final的,它们是公共的,静态的,最终的常量。相当于全局常量,可以直接省略修饰符。 实现类可以直接访问接口中的变量。
-
属于JVM规范的内存区域:方法区、程序计数器、虚拟机栈。
-
JDK8之前,HashMap的数据结构是数组+链表,JDK8及之后是数组+链表/红黑树。
-
JDK5之后提供的自动拆箱和自动装箱实现了将基本数据类型存入collection类型的集合。
-
JAVA的赋值运算是有返回值的,赋了什么值,就返回什么值。
-
可以把任何一种数据类型的变量赋给Object类型的变量。
-
Java数据库连接库JDBC用到的设计模式是桥接模式。
-
boolean类型不能和任何类型进行转换,会报出类型异常错误。
-
JDK8中,接口中的方法可以被default和static修饰,但是数据被修饰的方法必须有方法体。
-
public static void main(String args[]) { System.out.println(14^3); } 的输出是13,^在java中是异或的意思,14是1110,3是0011,所以14^3=1101,即13
-
System是java.lang中的类,out为System中的一个静态成员,out是java.io.PrintStream类的对象,而println()是java.io.PrintStream类的方法,所有可以调用类.静态方法.println()方法。
-
public class MyClass { long var; public void MyClass(long param) { var = param; }//(1) public static void main(String[] args) { MyClass a, b; a =new MyClass();//(2) b =new MyClass(5);//(3) } } 编译错误将在(3)处发生,因为该类没有接受一个int类型的参数的构造函数。 这个MyClass()方法并不是构造方法,因为它有void返回值类型。
-
static修饰的成员属于类成员,父类字段或方法只能被子类同名字段或方法遮蔽,不能被继承覆盖。
-
ResultSet中记录行的第一列索引为1。
-
public class Demo{ public static void main(String args[]){ int count = 0; int num = 0; for(int i = 0;i <= 100;i++){ num = num + i; count = count++; } System.out.println("num*count="+(num*count)); } } 的输出结果是0,因为count = count ++;这个先将count这个值0暂存起来,然后count自加1变成1,最后将暂存的值赋值给count,count最终的值为0。
-
JAVA反射机制主要提供的功能有:在运行时判断一个对象所属的类;在运行时构造一个类的对象;在运行时判断一个类所具有的成员变量和方法;在运行时调用一个对象的方法。
-
public class Test { static String x="1"; static int y=1; public static void main(String args[]) { static int z=2;//(1) System.out.println(x+y+z); } } 程序会在(1)处出现编译错误,因为被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量
-
数组复制方法中,复制的效率System.arraycopy>clone>Arrays.copyOf>for循环。
-
byte b1=1,b2=2,b3,b6,b8; final byte b4=4,b5=6,b7; b3=(b1+b2); /*语句1*/(b1 + b2) 被转换为int类型 但是 b3仍为 byte ,所以出错要么将b3转化为int 要么将(b1 + b2) 强制转换为byte类型。所以语句1错误。 b6=b4+b5; /*语句2*/ b4 、b5被声明final 所以类型是不会转换, 计算结果仍然是byte ,所以 语句2正确。 b8=(b1+b4); /*语句3*/ (b1 + b4) 结果仍然转换成int 所以语句 3 错误。 b7=(b2+b5); /*语句4*/ (b2 + b5) 结果仍然转换为int , 所以语句4错误。 System.out.println(b3+b6); 存在编译错误的语句是语句1、3、4,操作数为时byte、short、int 、char,两个数都会被转换成int类型,并且结果也是int类型。
-
threadlocalmap使用开放定址法解决haah冲突,hashmap使用链地址法解决hash冲突。
-
Object类拥有的方法:Object()、registerNatives()、getClass()、hashCode()、equals()、clone()、toString()、notify()、notifyAll()、wait()、finalize()。
-
+=会自动强转(自动装箱功能),但是+必须要手动强转b=(byte)(a+b)。
-
构造函数不能被继承,只能被显式或隐式的调用。
-
package NowCoder; class Test { public static void hello() { System.out.println("hello"); } } public class MyApplication { public static void main(String[] args) { // TODO Auto-generated method stub Test test=null; test.hello(); } } 能编译通过并正确运行,因为静态方法属于静态绑定,编译器根据引用类型所属的静态类型为它绑定其对应的方法。此语句会翻译成invokestatic,该指令的调用中不会涉及this,所以不会依赖对象
-
内部类(也叫成员内部类)可以有4种访问权限。
-
Collection是java.util下的接口,它是各种集合结构的父接口;Collections是java.util下的类,它包含有各种有关集合操作的静态方法。
-
子类能继承父类的所有成员,只是私有部用来访问父类被隐藏的非私有成员变量分不能调用。
-
关键字super的作用是:用来访问父类被隐藏的非私有成员变量;用来调用父类中被重写的方法;用来调用父类的构造函数。
-
volatile关键字不保证对变量操作的原子性。
-
float f=1.1
是错误的写法,在JAVA中,小数默认是double类型的,如果想表达是float类型的,需要在数字末尾加上f标识。 -
动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
-
this不能在static的方法中使用。
-
2.public class NameList { private List names = new ArrayList(); public synchronized void add(String name) { names.add(name); } public synchronized void printAll() { for (int i = 0; i < names.size(); i++) { System.out.print(names.get(i) + ""); } } public static void main(String[]args) { final NameList sl = new NameList(); for (int i = 0; i < 2; i++) { new Thread() { public void run() { sl.add("A"); sl.add("B"); sl.add("C"); sl.printAll(); } } .start(); } } } 在每个线程中都是顺序执行的,所以sl.printAll();必须在前三句执行之后执行,也就是输出的内容必有(连续或非连续的)ABC。 而线程之间是穿插执行的,所以一个线程执行 sl.printAll();之前可能有另一个线程执行了前三句的前几句。 E答案相当于线程1顺序执行完然后线程2顺序执行完。输出"A B C A B C A B C " G答案则是线程1执行完前三句add之后线程2插一脚执行了一句add然后线程1再执行 sl.printAll();输出ABCA。接着线程2顺序执行完输出ABCABC,输出加起来即为ABCAABCABC。
-
堆区:只存放类对象,线程共享;方法区:又叫静态存储区,存放class文件和静态数据,线程共享;栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享。
-
public class ZeroTest { public static void main(String[] args) { try{ int i = 100 / 0; System.out.print(i); }catch(Exception e){ System.out.print(1); throw new RuntimeException(); }finally{ System.out.print(2); } System.out.print(3); } } 输出为12,即使在catch语句中抛出RuntimeException,但仍会执行finally块中的语句
-
public static void main (String[] args) { String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class"; System.out.println(classFile); }的输出结果不是com/jd/MyClass.class,而是///////MyClass.class,因为replaceAll()函数的第一个参数是一个正则表达式,而"."在正则表达式中代表了全部的字符,因此"com.jd."会全部被替换成"/"。 之后字符串正常拼接,输出"///////MyClass.class",答案选择C。如想仅仅替换".",就需要使用转义字符"\\."
-
Object是引用数据类型,只声明而不创建实例,只会在栈内存中开辟空间,默认为空,空占1bit。
-
如果希望监听TCP端口9000,服务器端应该使用
new ServerSocket(9000);
创建socket。 -
虚拟机是运行在操作系统之上的,不与硬件交互。
-
通过HttpServletRequest. getParameter获取的参数由服务器所在的操作系统决定编码。
-
String s = new String("xyz");
可能会创建一个或两个StringObject,因为 用new关键字创建字符串对象时,JVM会先检查字符串常量池中时候有存在的对应字符串,如果已经存在,则不会在字符串常量池中创建,如果没有存在,那么就会在字符串常量池中创建一个字符串对象,然后还会去堆内存中创建一份字符串对象,把常量池中的对象内容拷贝到内存中的字符串对象,然后返回堆内存中的字符串对象内存地址。 -
run()方法的执行结束会导致线程销毁。
-
public class Test{ static{ int x=5; } static int x,y; public static void main(String args[]){ x--; myMethod( ); System.out.println(x+y+ ++x); } public static void myMethod( ){ y=x++ + ++x; } } 输出结果是3。其中静态代码块中的x为局部变量,不影响静态变量x的值。
-
JAVA的基本编程单元是类,基本存储单元是变量。
-
public class Test { public int aMethod(){ static int i = 0; i++; return i; } public static void main(String args[]){ Test test = new Test(); test.aMethod(); int j = test.aMethod(); System.out.println(j); } } 这段代码将会编译失败,JAVA中静态变量只能在类主体定义,不能在方法中定义。
-
final 定义的变量,可以在不是必须要在定义的同时完成初始化,也可以在构造方法中完成初始化。
-
子类不可以继承父类的构造方法,只可以调用父类的构造方法。
-
类中静态语句块仅在类加载时被执行一次。
-
不会初始化子类的几种类型:调用的是父类的static方法或者字段、调用的是父类的final方法或字段、通过数组来引用:
Person[] person = new Person[]
。 -
关于抽象类:JDK 1.8以前,抽象类的方法默认访问权限为protected;JDK 1.8时,抽象类的方法默认访问权限变为default。关于接口:JDK 1.8以前,接口中的方法必须是public的;JDK 1.8时,接口中的方法可以是public的,也可以是default的;JDK 1.9时,接口中的方法可以是private的。
-
静态内部类不可以直接访问外围类的非静态数据,而非静态内部类可以直接访问外围类的数据,包括私有数据。
-
long型转float型无须强制转换,浮点数在内存中的32位不是简单地转换为十进制,而是通过公式来计算而来,通过这个公式虽然,只有4个字节,但浮点数最大值要比长整型的范围要大。
-
编译看左边,运行看右边。意思编译时候,看左边有没有该方法,运行的时候结果看 new 的对象是谁,就调用的谁。
-
instanceof运算符能够用来判断一个对象是否为:一个类的实例、一个实现指定接口的类的实例、一个子类的实例。
-
join()底层就是调用wait()方法的,wait()释放锁资源,故join也释放锁资源。
-
join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。
-
针对循环优化的方法:强度削弱、删除归纳变量和代码外提。
-
抽象类和接口都不能被实例化。接口没有构造方法,所以不能实例化,抽象类有构造方法,但是不是用来实例化的,是用来初始化的。
-
抽象类可以定义普通成员变量而接口不可以,但是抽象类和接口都可以定义静态成员变量,只是接口的静态成员变量要用static final public 来修饰。
-
public class Arraytest{ int a[] = new int[6]; public static void main ( String arg[] ) { System.out.println ( a[0] ); } } 这段代码将会编译出错,因为main是Static方法, 在static方法中是不能访问非静态变量 a 的,需要将 a 声明为static,答案才会是 0 ,否则是编译出错
-
Math.cos为计算弧度的余弦值,Math.toRadians函数讲角度转换为弧度。
-
类之间存在这些常见的关系:“USES-A”关系、“HAS-A"关系和”IS-A“关系。