我的Java知识总结

-整理java知识方便自己随时查看

  1. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
    可以有多个类,但只能有一个 public 的类,并且public类名必须和文件名相同.

  2. Java有没有goto语句
    goto保留字,没有在java中使用.

  3. &与&&的区别?
    &和&&都可以用作逻辑与的运算符,表示逻辑与(and),
    && 还具有短路的功能
    & 还可以用作位运算符

  4. 在 JAVA 中如何跳出当前的多重嵌套循环?
    break + 标号;

  5. char型变量中能不能存贮一个中文汉字?为什么?
    char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦,
    unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

  6. 用最有效率的方法算出2乘以8等於几?
    2<<3

  7. 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
    使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
    例如,对于如下语句:

     	final StringBuffer a = new StringBuffer("immutable");
     	执行如下语句将报告编译期错误:
    
     	a = new StringBuffer("");
     	但是,执行如下语句则可以通过编译:
    
     	a.append(" broken!");
    
     	有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
    
     	public void method(final  StringBuffer param){
    
     	}
    
     	实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
    
     	param.append("a");
    
  8. 静态变量和实例变量的区别?
    在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。
    在程序运行时的区别:实例变量属于对象的属性,必须创建实例对象,
    静态变量属于类,也称类变量,不用创建实例对象就可分配空间.

  9. 是否可以从一个 static 方法内部发出对非 static 方法的调用?
    不可以,
    非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象调用
    static 方法调用是不需创建对象,可以直接调用.
    static 中调用 非 static 的方法时可能还没被创建.

  10. Integer 与 int 的区别?
    int 是8中原始数据类型之一,默认值 0,是数据类型
    Integer 是 java为 int 提供的封装类,默认值 null, 是 类

  11. Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
    Math 类提供三种取整方法:
    Math.ceil(11.3) = 12 Math.ceil(-11.3) = -11 向上取整.
    Math.floor(11.6) = 11 Math.floor(-11.6) = -12 向下取整.
    Math.round(11.5) = 12 Math.round(-11.5) = -11 Maath.floo(x + 0.5)原数字 +0.5后向下取整(四舍五入)

  12. Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?
    Overload是 重载,同名不同参的方法.不能通过访问权限、返回类型、抛出的异常进行重载
    Override是 重写。只是重写父类方法内部的实现,不能改变形参和返回值,

  13. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?
    接口可以继承接口.抽象类可以实现(implements) 接口.抽象类可以继承具体类.抽象类中可以有静态的 main 方法.

  14. Java 中实现多态的机制是什么?
    靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,
    就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

  15. abstract class 和 interface 语法上的区别


		抽象类   					| 			   接口	

	有构造方法						|			没有构造方法
	有普通成员变量					|			没有普通成员变量
	可以包含非抽象的普通方法			|			所有的方法都必须是抽象的
	抽象方法的类型可以是 public		|			只能是 public 的
	protected 和默认类型				|			默认即为 public abstract
	可以包含静态方法					|			不能包含静态方法
	可以包含静态成员变量,访问类型任意	|			可以包含静态成员变量,只能是 public static final 类型
	一个类只能继承一个抽象类			|			一个类可以实现多个接口
  1. abstract 的 method 是否可以同时是 static ,是否可同时是 native, 是否可同时是 synchronized ?
    abstract 的 method 不可以是 static 的,因为抽象的方法是要被子类实现的.
    native 方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以不能是抽象的,不能与 abstract 混用.
  2. 内部类可以引用它的包含类的成员吗?有没有什么限制?
    可以.如果不是静态内部类,那没有什么限制!
    如果把静态嵌套类当做内部类的一种特例,那在这种情况下不可以访问哇哦不类的普通成员变量,而只能访问外部类中的静态成员.
  3. String s = “Hello”; s = s + “world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?
    没有.因为 String 被设计成不可变类,所以它的所有对象都是不可变对象.执行后 s 将指向新的对象,原来 s = “Hello” 还存在与内存中.只是 s 的引用不再指向它了.
  4. ArrayList 和 Vector 的区别?

		 ArrayList   						| 			   Vector

