java细节,细的你想象不到
2016-03-17 18:04
399 查看
一、
构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步 。
如果父类中的某个方法使用了 synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类中的这个方法并不是同步的,必须显式的在子类的这个方法中加上 synchronized关键字才可以
当然,也可以在子类中调用父类中相应的方法,这样虽然子类中的方法并不是同步的,但子类调用了父类中的同步方法,也就相当子类方法也同步了
二、
Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节
Java虚拟机中通常使用UTF-16的方式保存一个字符
将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自动结束。
ASP中Session对象默认有效期为20分钟
JSP中Session对象默认有效期为30分钟
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;
初始化过程:
1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
1).隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
线程局部存储TLS(thread local storage)
解决多线程中的对同一变量的访问冲突的一种技术
TLS会为每一个线程维护一个和该线程绑定的变量的副本
Java平台的java.lang.ThreadLocal是TLS技术的一种实现
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()
改变对象和改变对象内部成员的差别:
接口:
当接口被类实现的时候,接口中的所有方法都必须被声明为public的。这是必须的,子类不能降低父类方法的可见性。
内部接口可以声明为private,但是接口中的方法仍然必须是public的,所以内部接口的解释不对
this和super
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
可以将this理解为对象,而类方法属于类,不属于对象,所以类方法前不能加this指针。
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于
方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
内部类:
"".equals(str)与str.equals("")的区别
"".equals(str)可以避免程序报空指针
iterator.remove()和list.remove()
如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,
例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
Object中的clone( )方法
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
深复制:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实
例值。
浅拷贝只复制一个对象,传递引用,而不复制它所引用的对象。
而深复制把要复制的对象所引用的对象都复制了一遍。
深复制步骤:
1、父类、子类实现Cloneable 接口
2、子类重写clone( )方法
3、复制对象是不使用new
Student2 student2 = (Student2) student1.clone();
利用序列化实现深复制
1、父类、子类实现Serializable 接口
2、子类写deepClone( )方法
垃圾回收算法,为什么要分代处理?
不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
GC停顿原因,如何降低停顿?
http://www.itdadao.com/2016/02/20/402713/
HotSpot有4个垃圾回收器, Serial、Parallel、CMS、G1
GC算法本身可以是串行的(单线程),也可以是并行的(多线程),在GC的世界中,并发和并行是两个完全不同的概念。并发针对的是GC周期,而
并行针对GC算法自身。
如何实现高效的同步链表
(代码)层次遍历二叉树,偶数层输出逆序输出(队列,用一个标记记录每一层的结束,统一输出当前层)
内网中有一张图片,如何防止被泄漏?
构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步 。
如果父类中的某个方法使用了 synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类中的这个方法并不是同步的,必须显式的在子类的这个方法中加上 synchronized关键字才可以
当然,也可以在子类中调用父类中相应的方法,这样虽然子类中的方法并不是同步的,但子类调用了父类中的同步方法,也就相当子类方法也同步了
二、
Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节
Java虚拟机中通常使用UTF-16的方式保存一个字符
将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自动结束。
ASP中Session对象默认有效期为20分钟
JSP中Session对象默认有效期为30分钟
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;
初始化过程:
1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
1).隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
线程局部存储TLS(thread local storage)
解决多线程中的对同一变量的访问冲突的一种技术
TLS会为每一个线程维护一个和该线程绑定的变量的副本
Java平台的java.lang.ThreadLocal是TLS技术的一种实现
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()
改变对象和改变对象内部成员的差别:
class SimInt{ int value; public SimInt(int value){ this.value=value; } } public class Main{ public static void change1(SimInt si){ si=new SimInt(3);//重新指向了新的对象,原对象不受影响 } public static void change2(SimInt si){ si.value=3;//通过引用操作对象内部成员,原对象被改变 } public static void main(String args[]) { SimInt si1=new SimInt(1); System.out.println(si1.value);//输出1 change1(si1); System.out.println(si1.value);//输出1 change2(si1); System.out.println(si1.value);//输出3 } }
接口:
当接口被类实现的时候,接口中的所有方法都必须被声明为public的。这是必须的,子类不能降低父类方法的可见性。
内部接口可以声明为private,但是接口中的方法仍然必须是public的,所以内部接口的解释不对
this和super
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
可以将this理解为对象,而类方法属于类,不属于对象,所以类方法前不能加this指针。
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于
方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
内部类:
"".equals(str)与str.equals("")的区别
"".equals(str)可以避免程序报空指针
iterator.remove()和list.remove()
如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,
例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
Object中的clone( )方法
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
深复制:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实
例值。
浅拷贝只复制一个对象,传递引用,而不复制它所引用的对象。
而深复制把要复制的对象所引用的对象都复制了一遍。
深复制步骤:
1、父类、子类实现Cloneable 接口
2、子类重写clone( )方法
// 改为深复制: Student2 student = (Student2) super.clone(); // 本来是浅复制,现在将Teacher对象复制一份并重新set进来 student.setTeacher((Teacher) student.getTeacher().clone());
3、复制对象是不使用new
Student2 student2 = (Student2) student1.clone();
利用序列化实现深复制
1、父类、子类实现Serializable 接口
2、子类写deepClone( )方法
public Object deepClone() throws Exception { // 序列化 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); // 反序列化 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); }
垃圾回收算法,为什么要分代处理?
不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
GC停顿原因,如何降低停顿?
http://www.itdadao.com/2016/02/20/402713/
HotSpot有4个垃圾回收器, Serial、Parallel、CMS、G1
GC算法本身可以是串行的(单线程),也可以是并行的(多线程),在GC的世界中,并发和并行是两个完全不同的概念。并发针对的是GC周期,而
并行针对GC算法自身。
如何实现高效的同步链表
(代码)层次遍历二叉树,偶数层输出逆序输出(队列,用一个标记记录每一层的结束,统一输出当前层)
内网中有一张图片,如何防止被泄漏?
相关文章推荐
- Spring单例与线程安全小结
- Java多态中的若干问题
- Java中Synchronized的用法
- Spring的5种通知
- ubuntu下安装Java开发环境和eclipse的个人总结
- 覆盖jar 类 优先级高于jar == Debug jar包 java技巧
- eclipse环境变量设置
- Java经典设计模式之七大结构型模式
- Java集合框架:LinkedHashMap
- Java集合框架:LinkedHashMap
- 解析String与Integer的==
- Java - JCP、JSR等名词介绍
- Poi处理Excel时公式不能更新的问题
- Spring IOC 三种注入方式
- java学习笔记-线程
- Java Servlet 开发常用代码、模板、问题
- Struts2学习笔记(Tags)
- java.lang.OutOfMemoryError: PermGen space异常处理
- java枚举类型
- 获取eclipse获取路径