1、java的访问权限有public、protected、private和default的,default不能修饰变量
2、线程安全概念:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
LinkedList 和 ArrayList 都是不同步的,线程不安全;
Vector 和 Stack 都是同步的,线程安全;
Set是线程不安全的;
Hashtable的方法是同步的,线程安全;
HashMap的方法不是同步的,线程不安全;
3、基本类型和包装类是两回事,不是同一个概念。包装类像普通的类一样,封装了一系列的方法
4、方法可以和类名同名,但是构造函数只要和class类名相同就好了
构造器只有在new的时候才能调用,哪怕你在类中使用this(),它也得等new对象的时候才能调用到
5、方法执行完毕后,局部变量就会释放内存,作用域范围外就没有作用了;而方法进行的对堆内存的改变依旧保存
6、效率比较String<StringBuffer<StringBuilder,但是在 String S1 = “This is only a” + “ simple” + “ test”时,String效率最高。
7、StringBuffer每次做操作都是对对象本身的操作
8、private是私有变量,只能用于当前类中,题目中的main方法也位于当前类,所以可以正确输出
9、ArrayList的构造函数总共有三个:
(1)ArrayList()构造一个初始容量为 10 的空列表。
(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
调用的是第三个构造函数,直接初始化为大小为20的list,没有扩容
10、静态方法中不能访问非静态变量或者方法啊,任何时刻都是如此,没有例外
11、LinkedList是实现了List接口,并非是继承
12、接口中不能声明变量,声明的是常量
13、if(flag = true),这是并不是判断flag是否等于true了,而是把true的值赋值给了flag
14、main()函数是一个前台进程,前台进程是程序中必须执行完的,而后台线程则是在java中所有前台结束后结束的,不管有没有完成,后台线程主要用于内存分配等方面。
15、创建对象的时候,如果有代码块,那么一定会执行代码块;类的加载我觉得大概率就是从上向下依次加载吧
16、我是真的懵,protected访问控制是当前包和其子类,而缺省default是当前包
17、Instanceof在进行比较的时候,会使用对象实际的类型,如果是ArrayList.get到的,尽管是Object,但是其实是根据往里存的时候的类型所比较的
18、this这个关键字不可以在静态方法中使用
19、一个子类继承父类时,会先加载静态代码块,然后是父类的代码块,父类的构造器,接着是子类的代码块,子类的构造器;
20、native关键字修饰的方法是原生态方法,具体的实现可能使用C语言、C++来实现的,所以此类的方法效率都很高
21、关于ClassLoader
22、volatile关键字
当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。
23、Thead不是抽象类,可以重写run方法,所以一个子类继承父类的话,可以不重写run方法,而子类如果直接调用run的时候,调用的是子类的方法
24、能被java.exe运行的方法一定有main方法,main方法是程序的入口,想起来原来报错提示没有main方法了
25、字符串在赋值的时候,如果赋的值都是已知的常量的话,字符串就会存到常量池中;而只要存在变量的话,编译器就无法判断,所以就会存放在堆中;因为变量只有在运行的时候才知道他的值;而常量的话在编译的时候就知道了;final修饰的也是在运行时才知道赋值结果的,所以final修饰的也不可以
26、构造方法只能通过new来调用,或者通过this使用,不可以直接使用
27、synchronized很强大,既可以保证可见性,又可以保证原子性,而volatile不能保证原子性!
泛型指定的元素不具有继承的特性。不能将泛型中的派生类类型复制给基类类型。
泛型通配符
?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E:向下限定,E及其子类
? super E:向上限定,E及其父类
28、Abstract类中不应该有private的成员,但是可以有;但是 如果有的话违背了设计的原则,所以不应该有
29、Throwable是可抛出的意思,Exception是异常;Error是错误;所有的异常都是直接继承自Exception的;
30、新线程被创建之后不会自动执行,需要使用start方法才可以启动
31、泛型仅仅是java的一颗语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的。
32、Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)
33、内部类可以public修饰,所以一个类中可以有多个public class
34、//通过移位计算2的次方
return 1<<(number-1);
35、java中true ,false , null在java中不是关键字,也不是保留字,它们只是显式常量值,但是你在程序中不能使用它们作为标识符。
其中const和goto是java的保留字。java中所有的关键字都是小写的,还有要注意true,false,null, friendly,sizeof不是java的关键字,但是你不能把它们作为java标识符用。
36、if(str==null||str.trim().equals(""))return str; 在对字符串进行处理的时候,这一句话很重要,肯定会经常用到的
37、在文件夹复制时,父目录不能直接复制到子目录
if(dest.getAbsolutePath().contains(src.getAbsolutePath())) 如果子目录中的路径含有父目录的话,很明显就不可以了
File newFile =new File(dest,src.getName());
文件创建时,可以传两个参数 ,第一个是路径,第二个是文件名称
然后newFile.createNewFile()就可以了
35、const和goto既是保留字又是关键字,其余的保留字和关键字严格区分;