java笔记1

博客主要介绍了Java程序的初始化顺序、字符串处理、异常分类、内存区域等知识,还涉及接口实现规则、集合操作、内部类实例化等内容。此外,也包含计算机网络相关信息,如第一个计算机网络、常用端口、IPv6地址及TCP报文段首部控制位等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。

=================================================

向上转型:

4408da5b70f6d6a91f32e62cd2fbd438a08.jpg

=================================================

世界上第一个计算机网络是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

=================================================

57c4ed60b7bc4b44ba4ef4a395361d965e7.jpg

1.TCP保留位:用于以后的扩用。

2.TCP的偏移位:用于表示TCP所传输的数据部分应该从TCP包的哪个位开始计算。

3.TCP报文段首部的6个控制位:URG、ACK、PSH、RST、SYN、FIN;下面将对这6个控制位做详细解释。

=================================================

=================================================

转载于:https://my.oschina.net/u/2286010/blog/3023705

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值