牛客网Java选择题的一些整理

时间:2023-02-16 11:52:40

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方法也位于当前类,所以可以正确输出

 

9ArrayList的构造函数总共有三个:

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);    

35java中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既是保留字又是关键字,其余的保留字和关键字严格区分;