Java常用类操作和单例模式的体现

  主要还是要多查文档API这里只是提示一些主要的。

  当查看API的时候,发现没有公共构造器,但是方法又不是static修饰符修饰的,立马就要意识到,该类中至少有一个static方法用于返回当前对象。这就体现了单例模式

和系统相关的类:

System:表示系统的意思

Runtime:表示java的运行程序

数组拷贝:

  arraycopy(原数组,从原数组哪一个索引开始拷贝,目标数组,在目标数组哪一个位置开始粘贴,拷贝元素的个数)

退出程序(JVM),一般的,传入0表示正常结束,其他表示异常结束 static void exit(int status);

  System.exit(0);

强制运行java垃圾回收器 public static void gc():

  System.gc();

 

和数学相关的三个常用类

1. Math:Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

  static double random() 返回带正号的double值,该值大于等于0.0且小于1.0

2. BigDecimal:float和double都不能表示精确的小数,此时使用BigDecimal,用于表示处理金钱和精度要求高的数据。

  BigDecimal属于对象级别

  BigDecimal num1 = new BigDecimal(Double num);

  此构造方法(double类型)的结果有一定的不可预知性。有人可能认为在 Java 中写入new BigDecimal(0.1)所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 。0.10000000000000000555111512312578270

  另一方面,String构造方法是完全可预知的:写入 new BigDecimal(0.1)将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用 String构造方法

  当 double必须用作 BigDecimal的源时,先转换为String类型。

  加:BigDecimal add(BigDecimal other);

  :BigDecimal subtract(BigDecimal other);

  :BigDecimal multiply(BigDecimal other);

  :BigDecimal divide(BigDecimal other);

3. BigInteger:表示大整型,如果两个long类型的最大值相运算,结果long再也存储不下,此时使用BigInteger。

  加,减,乘,除的方法与BigDecimal用法相同。

 

字符序列:把多个字符按照一定的顺序排列起来。字符串把多个字符串联起来

拼接字符串使用StringBuilder不要用StringBuffer或者String