都实现了List接口(List接口继承了 Collection接口),都是有序集合即存储的位置是有序的,数据允许重复
都存在初始容量,每次增加多个存储单元,
			
		非线程安全的,效率高					|			线程安全的,不用考虑编写线程安全代码
		每次增加容量按倍数增加(0.5倍)			|			每次增加容量按倍数增加(1倍)	
  1. HashMap和 Hashtable的区别
    HashMap是Hashtable的轻量级实现(非线程安全的),他们都完成了Map接口,主要区别在于HashMap允许空(null) 键值(key),由于非线程安全,在只有一个线程的情况下,效率高于 Hashtable.
    Hashtable继承自Dictionary类,而HashMap是java1.2引进的 Map Interface的一个实现.
    Hashtable的方法是 Synchronize的,而HashMap不是,在多个线程访问时HashMap需提供同步而Hashtable不用.
  2. List和Map的区别

				List						|						Map
			单列式数据存储					|					键值对形式存储
			数据有顺序,可重复					|					无顺序,键值不可重复
  1. List, Set, Map 是否继承自 Collection 接口?
    List, Set 是, Map不是

  2. List, Map, Set 三个接口,存取元素是,各特点
    List 和 Set 都是单列元素的集合,有共同的父接口 Collection.Set里面不允许有重复的元素,即不能有两个相等(注意,不是仅仅是相同)的对象,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,不能细说要取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
    List表示有先后顺序的集合,按先来后到的顺序排序,每次add(obje)将这个对象的引用多次加入.
    Map 与 List和Set不同, 它是双列的集合,其中有 put 方法,put(Object key, obj value),每次存储时,要存储一对 key/value,不能存储重复的 key, 这个重复的规则也是按 equals 比较相等.

  3. StringBuffer 和 String的区别
    StringBuffer 和String 可以存储和操作字符串,即包含多个字符的字符数据,
    String 类提供了数值不可改变的字符串,
    StringBuffer 类提供的字符串可以进行修改,可以使用StringBuffer来动态构造字符数据.

  4. String s = “a” + “b” + “c” + “d”;创建了几个对象
    一个,java在编译时对字符串常量表达是进行优化,不必等到运行期再去进行加法运算处理,而在编译时去掉加号的.

  5. try{} 里有return语句,那么紧跟其后的finally{}里的代码会不会被执行,什么时候执行,在return前还是后?
    finally里的语句一定会被执行的,且在return中间执行

    public class Client {
    	public static void main(String[] args) throws Exception{
    		System.out.println(new Client().test());
    	}
    	static int test() {
    		int x = 1;
    		try {
    			return x;
    		} finally {
    			++x ;
    		}
    	}	
    }
    

    输出为: 1.
    运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

  6. final, finally, finalize的区别?


final					|			finally				|		finalize
用于声明属性,方法,			|  异常处理语句的一部分,表示总是执行	|  是object类的一个方法,在垃圾收集器执行的时候会调用
表示属性不可变,方法不可覆盖	|								|  可以覆盖此方法提供垃圾收集时的其他资源回收
  1. 运行时异常与一般异常的区别?
    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误.java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
  2. error和exception有什么区别?
    error表示比较难恢复的一种严重问题,比如OOM,程序一般难处理.
    exception 表示一种设计或实现问题如果程序运行正常,也可从不发生.
  3. Java 中堆和栈的区别?
    JVM 中堆和栈属于不同的内存区域,使用的目的不同.

			堆										|							栈
