Java程序初始化工作可以在许多不同的代码块中来完成,它们的执行顺序如下:
父类的静态变量、父类的静态代码块、子类的静态变量、子类的静态代码块、
父类的非静态变量、父类的非静态代码块、父类的构造函数、
子类的非静态变量、子类的非静态代码块、子类的构造函数。
=================================================
java中的字符串存储在字符串常量区,不会改变,发生改变是会新创建一个对象
StringBuffer是线程安全的StringBuilder
StringBuilder跟StringBuffer功能相同,区别是StringBuilder不是线程安全的
StringBuilder和StringBuffer底层都是以字符数组存放的,可以修改内容
=================================================
类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量则必须进行初始化,他不会进行默认值赋值。final修饰的变量不论在哪都要赋初值。
=================================================
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。
1、运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
ClassCastException(类转换异常)
ClassNotFoundException
IndexOutOfBoundsException(数组越界异常)
NullPointerException(空指针异常)
ArrayStoreException(数组存储异常,即数组存储类型不一致)
还有IO操作的BufferOverflowException异常
(除0异常)
2、非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
IOException
SqlException
=================================================
程序计数器:线程隔离
虚拟机栈:线程隔离
堆:线程共享
方法区:线程共享
=================================================
q:非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头必须完全一致.
a:错误
实际上这道题考查的是两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
=================================================
Arrays.asList() 产生的List是一个固定长度的数组,只支持不改变长度的操作,任何试图改变其底层数据结构长度的操作(如,增加,删除等操作)都会抛出UnsupportedOperationException异常。
public abstract class AbstractList{
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
}
为了使Arrays.asList()方法产生的List集合长度可变,可以将其作为集合容器的构造方法参数,如:
Set set = new HashSet(Arrays.asList(1,2,3));
或者将其作为Collections.addAll()方法的参数,如:
Collections.addAll(Arrays.asList(1,2,3));
=================================================
ConcurrentHashMap使用的是Segement(继承自 ReentrantLock )分段锁的技术来保证同步的, 使用synchronized关键字保证线程安全的是HashTable
=================================================
内部类的实例化:
public class Enclosingone {
//非静态内部类
public class InsideOne {}
//静态内部类
public static class InsideTwo{}
}
class Mytest02{
public static void main(String args []){
Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非静态内部类对象
Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//静态内部类对象
}
}
=================================================
数组声明:
int d []= new int[]; int [] e= new int[];
=================================================
类加载器
比较两个类是否相等,只有这两个类是由同一个类加载器加载才有意义。否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类必定不相等。
补充:
1. 什么是类加载器?
把类加载的过程放到Java虚拟机外部去实现,让应用程序决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
2. 有哪些类加载器,分别加载哪些类
类加载器按照层次,从顶层到底层,分为以下三种:
(1)Bootstrap ClassLoader 启动类加载器 : 它用来加载 Java 的核心库,比如String、System这些类
(2)Extension ClassLoader扩展类加载器 : 它用来加载 Java 的扩展库。
(3)App ClassLoader应用程序类加载器 : 负责加载用户类路径上所指定的类库,一般来说,Java 应用的类都是由它来完成加载的。
3. 双亲委派模型
我们应用程序都是由以上三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。
4. 双亲委托模型的工作原理
是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。
5. 使用双亲委派模型好处?(原因)
第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。
第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。
=================================================
向上转型:
=================================================
世界上第一个计算机网络是ARPA
常用熟知端口: FTP 21 SSH 22 TELNET 23 SMTP 25 TFTP 69 HTTP 80 SNMP 161 HTTPS 443
=================================================
IPv6长度128位,分为8组,每组长度16位,每组中的每一位是用十六进制表示的,
举例: 1234:5678:9abc:def0: 1234:5678:9abc:def0
地址的压缩:
如 2000:0000:0000:0000:0001:2345:6789:abcd
这个地址很长,可以用两种方法对这个地址进行压缩:
前导零压缩法,将每一段的前导零省略,但是每一段都至少应该有一个数字,例如:2000:0:0:0:1:2345:6789:abcd
双冒号法,如果一个以冒号十六进制数表示法表示的IPv6地址中,如果几个连续的段值都是0,那么这些0可以简记为::。每个地址中只能有一个::。
例如:2000::1:2345:6789:abcd
=================================================
1.TCP保留位:用于以后的扩用。
2.TCP的偏移位:用于表示TCP所传输的数据部分应该从TCP包的哪个位开始计算。
3.TCP报文段首部的6个控制位:URG、ACK、PSH、RST、SYN、FIN;下面将对这6个控制位做详细解释。
=================================================
=================================================