字符串的分类

  不可变的字符串:当对象创建完毕之后,该对象的内容是不能改变的。一旦内容改变就是一个新的对象。(String

  可变的字符串:当对象创建完毕之后,该对象的内容是可以改变的。当内容发生改变的时候,对象保持不变。(StringBuilder/StringBuffer

字符串的本质:底层其实就是一个char数组

  String str = "ABCDEFG"; //定义一个字符串对象 等价于 char[] cs = new char[]{"A","B","C","D","E","F","G"};

String类:表示不可变的字符串,当前对象创建完毕后,该对象的内容(字符序列)是不能改变的,一旦改变就是一个新对象。

String对象的空值:

  1. 表示引用为空(null):String str1 = null; 没有初始化,没有分配内存空间。

  2. 内容为空字符串:     String str2 = “”; 已经初始化,分配内存空间,不过没有内容。

判断字符串非空:

  1. 引用不能为空。2. 字符内容不能为字符串。

字符串的比较操作:

1. 使用“==”:    只能比较引用的内存地址是否相同

2. 使用equals方法:在Object类中和“==”号相同,建议子类覆盖equals方法去比较自己的内容

String对象比较:

1. 单独使用""引号创建的字符串都是直接量,编译器就应经确定存储到常量池中

2. 使用new String("")创建的对象会存储到堆内存中,是运行期才创建的

3. 使用只包含直接量的字符串连接符如"aa"+"bb"创建的也是直接量编译器就能确定,已经确定存储到常量池中

4. 使用包含String直接量(无fianl修饰符)的字符串表达式(如"aa"+s1)创建的对象是运行期才创建的,存储在堆中

String常用方法

1. String的创建和转换

  byte[] getBytes(); 把字符串转换为byte数组

  char[] toCharArray(); 把字符串转换为char数组

  String(byte[] bytes); 把byte数组转换为字符串

  String(cahr[] value); 把char数组转换为字符串

2. 获取字符串信息

  int length() 返回此字符串的长度

  char charAt(int index) 返回指定索引处的char值

  int indexOf(String str) 返回指定字符串在此字符串中第一次出现处的索引

  int lastIndexOf(String str) 返回指定字符串在此字符串中最右边出现处的索引

3. 字符串比较

  boolean equals(Object anObject) 将此字符串与指定的对象比较

  boolean equalsIgnoreCase(String anotherString) 将此String与另一个String比较,不考虑大小写

  boolean contentEquals(CharSequencr cs) 和equals底层相同

4. 字符串大小写转换操作

  String toUpperCase(); 转大写

  String toLowerCase(); 转小写

5. 字符串操作

  String[] split(String s); 分割字符串

  boolean startsWith(String s); 判断字符串是否以什么开头

  String substring(int beginIndex); 截取字符串从beginIndex到最后

  String substring(int beginIndex , endIndex); 截取字符串从beginIndex到endIndex

  String trim(); 忽略前面和后面空白的内容

String和StringBuilder以及StringBuffer的区别

StringBuffer和StringBuffer都表示可变的字符串,功能方法都是相同的。

唯一区别:

StringBuffer:StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低

StringBuilder:StringBuilder中的方法都没有使用synchronized修饰符,不安全,但性能较高

StringBuilder:

使用StringBuilder无参数构造器,在底层创建了一个长度为16的char数组:

  char[] value = new char[16];

此时该数组只能存储16个字符,如果超过了的自动扩容(创建长度更大的数组,再把之前的数组拷贝到新数组)

此时的性能较低,一般的,我们事先知道大概需要存储多少字符,构造器中就应该设置。

//创建一个长度为80的char数组

new StringBuilder(80);

StringBuilder append(Object val); 表示追加任意类型数据

StringBuilder deleteCharAt(int index); 删除字符串中指定位置的字符

常量池:专门存放常量的地方

编译常量池:把字节码加入进JVM的时候,储存的是字节码的先关信息。

运行常量池:存储常量数据(研究)。

 

随机数:随机生成的任意的一个数(理论上讲具有不可预知性)

Random类用于生产一个随机数(通过相同的种子,产生的随机数是相同的)

public Random(); 使用默认的种子。

public Random(long seed); 根据指定的种子。

ThreadLocalRandom是java7新增类。是Random类的子类,在多线程并发情况下,ThreadLocalRandom相对于Random可以减少多线程资源竞争,保证了线程的安全性。

因为都早起是默认访问权限,只能在java.util包中创建对象,所以提供了一个ThreadLocalRandom.current()用于返回当前类对象。

ThreadLocalRandom random = ThreadLocaleRandom.current();

System.out.println(random.nextInt(34,179)); //生成34到79之前的随机数。

UUID:通用唯一标示: Universally Unique Identifier,在一台机器上生成的数字,它保证对在同一时空的所有机器都是唯一的

UUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID。

我们一般用来表示:随机的唯一一个字符串。

String code = UUID.randomUUID().toString();

ThreadLocalRandom和UUID都可用于生成验证码。

 

时期相关类

Date类:java.util.Date类,不是java.sql.Date,类Date表示特定的瞬间,精确到毫秒。

DateFormat/SimpleDateformat类

日期的格式化:DateFormat可以完成日期的格式化操作

  格式化(format):Date类型对象那过----》String类型  String format(Date d)

  解析(parse):String类型时间----》Date类型  Date parse(String time)

 

返回以毫秒为单位的当前时间 static long currentTimeMillis();

long time = System.currentTimeMillis();//多用于测试某一个操作的损耗时间

 

DateFormar转换的格式是固定的,所以使用SimpleDateformat支持自定义时间格式类型。

SimpleDateformat sdf = new SimpleDateformat(yyyy-MM-dd HH:dd:ss);//大写SS代表毫秒数

String time = sdf.format(new Date());

Date date = sdf.parse(time);

Calendar(日历类):是抽象类,表示日历,比Date更强大

Calendar cal = Calendar.getInstance();//创建日历对象

  int get(int field);返回给定日历字段(年,月,日,时,分,秒)的值。

cal.get(Calendar.YEAR)//或取年

  月是从0开始计算0~11

Date d = cal.getTime();//Calendar转换为Date类型

void add(int field , int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量

cal.add(Calendar.DAY_OF_MONTH,-100); //往日期前推100天

cal.add(Calendar.YEAR,-100); //往前推100年

void set(int field , int value); //将给定的日历字段设置给定值

void set(int year, int month , int date); //设置日历字段YEAR,MONTH和DAY_OF_MONTH的值保留其他字段以前的值。如果不需要这样做,则先调用clear()。

(还有更多多参数的方法)

 

正则表达式(Regex)表示表达式正确的规则:

Pattern类代表正则表达式的模式(可查看jdk源代码)

主要用于(匹配判断),分割操作,替换操作(网络爬虫中应用较多)

String中的matches方法用于判断字符串是否符合正则表达式

例:"123456".matches("\\d");(\转义字符)

 

posted @ 2017-01-09 14:47  wenxudong  阅读(354)  评论(0编辑  收藏  举报