[置顶] JAVA知识点

1 执行下列语句将清除1.txt的内容  

FileOutputStream objectOutputStream = new FileOutputStream(
   "1.txt", false);

 FileOutputStream立马创建,而不需要判断是否CLOSE或者写入。

   File file=new File("t.txt");不创建新文件

 

 

2  BUILD不了

(1)尝试手动build

(2)查看是否有LIB加载错误或丢失

(3)若一些JRE的JAR老提示找不到,可以重新加JRE到BUILD PATH里面

 

3 修改JAR里面的CLASS后,不需要重新添加至BUILD PATH

 

4. 在创建需要清理对象之后立马进入try finally语句块!

 

5.抽象类可以实现接口,接口可以继承接口,且两者都可以选择实现父接口方法,而不是必须!

interface demo {
  Number go();
}

abstract class GenericDemo implements demo {

}


interface  GenericDemo extends demo {

}

 

6.  枚举类型既然是类,那么也就可以有构造函数。只不过不得有公开(Public)的构造函数,这是为了避免直接对枚举类型实例化。如下代码:

  Java代码

  enum DetailActioin2

  {

  TURN_LEFT("向左转"),TURN_RIGHT("向右转"),SHOOT("射击");

  private String description;

  //不公开的构造函数

  private DetailActioin2(String description)

  {

  this.description = description;

  }

  public String getDescription()

  {

  return description;

  }

  }

 

   matcher.appendReplacement(sb, "$0"+"$1"+"_recycle/");

8 没有这样的语法: T super Integer

9

  ///U/U3FR3FFG6FRVVMFCWGUHJE66K4-UZH/U3FR3FFG6FRVVMFCWGUHJE66K4-UZH_recycleBin/fujian1
  "/[^/]*?" + recycleBin;
  /U/U3FR3FFG6FRVVMFCWGUHJE66K4-UZH/fujian1

 

10   抽象工厂通过不同的构建过程生成不同的对象表示,而Builder模式通过相同的构建过程生成不同的表示。

11 new FILE中FILE需要的是绝对路径,

12  

在实际编程实践中,你不一定总能清楚地知道每层的流对象是否占据了系统资源,所以,最安全(也是最常规)的做法就是关闭最外层的那个对象。这种逐层包装的对象在实现上都会有一个特点,像“关闭”这种操作都会逐层向内调用。


 13  格式化文档

 //print
   System.out.printf(format, args)
   System.out.format(format, args)
   new Formatter(System.out).format(format, args);
  
   //return string
   String.format(format, args)

 

错误:

   System.out.println(String.format("\t[%d]\t[%d]\t[%d]",
     arrayData[0], arrayData[1], arrayData[2]));
   

正确
   System.out.format("\t[%d]\t[%d]\t[%d]",
     arrayData[0], arrayData[1], arrayData[2]);

 

14 多参列表:

  //right
 
  Object[] arrayData = new Object[3];
  Arrays.fill(arrayData, 1);
 
  System.out.format("\t[%d]\t[%d]\t[%d]",
    arrayData);
  
  
  //error
  int[] arrayData2 = new int[3];
  Arrays.fill(arrayData, 1);
 
  System.out.format("\t[%d]\t[%d]\t[%d]",
    arrayData2);

 

15 先后往前

1

 []数组运算 .点运算符 ()调用方法

从左到右

 2

  ! ~ ++ -- +(一元加) -(一元减) ()强制类型转换 new

 从右到左

 

16  打印异常的时候,先是最后调用的方法,然后依次推后。

 

 

 

  int abs = Math.abs(Integer.MIN_VALUE);
  int i = Integer.MAX_VALUE + 1;

  // -2147483648
  System.out.print(abs);
  System.out.print(abs == i);


17

instanceof

System.out.println((String)null); //返回null
System.out.println(null instanceof Object); //遇到左边null,直接返回null
System.out.println(0 instanceof Integer); //无法编译, 一个基本类型,一个对象
System.out.println(new Date() instanceof Integer); //无法编译,没有任何继承关系

 

 

 20

类的时候分为主动使用和被动使用

类加载分为 : 加载。连接(验证,准备,解析),初始化; 操作的都是静态成员或者静态块; 在准备阶段分配它们的内存并设置默认值, 在初始化阶段设置成真实的值;

而实例化的时候,才有构造器的调用, 同样先为非静态成员分配空间和默认值,然后初始化(初始化域和块,然后到构造器。)

 

所以调用子类,在类加载的时候即完成了静态部分,然后实例化的时候才先父类后子类。

区别类实例化和类初始化。

 

