那些年我们掉过的java的坑(五)

本文深入探讨Java异常处理机制,包括Error、Exception及其子类的区别;详解File类的使用技巧;Socket编程的客户端与服务端实现;序列化与反序列化原理;类加载过程;GC机制;集合框架的List、Set、Map特性;并提供了HashMap线程安全的解决方案。

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

那些年我们掉过的java的坑(五)

1.Throwable是所有异常的基类,包含两个子类: Error和Exception。Exception又分为被检查的异常(CheckedException),运行时异常(RuntimeException)。其实异常就是程序执行过程中发生没有实现预料到的情况。
  • Error:表示程序运行时出现了严重的错误,不可恢复。
  • Exception:需要使用try…catch…finally的异常。
  • RuntimeException:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常都属于运行时异常。一定要处理,否则发送了程序就会死再这。
  • CheckedException:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。一定要处理,否则程序就编译不过。
2.File类的常用方法
  • File(String pathname)根据指定路径创建File对象,注意:\在字符串中需要"\\"表示
    File file = new File("C:\\Trstary");
  • createNewFile()若存在返回false,否则创建文件或者文件夹
  • delete()
  • isFile()判断是否是文件
  • isDirectory判断是否是文件夹
  • listFiles()查询目录下面的所有File类型(文件或者文件夹)
  • mkdir()创建目录
  • exists()对于文件是否存在
3.Socket编程,通过字节流InputStream和OutputStream

服务型

	public static void main(String[] args) throws IOException
    {
        //创建一个ServerSocket,用于监听客户端Socket连接请求
        ServerSocket ss = new ServerSocket(8888);
        System.out.println("server start");
        //采用循环方式监听客户端的请求
        while(true)
        {
            //侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
            Socket socket = ss.accept();
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			PrintStream ps = new PrintStream(socket.getOutputStream());
			String s = br.readLine();
            ps.println("收到:"+s);
            ps.close();
            br.close();
            socket.close();
        }
    }

客户端

	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost", 8888);
			PrintStream ps = new PrintStream(socket.getOutputStream());
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			ps.println("你好");
			//这个是非阻塞,所以需要轮询
			while (true) {              
				String str = br.readLine();
				if (null != str) {
					System.out.println(str);
					break;
				}
			}
			ps.close();
			br.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
4.java序列化和反序列化:Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程
  • 序列化的类需要实现Serializbale这个接口
  • static代表的类成员,transient代表对象的临时数据,这两种成员不能够被序列化(代表这种类型的数据为默认值存入序列化中,反序列化出来也是默认值)
  • 举个栗子就略了
  • 序列化是针对对象,不是类
5.类加载的3个步骤,
  1. 装载,根据路径找到对应的class文件,引入
  2. 链接,链接又分为3步
  • 检查,检查class文件正确性
  • 准备,给类中的静态变量分配空间
  • 解析,将符号引用改为直接引用
  1. 初始化,对静态变量和静态代码块执行初始化工作
6.符号引用和直接引用。在java中,一个java类将会编译成一个class文件。在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类 的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。
7.GC(垃圾回收器)会对不可达对象进行内存回收,不要轻易调用System.gc(),性能会凉凉。
	public static void main(String[] args) {
		Integer a = new Integer(1);
		Integer b = new Integer(2);
		b=a;      //这里的new Integer(1)就是“不可达”
	}
8.Collection集合
  • List:是有序的Collection集合,按照进入的顺序进行保存对象。子类有LinkedList(底层是采用链表实现,线程不同步)、ArrayList(底层是采用数组实现,线程不同步)、Vector(底层是采用数组实现,线程同步)
  • Set:主要的特点是元素不能重复,所以需要提供好equals()方法。子类有HashSet(无序的元素)、TreeSet(按照配置的顺序排放元素的)
  • Map:键值对,hash需要配好HashCode()。子类有HashMap(线程不同步,允许一个null键)、Hashtable(线程同步,不允许null键)、TreeMap(是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射)等等
9.如何进HashMap变为线程安全

Map m = Collections.synchronizedMap(new HashMap());

10.Collection和Collections有声明区别
  • Collection就是集合List和Set的父类
  • Collections就针对集合的包装类,可以说是工具类
<think>好的,用户让我介绍一下Java中的String.split方法。首先,我得回忆一下这个方法的基本用法。记得split是用来根据正则表达式分割字符串的,返回一个字符串数组。但可能需要更详细的解释。 用户可能刚学Java,对正则表达式不太熟悉,所以得解释清楚参数的意义。比如,普通字符分割和正则表达式特殊字符的区别,比如用点号.分割的话需要转义,因为点在正则里代表任意字符。 接下来,应该分点说明。首先是基本用法,比如split(",")分割逗号分隔的字符串。然后是有多个分隔符的情况,比如用正则的管道符|,例如split("a|b")。然后是限制分割次数的参数,第二个参数的作用,比如split(":", 3)会分成最多三个部分。 还需要提到一些常见的,比如分割点号或者星号的时候需要转义,或者处理多个空格的情况可以用\\s+。另外,空字符串的情况需要注意,比如分割后开头或结尾有空元素的话,split默认会处理掉,但如果有limit参数的话可能保留。 可能用户在实际使用中会遇到问题,比如分割后的数组长度,或者特殊字符的处理。应该举几个例子,比如用逗号分割,或者用正则表达式分割数字和字母。另外,提到limit参数为0、正数、负数时的不同行为,比如负数会保留空元素,而0会去掉末尾的空元素。 还需要注意不同版本的Java是否有差异,不过可能大部分情况下行为一致。最后总结一下常用的场景和注意事项,让用户能正确使用这个方法,避免常见的错误。</think>Java中的`String.split()`方法用于将字符串按照指定的正则表达式规则进行分割。以下是逐步说明: ### 一、基本用法 ```java String str = "apple,banana,orange"; String[] fruits = str.split(","); // 结果:["apple", "banana", "orange"] ``` - 参数:正则表达式(如`,`) - 返回:分割后的字符串数组 ### 二、正则表达式分割 需注意特殊字符需转义: ```java String str = "192.168.1.1"; String[] nums = str.split("\\."); // 转义点号 // 结果:["192", "168", "1", "1"] ``` ### 三、多分隔符 用`|`表示逻辑或: ```java String str = "a-b+c_d"; String[] parts = str.split("[-+_]"); // 结果:["a", "b", "c", "d"] ``` ### 四、限制分割次数(limit参数) ```java String str = "one:two:three:four"; String[] parts1 = str.split(":", 2); // 分割2-1次 // 结果:["one", "two:three:four"] String[] parts2 = str.split(":", -1); // 保留所有空元素 ``` ### 、常见场景处理 1. **分割空格**: ```java String str = "Hello World Java"; String[] words = str.split("\\s+"); // 匹配任意多个空格 // 结果:["Hello", "World", "Java"] ``` 2. **空字符串处理**: ```java String str = ",a,b,,c,"; String[] arr1 = str.split(","); // 默认去除末尾空值 // 结果:["", "a", "b", "", "c"] String[] arr2 = str.split(",", -1); // 保留所有空值 // 结果:["", "a", "b", "", "c", ""] ``` ### 六、注意事项 1. 正则表达式需正确转义 2. 默认会去除末尾空元素 3. `limit=0`时效果与默认相同 4. 空字符串分割返回长度为1的数组(包含原字符串) 建议通过调试工具查看分割结果,确保符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值