1.刚刚在做一个类的构造方法在这个类中其他构造方法中的调用形式时我忘记了在构造方法中调用另一个构造方法的时候是不用this.的直接是this(x),我想成了this.A(x)要记住在类的其他方法中调用构造方法中的方法是this.A(x) 而在构造方法中调用构造方法中的属性时用的时this(x).
2.有这样一道编码题:
public class Test4{
public static void main(String[] args){
String s;
System.out.println(“s=” + s);
}
}
刚开始我觉得不用初始化也可以,我用idea编译了下发现它在打印的时候会报错,也就是说未被初始化的变量不能被打印。
不能使用未被初始化的的变量
3对于这道题考察的是字符串的表达方式不同所在的地方也不同,在String str = new 某个对象的时候是在栈中为实例开辟了对象erString str = “zhang”,这个是把字符串引入了字符串常量池当中,String str = “张”,和String str2 = “张”,当比较str str2时 不要觉得此时的比较的是地址就判断为false,此时由于两个对象都是直接引入到常量池当中的当常量池发现str中的字符串和str2中的字符串值相同的时候直接把str指向的对象给str2也给了一份说明两个对象存放的是相同的地址,此时比较==也就是true说的过去,但是new之后在比较就是false因为nwe是在堆上开辟内存不在常量池中。
str1+str2是在运行时才会编译的而
例子C:
String str1 = “java”; //直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中
String str2 = “blog”; //直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中
String s = str1+str2; //字符串的拼接操作在程序运行时,才在堆中创建对象,
System.out.print(s==“javablog”)在编译是才知道s==javablog,但是s是在运行时 str1+str2;使得s =javablog,所以肯定是false。
常量池是在方法区中有且仅有一份!!!String对象是不可改变的是用final修饰的
4.java当中的泛型:在虚拟机中没有泛型只有普通的类和方法!!!为保证类型安全性,必要时插入强制类型转换
创建泛型对象的时候,一定要指出类型变量T的具体类型。争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。 2、JVM如何理解泛型概念 —— 类型擦除。事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。 总结:泛型代码与JVM ① 虚拟机中没有泛型,只有普通类和方法。 ② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除) ③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字
5.SimpleDateForma是线程不安全的。
.创建一个共享的SimpleDateFormat实例变量,但是在使用的时候,需要对这个变量进行同步
2.使用ThreadLocal为每个线程都创建一个线程独享SimpleDateFormat变量
3.需要的时候创建局部变量
6.Hashtable和ConcurrentHashMap有什么分别呢?它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。
7.以,java文件结尾的源文件只能有一个与文件名相同的类并且这个类是public类
8 饿汉式和懒汉式,饿汉式是指在类加载的过程中就已经实例化了该类,保证了单线程,线程安全问题,而懒汉式则是在类初始化完成之后才对该类进行实例化,这个懒汉式满足于当我们需要的时候才去创建,但是线程是不安全的。