String简介:
String是一个final类,代表不可变的字符序列。
String对象的字符内容是存储在一个字符数组value[]中的。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
String在JVM中:
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。 只要其中有一个是变量,结果就在堆中。
如果拼接的结果调用intern()方法,返回值就在常量池中。
String常用方法:
int length():
返回字符串的长度: return value.length
char charAt(int index):
返回某索引处的字符return value[index]
boolean isEmpty():
判断是否是空字符串:return value.length == 0
String toLowerCase():
使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase():
使用默认语言环境,将 String 中的所有字符转换为大写
String trim():
返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj):
比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):
与equals方法类似,忽略大小写
String concat(String str):
将指定字符串连接到此字符串的结尾。 等价于用“+”
`int compareTo(String anotherString):``比较两个字符串的大小
String substring(int beginIndex):
返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :
返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
boolean endsWith(String suffix):
测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):
测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):
测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):
当且仅当此字符串包含指定的 char 值序列时,返回 true
int indexOf(String str):
返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):
返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str):
返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
①注:indexOf和lastIndexOf方法如果未找到都是返回-1
String replace(char oldChar, char newChar):
返回一个新的字符串,它是 通过用 newChar替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):
使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) :
使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement) :
使用给定的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
boolean matches(String regex):
告知此字符串是否匹配给定的正则表达式。
String[] split(String regex):
根据给定正则表达式的匹配拆分此字符串。
①String有个方法是分割字符串 .split()。但是有写字符串是需要转义才能分割,不然就会出错。
②需要转义的字符串:. $ | ( ) [ { ^ ? * + \ 共12个特殊字符,遇到以这些字符进行分割字符串的时候,需要在这些特殊字符前加双反斜杠 \
String[] split(String regex, int limit):
根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
String format(String fmt, Object...args):
该方法使用指定的字符串格式和参数生成格式化的新字符串。 新字符串始终使用本地语言环境
String format(Locale locale, String fmt, Object... args):
该方法使用指定的语言环境、字符串格式和参数生成一个格式化的新字符串。新字符串始终使用指定的语言环境。
Java格式化输出:
String的底层结构:
String的底层结构是一个final类型的char数组。这意味着一旦创建了这个String实例,底层的char数组就不可以再指向别的引用,也不可以扩容。但是我们创建的String对象还是可以指向别的引用的。但是为什么String是不可变的呢,因此String类没有提供修改器方法。那我们可以通过继承String类手动实现修改器方法么,不可以。因此String类是final的,即不可继承的。
简介:
注意:
此外码是针对计算机而言。
String编码,解码总结:
因为ISO8859-1字符集只包含少部分中文
)。StringBuffer类:
---------------------------底层结构------------------------------
abstract class AbstractstringBuilder implements Appendable,charSequence {
//value没有final声明,value可以不断扩容。
char[] value;
//count记录有效字符的个数。
int count;
}
StringBuffer append(xxx):
提供了很多的append()方法,用于进行字符串拼接StringBuffer delete(int start,int end):
删除指定位置的内容StringBuffer replace(int start, int end, String str):
把[start,end)位置替换为strStringBuffer insert(int offset, xxx):
在指定位置插入xxxStringBuffer reverse() :
把当前字符序列逆转public int indexOf(String str)
public String substring(int start,int end)
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)
public String toString():
若不添加字符串,默认返回为空串。@override
public StringBuilder append( String str) i
super.append( str) ;
return this;
}
StringBuilder类:
面试题:对比String、StringBuffer、StringBuilder:
注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder 会改变其值
简述:
java.lang.System类:
java.util.Date类和java.sql.Date类:
java.text.SimpleDateFormat类:
java.util.Calendar(日历)类:
日期时间类更迭:
LocalDate类和LocalDateTime类和LocalTime类:
注意:
总结来说:
java(1.6) 中能保存时间日期类型的类主要有:
java.sql.Timestamp:时间戳(自1970年01月01日在伦敦(格林威治)算起)
日期时间类更迭概述:
从数据库中取值出来的日期类型放到这个类中的时候,会在时间位自动补上当前时间。这使得本来两个日期在数据库中是相等的,取出来放到这个类得时候就不再相等了,需要去考虑时间上的误差,很是头疼。
java提供与mysql方便交互的三种数据类型:
它们都是继承java.util.Date,算是对该类的精简,很适合跟数据库交互。
java.sql类与数据库的交互:
===========java注入数据库==========
java类型 mysql类型 成功与否
date date yes
date time no
date timestamp no
date datetime no
time date no
time time yes
time timestamp no
time datetime no
timestamp date yes
timestamp time yes
timestamp timestamp yes
timestamp datetime yes
==========end java注入数据库========
总规律,如果A完全包含B,则A可以向B注入数据,否则报错
==========从数据库提取到java ==========
mysql类型 java类型 成与否
date date yes
date time yes --------------缺少的部分使用历元
date timestamp yes --------------缺少的部分使用历元
time date yes --------------缺少的部分使用历元
time time yes
time timestamp yes --------------缺少的部分使用历元
timestamp date yes
timestamp time yes
timestamp timestamp yes
datetime date yes
datetime time yes
datetime timestamp yes
==========end 从数据库提取到java=======
不会出错,缺少的部分使用历元,而不是当前日期时间
mysql中的时间类型:
MYSQL-datatime和timestamp的区别:
数据库中datetime和timestamp最大不同在于timestamp带有时区。它是从格林威治时间(伦敦)1970. 01.01开始的。因此任何时间转化为时间戳时都会根据当前时区来转化。
TIMESTAMP和DATETIME除了存储范围和存储方式不一样,没有太大区别。当然,对于跨时区的业务,TIMESTAMP更为合适。
mysql> show variables like '%explicit_defaults_for_timestamp%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF |
+---------------------------------+-------+
row in set (0.00 sec)
timestamp有自动初始化和更新,当你update某条记录的时候,该列值会自动更新,这是和datatime最大的区别。
历元是怎么选取的?
这就需要在时间的某一点上作一个人为的标记,只有这样才能推算各个历史事件的准确时间。正像在坐标轴上选取原点一样。这就是所谓“历元”,历元就是开始纪年的时间。
在古代,每一种历法都有它自己的历元,每一个国家都有它自己的历元和纪年方法。历元的选取方法也各不相同,当然都是人为的、武断的。
有的是根据具体的历史事件选取历元,比如古罗马,曾以罗马城建立的时间作为纪元元年;信奉回教的阿訇们曾经以“象年”来纪年,这种纪年的开始是一个极有意义的地方事件——也门的军队进攻麦加,在军队里有许多战象。还有的是以皇帝登基的日子作为历元,如我国明太祖朱元璋的年号是“洪武”,他登基那年就是洪武元年。数据库与JAVA的时间总结:
Java时间字符串对应数据库时间字符串
Java时间整型对应数据库时间整型
Java时间相应类型对应数据库时间相应类型
Java中实现对象排序的方法有两种:
public interface Comparable<T> {
public int compareTo(T o);
}
public interface Comparator<T> {
int compare(T o1, T o2);
}
compare()方法注意:
compareTo()方法注意:
简述:
Math类简介:
double型
。Java生成随机数:
int i = (int)(Math.random()*900 + 100);
String myStr = Integer.toString(i);
System.out.println(myStr);
(int)(Math.random()*(max - min + 1) + min)
Random类:
random.nextInt():
random.nextIn()的作用是随机生成一个int类型,因为int 的取值范围是 -2147483648——2147483647random.nextInt(int bound):
random.nextInt(int bound)方法的作用是生成一个0-参数bound范围内的随机数,但是要记住,参数bound必须是正数,不可为负数random.nextLong():
random.nextLong()会随机生成一个Long类型,同理,因为Long的取值范围是 -9223372036854775808——9223372036854775807random.nextDouble():
random.nextDouble()会生成一个0-1的double类型,而不是生成double取值范围中的数random.nextFloat():
random.nextFloat()会生成一个随机的0-1之间的浮点型random.nextBoolean():
random.nextBoolean()会生成一个true或falserandom.nextBytes(byte[] bytes):
random.nextBytes()会为一个byte类型的数组随机赋值random.nextGaussian():
random.nextGaussian()的作用是随机生成一个高斯分布的浮点数BigInteger简介:
BigDecimal简介:
BigDecimal详解:
System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);
输出:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
所以接下来我们就可以使用Java中的BigDecimal类来解决这类问题。
构造器:
构造器 描述
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
函数:
方法 描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
我们在使用BigDecimal时,使用它的BigDecimal(String)构造器创建对象才有意义。
其他的如BigDecimal b = new BigDecimal(1)这种,还是会发生精度丢失的问题。如下代码:BigDecimal a = new BigDecimal(1.01);
BigDecimal b = new BigDecimal(1.02);
BigDecimal c = new BigDecimal("1.01");
BigDecimal d = new BigDecimal("1.02");
System.out.println(a.add(b));
System.out.println(c.add(d));
输出:
2.0300000000000000266453525910037569701671600341796875
2.03
可见论丢失精度BigDecimal显的更为过分。但是使用Bigdecimal的BigDecimal(String)构造器的变量在进行运算的时候却没有出现这种问题。究其原因计算机组成原理里面都有,它们的编码决定了这样的结果。
long可以准确存储19位数字,而double只能准备存储16位数字。double由于有exp位,可以存16位以上的数字,但是需要以低位的不精确作为代价。如果需要高于19位数字的精确存储,则必须用BigInteger来保存,当然会牺牲一些性能。所以我们一般使用BigDecimal来解决商业运算上丢失精度的问题的时候,声明BigDecimal对象的时候一定要使用它构造参数为String的类型的构造器。在一般开发过程中,我们数据库中存储的数据都是float和double类型的。在进行拿来拿去运算的时候还需要不断的转化,这样十分的不方便。这里我写了一个工具类:
public class BigDecimalUtil {
private BigDecimalUtil() {
}
public static BigDecimal add(double v1, double v2) {// v1 + v2
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
public static BigDecimal sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
public static BigDecimal mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
public static BigDecimal div(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
// 2 = 保留小数点后两位 ROUND_HALF_UP = 四舍五入
return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);// 应对除不尽的情况
}
}