【心得-Java】小知识 - 持续更新中

小知识点

1、	if (1) 这句是错误的; switch(byte、short、int、char(特殊的int类型)、 String(1.7jdk版本))
2、	Vector(是1.0版本,95年,已经被淘汰)、ArrayList(98年至今)
3、	++a 比 a++ 运行快,因为++a没有使用寄存器,
不用进栈和出栈
4、	交换整型变量a与b的值
①	a = a^b;	b = a^b;	a = a^b;
②	a = a+b;	b = a-b;	a = a-b;
③	int c = a;	a = b;	b = c;
5、	在类中private修饰的变量可通过get、set方法
6、	静态(static)方法可以通过类名直接调用该方法
非静态方法要通过实例化对象使用
7、	抽象类不能创建实例化对象,只能定义变量和数组
8、	当创建子类对象时,先加载父类静态代码块,再加载子类静态代码块。此间会在子类构造函数内执行super(),此时若父类有有参构造却无无参构造,程序出错
9、	static、final、private 不能和abstract同时出现(同时修饰)
10、可变长参数(T … t), 例如:(String … s) 如同 (String[] s)
	 一个方法中最多有一个可变长参数,并且在参数表最后 :(String a, String b, String… c)
	传值时:("DF”, “DFG”, “SF”….)
11、输出 System.out.printf(“%d”, 20);  
12、随机时:(int)(Math.random() * 1000) //随机1000以内的整数
13、wait() / sleep(), wait会丢失所有锁标记,sleep不会丢失锁标记
14、Oracle:查看所有用户 -> select username from dba_users;
		  切换用户 -> alter user 用户名 identifi ed by 密码;
		  授权 -> grant connect,resource,dba to 非系统用户
15、List等集合只存放数据,本身不能遍历,而是通过迭代器实现的
	List<String> list = new ArrayList<>(); 
	Iterator<String> it = list.iterator();  //Stream
16、List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);   //此时list的长度不能变
17、泛型类型的约定 <T extends U> 约定T为U的类型
18、Vector与ArrayList基本是一致的,不同的是Vector是线程安全的,会在可能出现线程安全的方法前面加上synchronized关键字;Vector:随机访问速度快,插入和移除性能较差(数组的特点);支持null元素;有顺序;元素可以重复;线程安全;Stack:后进先出,实现了一些栈基本操作的方法(其实并不是只能后进先出,因为继承自Vector,可以有很多操作,从某种意义上来讲,不是一个栈);自己实现:
	class MyStack {
LinkedList list = new LinkedList();
		public void push(Object o) {
			list.addFirst(o);
		}
		public Object pop() {
			Object o = list.removeFirst();
			return o;
		}
	}
19、如果一个类不想有任何子类,则可以声明为final;如果一个类在外部也不想有子类,则构造方法可以声明为
private
20、线程安全:List<?> l = new CopyOnWriteArrayList<>();
21、Math:向上求整(ceil)、向下求整(floor)、四舍五入(round:是将值+0.5再用floor向下求整)
22、HashTable的键值都不允许出现null
23、①如果try里面有return基本类型,先把变量保存,再执行finally,最后再把保存的值返回
	int a = 2;
	try { 
return ++a;
} finally { ++a } //返回的是3,但是finally里的也执行了
	②如果try里面返回的是对象类型,保存的则是地址
	StringBuilder s = new StringBuilder(“hello”);
	try {
		return s.append(“world”);
}finally {
	s.append(“finally”);
} //结果是返回helloworldfinally
24、Scanner的next、nextInt…扫描输入的”空白字符”结束;nextLine则是扫描输入的”换行”结束
25、final修饰对象类型时,是对象的地址不能改变
26、一个用sychornized加锁的线程引入其他线程方法?
	①方法没有锁或锁对象与此线程无关,可以引入
	②方法有锁,但如果此线程内无wait,不可以引入
	③方法是static,锁对象为类字节码(所有了对象公用),可以引入
27、volatile修饰的静态变量,在线程中访问时,静态变量不会被复制,而是使用时去主线程中获取,以保证线程的
	原子性,应用于单例模式的双重检查锁实现中。
	volatile的重要作用:①使线程可见 ②禁止指令重排序优化
28、↑原子性:AutomicInteger()、AutomicXXX()
29、泛型的编译的类型擦除:
	例:①void f1(List<String> listStr) {}		---> void f1(List  listStr) {}
		②void f1(List<Integer> listInt) {}		---> void f1(List  listInt) {}
		注解:①和②在编译时不通过,因为在编译时泛型自动擦除
		注意:如果泛型有继承(约束),那么擦除为其父类的类型,所以instanceof不允许有泛型参数
30、System.gc();//调用垃圾回收
31、java引用方式(强、软、弱、虚):
①强引用(StrongReference):只要某个对象有强引用与之关联,JVM必定不会回收这个对象,在内存不足的情况
下,JVM宁愿抛出OOM(内存溢出)错误也不会回收这种对象.
②软引用(SoftReference):对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,
这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。get()获得引用的对象
③弱引用(WeakReference):当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象.get()
获得引用的对象	
④虚引用(PhantomReference):随时会回收,一般用于判断虚拟机回收情况。	如果一个对象仅持有虚引用,那
么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
注:isEnqueued() 由程序或者垃圾回收器通知是否将该引用对象加入队列。虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。由于Object.finalize()方法的不安全性、低效性,常常使用虚引用完成对象回收前的资源释放工作。
32、StringBuffer默认初始长度为16个字符
33、死锁检测:	可用自动的堆栈跟踪工具jstack
	预防死锁:	① 互斥条件:一个资源每次只能被一个线程使用。 
② 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
③ 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。 
④ 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
		注:如果满足以上四个条件任何一个,就能预防死锁
34、Queue队列,继承自Collection接口,例如Deque、LinkedList、PriorityQueue、BlockingQueue等类都实现了它;主要用于等待处理的集合,一般用于缓冲、并发访问。提供了尾部插入:add(E)、offer(E)
35、静态导入:import  static java.io.File.*; 只导入这个类的静态方法;
36、MyEclipse使用:配置文件写到资源包下(项目下新建 source folder)
posted @ 2020-09-08 17:19  JWnMing  阅读(40)  评论(0)    收藏  举报