JAVA 笔记(二)

简介: JAVA 笔记(二)

Object类

在java中,Object是继承树中的顶点,换句话说,该类是所有类的直接或间接父类。

一切皆对象就由此而来。

若我们定义的类没有显示的书写extends关键字,那么默认情况下就继承自Object类


Object中定义的方法:


toString():

该方法要求返回一个字符串。这个额字符串是当前对象的句柄。


字符串格式: 类名@HashCode值


toString方法设计的目的是返回一个更有意义的字符串,所以很多时候我们都会在 子类中重写toString方法 。


通常toString方法的返回值这个字符串应该是用来说明该对象的。



equals方法

equals方法的设计目的是定义对象的比较规则。

public boolean equals(Object object)


equals重写目的是比较两个对象“ 长得像不像 ”

equals比较逻辑中,在比较内容前一定要比较两个对象是否为同一类型。


Object的equals方法:

public boolean equals(Object obj){

  return this == obj;

}

所以Object的equals没有意义。


String类

java中用String类封装字符序列

java采用 unicode编码 在内存中存储字符串。任何一个字符都占用 2个字节 。

java对字符串的处理有一个特点 ,字符串是不变对象 。对象一旦创建不会改变。String是引用类型。出于使用方便,java语法允许为该引用类型变量赋直接量(字面量)。

String s = new String();

String s = "HelloWorld";


String的特性(常量池)

处于性能的考虑,java会将 所有出现的字符串缓存在常量池中 。字符串常量池是jvm用于管理字符串开辟的一段内存空间。这么做的目的是尽最大可能重用字符串。


String也重写了equals方法。用于比较内容是否一致。区分大小

写。


equalsIgnoreCase()方法 是字符串提供的另一个比较方法。 用于忽略大小写比较内容 。


equals比较时应该有一个良好的书写习惯,用字面量去equals变量。


String常用的方法:

String  toLowerCase() :返回 该字符串的小写形式 。

String  toUpperCase() :返回 该字符串的大写形式 。


String  trim() :去掉 字符串两边的空白



boolean startsWith(String str)

判断当前字符串是否是以给定的字符串开始。

boolean endsWith(String str)

判读当前字符串是否是以给定的字符串结尾。


int length():

返回 当前字符串的长度 (字符数量)


int  indexOf (String str):

返回 给定字符串在当前字符串的位置。第一次出现的位置 。

若给定字符串在当前字符串中不存在则返回-1 。


int  indexOf(String str,int fromIndex)

功能同上,但是从fromIndex处开始查找。


int  lastIndexOf (String str)

查找 给定字符串在当前字符串中最后一次出现的位置


char  charAt (int index)

查找 指定索引处的字符


String  substring (int start,int end)

截取字符串。 从当前字符串start处开始截取到end处 ,并将截取的字符串返回。


String  substring (int start)

截取字符串, 从当前字符串start处开始截取到结尾



getBytes(String charsetName)

根据指定的 编码集获取字符串的字节形式 。


常见编码集

GBK:国标

GB2312:支持繁体字的国标

ISO8859-1:欧洲标准

UTF-8:通用的编码集。


正则表达式:


[]: 代表可以出现一个字符

  [abc] 这个字符可以是a或b或c

  [^abc] 不能是a或b或c的其他字符

  [a-z] 这个字符只能是小写字母

  [a-zA-Z0-9] 可以是字母或数字

  [a-z&&[^bc]] 是小写字母但不能是b或c

  .: 任意一个字符

 \d: 任一一个数字,等同[0-9]

 \D: 任一一个非数字字符,

     等同[^0-9]

 \s: 任一一个空白字符

 \S: 非空白字符

 \w: 单词字符 [0-9a-zA-Z_]

 \W: 非单词字符[^\w]

 

量词:

  ?:  表示0-1次

    [\w]?:表示0或1个单词字符

    [\w][\w]?: 表示1或2个单词字符

   

  *:表示 0-无穷次

    [\d]*:任意次数字

    [\d][\d]*:至少一次

 

  +:表示 1-无穷次

    [\d]+:至少一个数字


 {n}: n次.n只能是数字

    [\d]{11}:11次数字


 {n,}: n次以上

 {n,m}:n到m次

      [\d]{3,5}:3-5位的数字

 

 (): 将内容看作一个整体

 (abcd):要出现一个abcd

 (abcd)+:至少一次abcd

 ()中可以使用或关系。在几个整体中选其一

 (138|135|130):是138或135或130


String支持正则表达式的方法:


String[] split(String rex)

根据给定的 正则表达式拆分字符串



String  replaceAll(String rex,String str)

将 当前字符串中满足正则表达式的部分替换为给定的字符串str


StringUtils

commons-lang包中提供的一个字符串工具类,用于补充jdk中String的方法。


String repeat(String str,int repeat)

将给定的字符串str重复repeat次

并返回。


String  join(Object[] array,String str)

将 数组中的元素链接为字符串,每项之间以给定的str链接。


String  leftPad(String str,int size,String pad)

向 str左边填充pad以达到size长度


String  rightPad(String str,int size,String pad)


StringBuilder