堆内存用来存放new创建的对象和数组						|	常用来保存方法帧和局部变量,通常比堆小
被整个JVM的所有线程共享								|	不可在多个线程之间共享
分配的内存有java虚拟机的自动来及回收器管理 				|	在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,
堆中产生了一个数组或者对象之后,还可以在栈中定义一			|	当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,
个特殊的变量,	让栈中的这个变量的取值等于数组或对象在		|	当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,
堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量	|	该内存空间可以立即被另作它用。
以后就可以在程序中使用栈中的引用变量来访问堆中的数组			|
或者对象,引用变量就相当于是为数组或者对象起的一个名称。		|	
  1. 能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
    可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,
    所以,如果强制转化,int 类型的高 24 位将会被丢弃,因为byte 类型的范围是从 -128 到 128。
  2. a.hashCode() 有什么用?与 a.equals(b) 有什么关系?
    hashCode() 方法对应对象整型的hash值,它常用于 hash 的集合类,如 Hashtable, HashMap, LinkedHahsMap等等.
    与 equals() 方法关系紧密,两个使用 equals() 方法来判断相等的对象,必须具有相同的 hashCode
  3. 什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。(后续补充)
  4. 什么是线程?
    线程是操作系统能够进行运算调度的最小单位,被包含在进程中,是进程中的实际运作单位.
  5. 线程和进程的区别.
    线程是进程的子集,一个进程可以有多个线程,每个线程并行执行不同的任务.不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间.每个线程都拥有单独的栈内存用来存储本地数据.
  6. 如何实现线程?
    java.lang.Thread 类的实例就是一个线程但是他们需要调用 java.lang.Runnable接口来执行,由于线程类本身就是调用的 Runnable 接口所以你可以继承 java.lang.Thread 类或者直接调用 Runnable 接口来重写 run() 方法实现线程.
  7. 关键字 volatile 与 synchronized作用与区别?
    1. volatile 所修饰的变量不保留拷贝,直接访问内存中的值.一个变量声明为 volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它 cache 在线程 memory 中.
    2. synchronized 修饰一个方法或者一个代码块时,能够保证同一时刻最都只有一个线程执行该代码块.
    一. 当两个并发线程访问同一对象 object 中的 synchronized(this) 代码块时,另一个线程必须等待前一个执行完该代码块后才能执行.
    二. 当一个线程访问 object 的一个synchronized(this) 同步代码块是,其他线程对 Object 中所有其他 synchronized(this) 同步代码块的访问将被阻塞.
    三.当一个线程访问 object 的一个 synchronized(this) 同步代码块是,它就获得了这个 object 的对象锁,结果,其他线程对该对象所有同步代码部分的访问都被暂时阻塞.
  8. 有哪些不同的线程生命周期?
    当我们在java程序中新建一个线程时,它的状态是 New. 当我们调用线程的 start() 方法时,状态被改变为 Runnable. 线程调度器会为 Runnable 线程池中的线程分配 CPU 时间并将他们的状态改变为 Running .其他的线程状态还有 Waiting, Blocked, 和 Dead;
  9. 你对线程优先级的理解.
    每一个线程都是有优先级的,高优先级的线程在运行时具有优先权,当这依赖于线程调度的实现,这个调度和操作系统相关的.可以定义线程的优先级,但这并不能保证高优先级的线程会在低优先级的线程前运行.优先级(1-10).
  10. 什么是死锁(Deadlock)?如何分析避免死锁?
    死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源.
    避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常方法.
  11. 什么是线程安全? Vector 是一个线程安全类吗?
    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而其他的变量的值也和预期的是一样的,就是线程安全的.
    一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误.很显然你可以将集合类分成两组,线程安全的和非线程安全的.
    Vector 是用同步方法来实现线程安全的,而和它相似的 ArrayList 不是线程安全的.
  12. Java 中如何停止一个线程?
    java没有为停止线程提供API,JDK 1.0 中有像 stop(), suspend() 和 resume() 的控制方法但是由于潜在的死锁威胁被弃用了.
    当 run()和 call() 方法执行完的时候线程会自动结束,如果需要手动结束一个线程,可以使用 volatile 布尔变量来退出run() 方法的循环或者取消任务来中断线程.
  13. 什么是 ThreadLocal?
    ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的.我们可以使用同步技术.但是当我们不想使用同步的时候.我们可以选择ThreadLocal变量.
    每个线程都会拥有他们自己的 Thread 变量,他们可以使用get()\set() 方法去获取他们的默认值或者在线程内部改变他们的值. threadLocal 实例通常是希望他们同线程状态关联起来是private static 属性.
  14. Sleep(), suspend() 和wait() 之间有什么区别?
      Threa.sleep() 使当前线程在指定时间处于"非运行"状态.线程一直持有对象的监视器.比如一个线程当前在一个同步块或同步方法中,其他线程不能进入该块或方法中.如果另一个线程调用了 interrupt() 方法,它将唤醒那个"睡眠的"线程. sleep() 是一个静态方法.只对当前线程有效.
      suspend() 是一个过时的方法,使用suspend() 导致线程进入停滞状态,该线程会一直持有对象的监视器,容易造成死锁问题.
      object.wait() 使当前线程处于"不可运行"状态,和 sleep() 不同的是 wait 是 object 的方法而不是thread.调用时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一个线程可以同步一个对象锁来调用 object.notify(), 这样将唤醒原来等待中的线程,然后释放该锁.
      基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁。
  15. 什么是线程饿死,什么是活锁?
      当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用.Java API中线程活锁可能发生在以下情况:
      1.当所有线程在程序中执行 Object.wait(0),参数为0的wait方法.程序将发生活锁直到在相应的对象上有线程调用 Object.notify() 或者 Object.notifyAll()
      2. 当所有线程卡在无限循环中.
  16. 同步方法和同步代码块,哪个是更好的选择?
    同步代码块更好,因为它不会锁住整个对象(当然也可以锁住这个对象).
    同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁.
  17. 什么是线程池>为什么要使用它?
      创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限.
      为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,他们被称为线程池,里面的线程叫工作线程.
  18. java中的泛型是什么?使用泛型的好处是什么?
       泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.
       好处
         1. 类型安全,提供编译期间的类型检测
         2. 前后兼容
         3. 泛化代码,代码可以更多的重复利用.
         4. 性能较高,用泛型编写的代码可以为java 编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件.
  19. equals 和 == 的区别

				==			 			|				equals
			基本数据类型比较的是值			|		equals 比较的是内存地址
			非基本数据类型比较的是内存地址	|
  1. StringBuffer, String, StringBuilder 的区别?
      运行速度: StringBuilder > StringBuffer > String
      String : 字符串常量,每次修改都相当与生成一个新的对象,所以不适合经常变更值的场景.
      StringBuffer : 字符串常量,线程安全适用于多线程.
      StringBuilder : 字符串变量,非线程安全的适用于单线程,效率高.
      速度上面 String 不断的复制和更改是创建不同的对象来进行操作,这里涉及到 GC 垃圾回收机制,会影响速度; 而StringBuffer 和 StringBuilder 则处理同一个对象不存在JVM的GC回收.
      线程安全与否:如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,不能同步的问题。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值