字符串操作
String类
- String可以表示一个字符串。
- String类实际是使用字符数组存储的。
String类的两种赋值方式:
- 一种称为直接赋值:
String name = “小白”
- 通过关键字new调用String的构造方法赋值
String name = new String(“小白”)
String类的两种赋值分析:
- 字符串常量池
- String name = new String(“小白”),在内存中的分析
- String name =“小白”,在内存中的分析
String类编译期与运行期分析:
- 编译期和运行期
- 代码示例:4种情况分析
String类字符与字符串操作方法:
String类字节与字符串操作方法:
String类判断是否以指定内容开头或结尾:
String类替换操作:
String类字符串截取操作:
String类字符串拆分操作:
String类字符串查找操作:
String类其它操作方法:
StringBuffer类
在实际开发当中,我们经常会使用到字符串连接的操作,如果用String来操作,则使用“+”号完成字符串的连接操作。
使用String连接字符串,代码性能会非常低,因为String的内容不可改变。
解决这个问题的方法是使用StringBuffer。
StringBuffer类源码分析
StringBuffer常用操作方法
StringBuilder类
StringBuffer的兄弟StringBuilder:
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。
JDK1.5以后,字符串相加原理分析
程序国际化
对国际化程序的理解
Internationalization:国际化程序可以这样理解:
- 同一套程序代码可以在各个语言环境下进行使用。
- 各个语言环境下,只是语言显示的不同,那么具体的程序操作本身都是一样的,那么国际化程序完成的就是这样的一个功能
Locale类
Locale 对象表示了特定的地理、政治和文化地区。需要 Locale 来执行其任务的操作称为语言环境敏感的操作,它使用 Locale 为用户量身定制信息。例如,显示一个数值就是语言环境敏感的操作,应该根据用户的国家、地区或文化的风俗/传统来格式化该数值。
- 使用此类中的构造方法来创建 Locale:
Locale(String language)
Locale(String language, String country)
- 通过静态方法创建Locale:
getDefault()
ResourceBundle类
国际化的实现核心在于显示的语言上,通常的做法是将其定义成若干个属性文件(文件后缀是*.properties),属性文件中的格式采用“key=value”的格式进行操作。
- ResourceBundle类表示的是一个资源文件的读取操作,所有的资源文件需要使用
- ResourceBundle进行读取,读取的时候不需要加上文件的后缀。
- getBundle(String baseName)
- getBundle(String baseName,Locale locale)
- getString(String key)
处理动态文本
- 前面的示例读取的内容都是固定的,如果现在假设要想打印这样的信息“欢迎你,XXX!”,具体的名字不是固定的,那么就要使用动态文本进行程序的处理。
- 进行动态的文本处理,必须使用java.text.MessageFormat类完成。这个类是java.text.Format的子类。
Math与Random类
Math类
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
使用Math类可以有两种方式:
- 直接使用(Math所在的包java.lang为默认引入的包)
- 使用 import static java.lang.Math.abs; 静态导入
Random类
Random:此类的实例用于生成伪随机数流
日期操作类
Date类
- 类 Date 表示特定的瞬间,精确到毫秒,也就是程序运行时的当前时间。
Date date = new Date(); // 实例化Date对象,表示当前时间
Calendar类
- Calendar,日历类,使用此类可以将时间精确到毫秒显示。
//两种实例化方式
Calendar c = Calendar.getInstance();
Calendar c = new GregorianCalendar();
DateFormat类及子类SimpleDateFormat
对象比较器
对两个或多个数据项进行比较,以确定它们是否相等,或确定它们之间的大小关系及排列顺序称为比较。
前面我学习过Arrays.sort方法可实现对象的排序操作:
public static void sort(Object[] a)
Comparable接口:
- 此接口强行对实现它的每个类的对象进行整体排序。
- 这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
Comparator接口:
- Comparable接口是要求自定义类去实现,按照OO原则:对修改关闭,对扩展开放。
- 那么如果这个类已经定义好了,不想再去修改它,那如何实现比较呢?
- Comparator接口:强行对某个对象collection进行整体排序的比较。
对象的克隆
将一个对象复制一份,称为对象的克隆技术。
在Object类中存在一个clone()方法:
protected Object clone() throws CloneNotSupportedException
如果某个类的对象要想被克隆,则对象所在的类必须实现Cloneable接口。此接口没有定义任何方法,是一个标记接口。
System与 Runtime类
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
成员变量
- System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流。
成员方法
System类中提供了一些系统级的操作方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- 该方法的作用是数组拷贝,也就是将一个数组中的内容复制到另外一个数组中的指定位置
- 由于该方法是native方法,所以性能上比使用循环高效。
public static long currentTimeMillis()
- 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间1970年1月1号0时0分0秒所差的毫秒数。
public static void exit(int status)
- 该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。
- 使用该方法可以在图形界面编程中实现程序的退出功能等。
public static void gc()
- 该方法的作用是请求系统进行垃圾回收。
- 至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
public static String getProperty(String key)
- 该方法的作用是获得系统中属性名为key的属性对应的值。
- java.version Java 运行时环境版本
- java.home Java 安装目录
- os.name 操作系统的名称
- os.version 操作系统的版本
- user.name 用户的账户名称
- user.home 用户的主目录
- user.dir 用户的当前工作目录
Runtime类:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
//获取Java运行时相关的运行时对象
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量:" + rt.availableProcessors()+" 个");
System.out.println("Jvm总内存数 :"+ rt.totalMemory()+" byte");
System.out.println("Jvm空闲内存数:"+ rt.freeMemory()+" byte");
System.out.println("Jvm可用最大内存数:"+ rt.maxMemory()+" byte");
//在单独的进程中执行指定的字符串命令。
rt.exec("notepad");
数字处理工具类
- BigInteger:可以让超过Integer范围内的数据进行运算。
构造方法:
public BigInteger(String val)
常用方法:
public BigInteger add(BigInteger val)
public BigInteger subtract(BigInteger val)
public BigInteger multiply(BigInteger val)
public BigInteger divide(BigInteger val)
public BigInteger[] divideAndRemainder(BigInteger val)
- BigDecimal:由于在运算的时候,float类型和double很容易丢失精度,为了能精确的表示、计算浮点数,Java提供了BigDecimal,
不可变的、任意精度的有符号十进制数。
构造方法:
public BigDecimal(String val)
常用方法:
public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor)
- DecimalFormat:Java 提供 DecimalFormat类,帮你用最快的速度将数字格式化为你需要的样子。
例如,取2位小数。
示例:
double pi=3.1415927; //圆周率
//取一位整数,结果:3
System.out.println(new DecimalFormat("0").format(pi));
//取一位整数和两位小数,结果3.14
System.out.println(new DecimalFormat("0.00").format(pi));
//取两位整数和三位小数,整数不足部分以0填补,结果:03.142
System.out.println(new DecimalFormat("00.000").format(pi));
//取所有整数部分,结果:3
System.out.println(new DecimalFormat("#").format(pi));
//以百分比方式计数,并取两位小数,结果:314.16%
System.out.println(new DecimalFormat("#.##%").format(pi));
MD5工具类
- MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)
//确定计算方法
MessageDigest md5=MessageDigest.getInstance("MD5");
//JDK1.8新增Base64
String newstr = Base64.getEncoder().encodeToString(md5.digest(str.getBytes("utf-8")));
//1.8之前使用sun.misc.BASE64Encoder(此类没有访问权限,在rt.jar中添加访问权限:sun/misc/*)
BASE64Encoder base64 = new BASE64Encoder();
base64.encode(md5.digest(str.getBytes("utf-8")));
数据结构之二叉树实现
- 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。
- 二叉树(Binary Tree)是每个节点最多有两个子树的有序树。通常子树被称作“左子树” 和“右子树”。
二叉树算法的排序规则:
- 选择第一个元素作为根节点
- 之后如果元素大于根节点放在右子树,如果元素小于根节点,则放在左子树
- 最后按照中序遍历的方式进行输出,则可以得到排序的结果(左->根->右)
8、3、10、1、6、14、4、7、13
JDK1.8新特性
Lambda表达式
- Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变
- Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据。
- Lambda表达式用于简化JAVA中接口式的匿名内部类。被称为函数式接口的概念。
- 函数式接口就是一个具有一个方法的普通接口。像这样的接口,可以被隐式转换为lambda表达式。
语法:
(参数1,参数2...) -> { ... }
- 没有参数时使用Lambda表达式
- 带参数时使用Lambda表达式
- 代码块中只一句代码时使用Lambda表达式
- 代码块中有多句代码时使用Lambda表达式
- 有返回值的代码块
- 参数中使用final关键字
接口中的默认方法和静态方法
interface A{public default void print(){}public static void method(){}
}
默认方法与静态方法并不影响函数式接口的契约,可以任意使用