21

int planet = 7; String event = "a disturbance in the Force"; String result = MessageFormat.format( "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.", planet, new Date(), event);

 

 

22

  long x=100*100*10000000;
  System.out.println(x);

不是这个数值,
  
  long y=100000000000;

 

编译错误

 

因此正确应该是long x=100L*100*10000000;


23 


不用声明异常,可见给最后的return屏蔽了,不要用这个方式。
public static Person newInstance(){
Person person=new Person("1");
try {
return person;
} catch (Exception e) {
throw new Exception();
  }finally{
  person.setName("2");
return person;
}
 
  }


反回NAME为2 

 

 

24: ArrayList  >size即1.5倍+1

HashMap>threshold(capacity * load factor)  *2倍

vector也是2倍或者步长capacityIncrement

 

错误的写法:

Java
  1. Map map = new HashMap(collection.size());   
  2. for (Object o : collection) {   
  3.   map.put(o.key, o.value);   
  4. }  


这里可以参考guava的Maps.newHashMapWithExpectedSize的实现. 用户的本意是希望给HashMap设置初始值, 避免扩容(resize)的开销. 但是没有考虑当添加的元素数量达到HashMap容量的75%时将出现resize. 


 正确的写法:

Java代码   
  1. Map map = new HashMap(1 + (int) (collection.size() / 0.75));  


 25

(不符合LSP:  Liskov Substitution Principle) 


覆写必须满足4个条件: 可见性放大,异常减少,返回值类型变大,参数不变。;都是发扬光大的事情

不符合LSP:  (无关覆写),Liskov Substitution Principle, 前置条件(参数)类型缩小,构造器抛出异常放大() 

违反LSP,即父类出现的地方都可以换成子类:  构造器抛出异常,子类必须抛出的更多或一样,更多时就违反了。 重载时,子类的参数类型较小。替换掉的话,有可能导致行为变成子类的重载行为。所以子类的重载参数类型都大的时候,可以保证行为一致。

 

 

26 用IDE生成的HASHCODE和EQUALS方法之后,如果把EQUALS中一些不需要的字段比较去掉,一定不要忘记把HASH CODE的也改掉。否则对象相同, HASHCODE不同。

___________________________________________


27 volatile本身不保证获取和设置操作的原子性,仅仅保持修改的可见性。但是java内存模型保证声明为volatile的long和double变量的get和set操作是原子的。在32位机器上,对LONG/DOUBLE型的读写被切成2个32位。所以不是原子操作。如果是以后的64位,这个问题应该可以解决。


28

那么synchronizes用来干什么呢?两者有两方面的不同。首先,synchronized获取和释放由监听器控制的锁,如果两个线程都使用一个监听器(即相同对象锁),那么监听器可以强制在一个时刻只有一个线程能处理代码块,这是最一般的同步。另外,synchronized还能使内存同步。在实际当中,synchronized使得所有的线程内存与主内存相同步。所以geti3()的执行过程如下:
1. 线程从监听器获取对象的锁。(这里假设监听器非锁,否则线程只有等到监听器解锁才能获取对象锁)
2. 线程内存更新所有的变量,也就是说他将读取主内存中的变量使自己的变量保证有效。(JVM会使用一个“脏”标志来最优化过程,使得仅仅具有“脏”标志变量被更新。详细的情况查询JAVA规范的17.9)
3. 代码块被执行(在这个例子中,设置返回值为刚刚从主内存重置的i3当前的值。)
4. 任何变量的变更将被写回到主内存中。但是这个例子中geti3()没有什么变化。
5. 线程释放对象的锁给监听器。
所以volatile只能在线程内存和主内存之间同步一个变量的值,而synchronized则同步在线程内存和主内存之间的所有变量的值,并且通过锁住和释放监听器来实现。显然,synchronized在性能上将比volatile更加有所消耗

原子操作:


读写变量是原子操作,除了LONG/DOUBLE,但是加上VOLATILE就可变成原子操作

  • Reads and writes are atomic for reference variables and for most primitive variables (all types except long anddouble).
  • Reads and writes are atomic for all variables declared volatile (including long and double variables).

29

System.out.println(System.getProperty("java.ext.dirs"));     扩展
System.out.println(System.getProperty("java.class.path"));     系统或者应用
System.out.println(System.getProperty("sun.boot.library.path"));  根


30

在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下
(1)interrupt:置线程的中断状态
(2)isInterrupt:线程是否中断
(3)interrupted:返回线程的上次的中断状态,并清除中断状态

 

你可能感兴趣的:(java,exception,String,HashMap,Integer,variables)