《Think in Java》笔记 II

第11章笔记:持有对象

  Java实用类库提供了一套相当完整的容器类来解决这个问题,其中基本的类型是List、Set、Queue、Map。这些对象类型也称为集合类,但由于Java的类库中使用了Collection这个名字来指代该类库的一个特殊子集,所以使用了范围更广的术语“容器”称呼它们。容器提供了完善的方法来保存对象,你可以使用这些工具来解决数量惊人的问题。

11.2:基本概念

1)Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象的产生顺序。

2)Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此,在某种意义上讲,它将数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某一个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是强大的编程工具。

11.4:容器的打印

  三种基本风格的Map:HashMap、TreeMap和LinkedHashMap。与HashSet一样,HashMap也提供了最快的查找技术,也没有按照任何明显的顺序来保存其元素。Treemap按照比较结果的升序保存键,同时还保留了HashMap的查找速度。

11.5 :List

   List承诺可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。

有两种类型的List:

 ·基本的ArrayList,它擅长于随机访问元素,但是在List的中间插入和移除元素是比较慢。

 ·LinkedList,它通过代价较低的在List中间进行的插入和删除操作,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。

11.6:迭代器

迭代器(也是一种设计模式)的概念可以用于达成此目的。迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为轻量级对象:创建它的代价小。因此,经常看可以见到对迭代器有些奇怪的限制,例如:Java的Iterator只能单向移动,这个Iterator只能用来:

1)使用方法Iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。

2)使用next()获得序列的下一个元素。

3)使用hasNext()检查序列中是否还有元素。

4)使用remove()将迭代器新进返回的元素删除

11.9:Set

Set不保存重复元素,Set中最常用的还是测试归属性,你可以很容易的询问某个对象是否在某个Set中。正因如此,查找就成为了Set中最重要的操作。实际上Set就是Collection,只是行为不同。

第十二章笔记:通过异常处理错误

 

12.7 Java标准异常

Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型:Error用来表示编译时和系统错误;Exception是可以被抛出的基本类型,在Java类库、用户方法以及运行时故障中都有可能抛出Exception型异常。所以我们关心的基本类型通常是Exception。

 

12.10 构造器

“如果异常发生了,所有东西能被正确清理吗?”

尽管绝大多数情况下是非常安全的,但设计构造器时,问题就出现了。构造器会把对象设置成安全的初始状态,但还会有别的动作;如果构造器内抛出类异常,清理行为也许就不能工作了。这意味着编写构造器时要格外细心。

12.13 异常使用指南

应该在以下情况使用异常:

①在知道该如何处理的情况下才捕获异常。

②解决问题并且重新调用产生异常的方法。

③进行少许修补,然后绕过异常发生的地方继续执行。

④用别的数据进行计算以代替方法与机会返回值。

⑤把当前运行环境下能做完的事尽量做完,然后把 相同/不同 的异常抛到更高层。

⑥终止程序。

⑦进行简化

⑧让类库和程序更安全

不错的博客:https://www.cnblogs.com/lulipro/p/7504267.htmlhttps://www.runoob.com/java/java-exceptions.html

 

finally块中使用return/continue/break 

实例代码:

public class FlowControlInFinally {

    public static void main(String[] args) {
        for(int i=0; i<3; i++) {
            try {
                throw new RuntimeException("exception " + i);
            }finally {
                if(i == 2) break;
                continue;
            }
        }
        
        try {
            throw new RuntimeException("abcd");
        }finally {
            return;
        }
    }
}

运行该程序,可以发现“没有”抛出任何异常。

只需要在编译时打开 -Xlint:finally选项即可发现该问题。

当然,最好的解决办法是不要在finally中使用流程控制(flow-control)语句。    ——此处引用博客:https://blog.chgtaxihe.top/pages/bd624d/#finally%E5%9D%97%E4%B8%AD%E4%BD%BF%E7%94%A8return-continue-break

第十三章笔记:字符串

13.4 String 上的操作

以下是String对象具备的一些基本方法。重载的方法归纳在同一行中

方法参数应用
构造器 重载版本:默认版本、String、StringBuilder、StringBuffer等 创建String对象
length()   String中字符的个数
charAt() Int索引 取得String中字符的个数
getChars(),getBytes() 要复制部分的起点和终点的索引,复制的目标数组,目标数组的起始索引 复制char或byte到一个目标数组
toCharArray()   生成一个char[],包含String的所有字符
equals(),equalsIgnoreCase() 与之进行比较的String 比较两个String的内容是否相同
compareTo() 与之进行比较的String 比较结果为0、正数或负数,注意,大小写并不等价
contains() 要搜索的CharSequence 如果该String对象包含参数的内容,则返回true
contentEquals() 与之进行比较的CharSequence或StringBuffer 如果该String与参数的内容完全一致,则返回true
equalsIgnoreCase 与之进行比较的String 忽略大小写,相同则返回true
regionMatcher() 该String的索引偏移量,另一个String及其索引偏移量,要比较的长度。重载版增加了“忽略大小写”功能 返回boolean结果
startsWith() 可能的起始String 返回boolean结果,以表明String是否以此参数起始
endsWith() 该String的可能的后缀String 返回boolean结果,以表明该参数是否该字符串的后缀
indexOf(),lastIndexOf() 重载版本包括:char,char与起始索引,String,String与起始索引 如果不包含参数就返回-1,否则返回起始索引,lastIndexOf()从后向前搜索
substring() 重载版本包括:起始索引,起始索引+终点坐标 返回一个新的String,已包含参数指定的子字符串
concat() 要连接的String 返回一个新的String对象,内容为原始String+参数String
replace() 要替换的字符串,用来进行替换的新字符 返回替换后的新String对象
trim()   将String两端的空白字符删除后,返回新的String对象
valueOf 重载版本较多 返回一个标识参数内容的String
intern()   为每个唯一的字符序列生成一个且仅生成一个String引用
     

 

如何逐字遍历字符串

public static void main(String[] args) {
        String str="2021 come on";
​
        // 方法一
for(int i=0;i < str.length();i++) {
​
             System.out.print(str.charAt(i)); 
        }
        System.out.println();
​
        //方法二
for(int i=0;i < str.length();i++) {
​
             System.out.print(str.substring(i,i+1)); 
             
        }
        System.out.println();
        //方法三
char[]  c = str.toCharArray();
​
        for(int i=0;i < c.length;i++) {
​
            System.out.print(c[i]);
        }
​
​
    }
 

正则表达式内容会后续记录

第十四章笔记:类型信息与反射

跳转到:https://www.cnblogs.com/wxx23-IOU/p/14438385.html

 

第十五章笔记:泛型

跳转到:https://www.cnblogs.com/wxx23-IOU/p/14444419.html

原文地址:https://www.cnblogs.com/wxx23-IOU/p/14386989.html