和String不同,其封装的是可变字符串。

StringBuilder有几个常用方法用于对字符串做 增删改插操作


StringBuilder是在有对字符串进行频繁修改的情况下使用的类


StringBuilder  append(String str)

向 当前字符串末尾追加给定字符串str,返回的StringBuilder就是当前自己这个对象。


append(int i)

向当前字符串末尾追加给定整数i


delete(int start,int end)

删除当前字符串中start处到end处的字符串


replace(int start,int end,String str)

修改当前字符串中start处到end处的字符串,修改为str


insert(int index,String str)

在 当前字符串index处插入字符串str


StringBuffer出现时间早于StringBuilder

方法相同,作用相同,唯一的区别是 StringBuffer是线程安全的,StringBuilder不是线程安全的。


运行效率上Builder快于Buffer

若在单线程情况下运行,优先使用StringBuilder



Java中的日期

java中使用Date类来描述日期

java.util.Date

Date对象用于描述某个时间点。其封装了一个毫秒值(long值)

这个 long值是从1970年元旦那一刻到当前Date描述的时间点之间的毫秒差


因为Date自身的设计缺陷,我们仅仅使用该类来描述日期。


SimpleDateFormat

java.text.SimpleDateFormat

该类可以很方便的在字符串与Date之间相互转换。


99-02-21

1999-02-21

02-21-1999


SimpleDateFormat在构造的时候要制定日期格式字符串,这个字符串用于说明描述日期的字符串的具体格式。


日期格式字符串中的特殊字符:


y    数字年   yyyy:2013 yy:13

M    数字月   MM:12

d    数字日   dd:30


h    数字小时 hh:01   12小时制

H    数字小时 HH:13   24小时制


m    数字的分 mm:59

s    数字的秒 ss:30


E    星期

a    上下午


DateFormat

是SimpleDateFormat的父类。

可以根据地区来转换日期对象对应的字符串。


计算日期

Calendar类 日历类  

Calendar经常被用于计算日期。

该类的设计不存在千年虫问题。


格林威治时间。

格利高里时间。


包装类


包装类的做用是让基本类型数据以对象的形式存在和使用。使得基本类型也可以以面向对象的思想进行开发。

基本类型        包装类

int         java.lang.Integer  char        Character

long        Long

double      Double

float       Float

boolean     Boolean

byte        Byte

short       Short


自动拆装箱

java在1.5后推出的新特性。

可以方便的在基本类型和对应的包


间相互转换。

int a = new Integer(10);

Integer a = 10;

上面两句在1.5以后可以直接使用


包装类的一些方便实用的内容:

常量:

MAX_VALUE:返回最大值

MIN_VALUE:返回最小值


方法:

parseXXX(String info)

将 字符串表示的基本类型内容转换为这个基本类型数据

String num = "123456";

int a = Integer.parseIn(num)

long l = Long.parseLong(num)

注意,转换前提是要确定你转换的字符串描述的是基本类型兼容的数据。否则会转换异常报错!


Integer的两个方法

可以将数字以 2进制字符串形式返回

可以将数字以 16进制字符串形式返回

Integar.toBinaryString(int n);

Integer.toHexString(int n)


BigDecimal类


java在计算浮点类型时会有舍入误差

java.math.BigDecimal

可以用于计算和描述非常精确的浮点数

构造方法

BigDecimal(String num)


支持常用的加减乘除运算


当我们对计算精度有严格要求时,会使用该类,不过在正常开发中大部分情况double足以满足我们的计算需求。


BigInteger类

java提供的整形中int long都是有范围限制的。当我们需要表示或者计算一个范围更大的数字时,可以使用BigInteger, 理论上BigInteger的范围限制和内存有关。

同样也有加减乘除方法


Collection集合

Collection是集合的接口

集合是用来保存一组数据的结构。


Collection下面派生了两个自接口


List和Set

List和Set集合最重要的区别在于, List可以重复存放同一个元素,而 Set集合不行。所以List是可重复集,Set是不重复集。

List是有序集,可通过索引使用元素, Set是无序集。


Collection定义的集合的方法


int  size(): 集合的长度,集合中包含的元素数量。


boolean  isEmpty(): 集合是否是空的。这里指的是集合中是否有元素。


boolean  contains(Object o):

判断 给定元素是否被包含在集合中


void  clear(): 清空集合

boolean  add(Object o):

向 集合中添加元素o,实际上该方法的参数类型为泛型,后面讲。当调用add方法对集合产生了变化,则返回true


boolean  remove(Object o):

从 集合中将给定的元素删除,若删除了一个元素则返回true


boolean  addAll(Collection c)

将 给定的集合中的元素添加到当前集合中


boolean  removeAll(Collection c)

将 给定集合中的在当前集合中存在的元素删除掉。删交集


Iterator  iterator():返回用于遍历该集合的迭代器


List集合

派生两个子类:

ArrayList集合和 LinkedList集合


Iterator迭代器

迭代器是通过集合的iterator()方法获取的。

每个集合都有该方法,用于返回能够遍历当前集合的迭代器。


三个方法:

boolean  hasNext(): 询问迭代器当前集合是否还有元素


Object  next(): 向迭代器获取当前集合的这个元素


void  remove(): 删除集合中当前这个元素


迭代器要本着先问后取的原则去遍历集合!


LinkedList 双向循环链表


泛型 java jdk1.5后的特性


新for循环 jdk1.5后的特性

增强for循环

新循环的作用是用于方便遍历数组和集合的。


for(ElementType e:Array){

 

}

循环次数由数组或集合的长度决定。

每次将数组或集合中的元素顺序取出并赋值给e,进入循环体。


List

取子集

subList方法

List<E> subList(int start,int end)

获取当前集合的部分内容。 子集对元素进行的修改会影响原集合的元素


队列

Queue接口

队列(Queue)常见的一种数据结构。 队列限制了元素存储和取出的顺序,要求先进先出原则。


LinkedList实现了队列接口。

队列的存取方法

offer():  向队列末尾追加元素

poll():  从队列首位删除并获取该元素

peek():  获取队列首位元素,但不删除



Deque接口

双端队列

所谓双端队列,就是俩边都可以进都可以出。若我们将一边"堵住",只能从一边进出的话,就变成了典型的栈结构。


栈结构本着先进后出原则

现实中最典型的 栈结构就是子弹夹


Deque的实现类LinkedList

栈结构存取方法

push(): 向栈内压入数据

pop(): 出栈。获取数据


Comparable接口

若想在集合中对元素进行排序,首先就要确定元素那个大那个小,只有知道了这点,才能对元素进行排序。

Comparable接口定义了一个抽象方法,用于定义比较逻辑。

所以,Comparable的子类都是可比较的,自然就可以在集合中进行排序了。


Comparator接口

该接口允许我们额外的定义比较规则,使用该接口的原因在于,当一个集合中的元素已经实现了Comparable接口并已经定义了比较规则,而我们又不希望使用这种比较规则来进行排序,那么我们可以通过实现Comparator接口来定义额外的比较规则,再通过Collections的重载sort方法进行排序。


Set集合

无序不重复集

Set集合不能根据索引去获取元素

想遍历集合也不能依靠普通的for循环。

想遍历集合只能使用迭代器

新循环可以遍历集合,因为 新循环的实现机制也是使用的迭代器

Set集合常用的实现类

HashSet: 使用哈希算法实现

TreeSet:  使用二叉树实现


HashSet和hashCode的关系

hashCode()是Object中定义的方法

HashSet在add元素时,会根据该元素的hashCode()返回值进行计算,来决定元素的位置。

hashCode()返回的是一个整数。



HashCode

Object中提供的方法,默认是返回该对象的地址的整数形式。

API中对hashCode()方法进行了说明。

对于重写了equals方法的类,应该也重写hashCode()。


重写hashCode的要求:

 1:与equals保持一致,equals返回true的时候,两个对象的hashCode值也应该相同。

 2: hashcode值应该是一个稳定的值,在对象内容不发生改变的情况下,hashCode()方法返回值不应该改变。所谓对象内容不发生变化,指的是参与equals比较逻辑的内容不发生变化。


每个集合的实现类都支持一个复制构造器。可以在创建该集合时将给定的集合中的元素存入当前集合。

注意,通过复制构造器我们仅仅是创建了一个新集合,对于元素来讲,并没有被复制!


Map集合

注意,其不是Collection的子类,Map集合是以key-value的形式存储数据的。

存储元素要成对出现,一个key对应一个value,Map很像多行两列的表。

根据内部实现机制不同,常见的是 HashMap。使用Hash算法实现。 TreeMap。使用二叉树实现。


Map存取元素的方法


V  put(K key,V value):将value以key作为一对存入map。Map的一个强制要求, key在整个Map中不能重复。 若使用相同的key存放数据,叫做替换value。返回值就是使用相同key被替换的value。若第一次使用key存放数据,返回值为null


V  get(Object key):根据给定的key值获取对应的value,若该key在map中不存在则返回null


HashMap存放元素时,会根据key的hashCode()值进行hash算法,用来计算这组key-value应存放的位置。若key的hashCode值根据计算得到的位置已经有元素占用了,那么该值会存放在那个元素的后边,因为HashMap中存放元素在位置相同的地方使用链表的形式存放每组数据的。


HashMap中存放数据的数组叫做 散列数组。

容量:散列数组的大小

初始容量:刚创建HashMap时,散列数组的大小,默认16

大小:hashmap中存储的元素数量


加载因子:根据实验表明,加载因子保持在 0.75 以下,hashmap检索效率最高

加载因子=大小/容量


设计模式

1:单例模式

 任何时候,该类只且仅有一个实   例

 

 实现需要3步:

 1:私有化构造方法

 2:定义私有的静态的当前类型实例的属性,并实例化

 3:定义公有的静态的返回当前类型实例的方法


模板模式

相关文章
|
21天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
38 1
|
22天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
30 2
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
12天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
12天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
12天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
21天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
18 1
|
21天前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
18 1
|
22天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
Kotlin语法笔记(28) -Kotlin 与 Java 混编
24 2
|
28天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”