1.String的特性

代表字符串,java中所有字符串字面值都作为此类的实现例实现。String是一个final类,不能被继承。String实现了Serialiable,表示字符串支持序列化,实现了Comarable,表示String可以比较大小。

1.1 String不可变性:减少大量的同步锁

String不可变性是指内部维护一个不可变的char数组,来向外输出的。上为jdk中的代码,类由final修饰表示是不可继承的;核心域value[]是private final的,final表示此引用指向的内存地址不会发生改变,但是内存地址中存储的值仍可能会发生改变。

为了解决这一问题jdk采用了“保护性拷贝”,使得内存地址中存储的值不会发生改变:  

面试题:

public class StringTest {
private String str = "good";
private char[] ch = {'t', 'e', 's', 't'}; public void change(String str, char[] ch) {
str = "testGood";
ch[0] = 'b';
} public static void main(String[] args) {
StringTest stringTest = new StringTest();
stringTest.change(stringTest.str, stringTest.ch);
System.out.println(stringTest.str);
System.out.println(stringTest.ch);
//good
//best
}
}

Java引用型变量作为形参时,传递给方法的是变量的内存地址,str此时传递的是内存方法区的常量池中的“good”字符串的内存地址,属性str作为String类型指向的字符数组“good”内存地址不可变,而不是str这个string引用指向不可变

1.2 String的定义方式

1.字面量的定义方式

String s = “abc”;字符串"abc"声明在内存方法区的字符串常量池中,并将字符串地址赋值给s。字符串常量池是不会存储两个相同的字符串

2.new方式

两种方式的区别:字符串常量存储在方法区的常量池,非常量对象存储在堆中

        String s1 = "javaEE";
String s2 = "javaEE"; String s3 = new String("javaEE");
String s4 = new String("javaEE"); System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s3 == s4);//false

String s = new String("abc");方式创建对象,在内存中创建了几个对象?

两个:一个是堆空间的new结构,另一个是方法区常量池中的char[]数据"abc"

public static void main(String[] args) {
String s1 = "javaEE";
String s2 = "hadoop"; String s3 = "javaEE" + "hadoop";
String s4 = s1 + "hadoop";
String s5 = "javaEE" + s2;
String s6 = s1 + s2;
String s7 = "javaEEhadoop";
String s8 = (s1 + s2).intern();
String s9 = s1 + s2; System.out.println(s3 == s4);//false
System.out.println(s5 == s4);//false
System.out.println(s5 == s6);//false
System.out.println(s7 == s3);//true
System.out.println("javaEEhadoop" == s8);//true
System.out.println(s9 == s6);//false
};//true
}

凡是涉及到对象名、数组名(new出来的结构)均声明在堆结构中,与字面量结构做连接运算也会在堆结构new新对象。(s1 + s2).intern()因为使用intern结果也存储于方法区常量池中。

1.3 String的常用方法

chatAt(int index)
length()
isEmpty()
toLowerCase()
toUperCase()
trim() 忽略前后空白
equalsIgnoreCase()
concat() +
compareTo() 比较字符串大小
substring(int startIndex)
substring(int startIndex. int endIndex)
boolean endsWith(String suffix)
boolean startsWith(String suffix)
boolean startsWith(String suffix, int index)
boolean contains(charSquence)
int indexOf(String str) 返回子串第一次出现的索引
int indexOf(String str, int fromIndex) 从指定索引开始
int lastIndexOf(String str) 返回子串最后一次出现的索引
int lastIndexOf(String str, int fromIndex) 从指定索引开始反向搜索
String replace(char oldChar, char newChar) 替换全部的字符
String replaceAll(String regex, String new) 正则替换
boolean matches(String regex)
String[] split(String regex) 按照正则表达式拆分字符串
String[] split(String regex, int limit)

1.4 String与其它结构之间的转换

String -> 基本数据类型、包装类:Integer.parseInt(str);

基本数据类型、包装类 -> String: ①String.valueOf(****);

② +""

String -> char[]:str.tocharArray()

String -> byte[]:str.getBytes()    编码

byte[] -> String:Arrays.toString()

new String(bytes, "编码") 解码

1.5 StringBuffer和StringBuilder

StringBuffer:可变的字符序列,方法均为synchronized同步方法,线程安全但是效率偏低。底层数组创建初始长度为16方便修改,长度不足时进行扩容底层的数组,默认情况下扩容为原来容量的二倍 + 2,同时将原来数组的元素赋值到新数组中。

另外也可以在new的时候设置构造器参数为字符串长度。

StringBuffer sb = new StringBuffer(int strLength);

StringBuilder:可变的字符序列,线程不安全但是效率高一些。

StringBuffer 常用方法

append()
delete()
replace(int start, int end, String str),setCharAt(int index,char ch)
subString(int start, int end)、charAt(int index)
insert(int start, String str)
length() 长度
reverse() 字符串翻转,String没有
for + charAt(int index) 遍历

效率:StringBuilder > StringBuffer > String

一些注意点

append对于null的处理是转换为字符串“null”然后进行添加。

public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
String str = null;
sb.append(str);
System.out.println(sb.length());//4
System.out.println(sb);//"null" sb = new StringBuffer(str);//抛出异常 }

2.Date

System
long System.currentTimeMillis() 返回当前时间与1970年1月1日0时0分0秒之间以毫秒计数的时间差。一般称为时间戳。

java.uti.Date

两个构造器
Date date = new Date() 创建一个当前时间的Date对象,toString()展示当前时间的年月日时间。
Date date = new Date(年月日、毫秒数) 创建指定时间的Date对象。

date.getTime()也可以获取当前时间与1970年1月1日0时0分0秒之间以毫秒计数的时间差。

java.sql.Date

toString() 显示年-月-日

sqlDate对象 -> utilDate对象转换:子类转父类体现多态,父类转子类需要强转且声明的父类本来就是new的子类

java.util.Date date = new java.sql.Date(1991, 10, 1);//子类转父类体现了多态
java.sql.Date date1 = new java.sql.date(date.getTime());//父类转子类的解决方法

3.java.text.SimpleDateFormat

Date类不易于国家化,java.text.SimpleDateFormat是一个不与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化和解析

格式化:日期->文本
new SimpleDateFormat() 默认构造器,结果为22-3-14 下午4:10的形式
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 2022-03-14 04:12:40
sdf.format(date)
解析:文本->日期
sdf.parse(str)

4 java.util.calendar 日历类的使用

实例化方法
Calendar calendar = Calendar.getInstance(); 对象仍是Calendar的子类GregorianCalendar的对象
Calendar calendar = new GregorianCalendar();
常用方法
get(Calendar.DAY_OFMONTH) 获取一些常用数据
set(date) Date->Calendar
add()
getTime() 返回Date对象
setTime()

5.jdk8新时间API java.time

原来存在的问题

1.日期时间应该是不可变的。(通过构造器创建Date对象年份需要-1990月份需要-1)

2.Date中的年份是从1900年开始,而月份是从0开始。

3.格式化只对Date有用,对Calendar没用。

4.它们线程不安全,不能处理闰秒。

实例化方式一:获取当前时间

        LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime.now();
LocalDateTime ldt = LocalDateTime.now();
        LocalDateTime of = LocalDateTime.of(2022, 10, 6, 19, 10, 0);

实例化方式二:获取设置时间

        System.out.println(of.getDayOfMonth());
System.out.println(of.getDayOfWeek());
System.out.println(of.getYear());
System.out.println(of.getMonth());

with的"不可变性"

        LocalDateTime of2 = of.withDayOfMonth(15);
System.out.println(of);//没有改变
System.out.println(of2);//发生改变

plus方法

        LocalDateTime of2 = of.plusDays(1);
System.out.println(of)//没有改变;
System.out.println(of2//发生改变);

6.Instant 瞬时

面向机器的以毫秒计数记录应用时间的时间戳。

Instant.now() 以本初子午线中时区为基准
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); 东八区时间

7.java.date.format.DateTimeFormat

格式化解析LocalDate、LocalTime、LocalDateTime日期和时间,类似于SimpleDataFormat

初始化方式:

//1.预定义的标准格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
//2.本地相关的格式
//3.自定义的格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

8.System

成员方法
System.currentTimeMillis()
void exit(int status) 退出程序,0代表正常退出,非0代表异常退出
void gc() 请求系统进行垃圾回收
String System.getProperty("")

9.Math

10.BigInteger与BigDecimal

BigInteger

Integer最大231-1,Long最大263-1,BigInteger可表示不可变的任意精度的整数。

BigInteger构造器

BigInteger(String val):根据字符串构建BigInteger对象。

常用方法
BigInteger abs()
BigInteger add(BigInteger val) +
BigInteger subtract(BigInteger val) -
BigInteger multiply(BigInteger val)
BigInteger divide(BigInteger val) /
BigInteger remainder(BigInteger val) %
BigInteger[] divideAndRemainder(BigInteger val) 返回包含(this/val)和(this%val)的BigInteger数组
BigInteger pow(int exponent)

“不变性”

        BigInteger b = new BigInteger("111111111111111111111111111111111111111111111111111111");
BigInteger c = b;
b.add(c);
System.out.println(b);//不发生改变
System.out.println(c);//不发生改变
        BigInteger b = new BigInteger("111111111111111111111111111111111111111111111111111111");
BigInteger c = b;
b = b.add(c);
System.out.println(b);//发生改变
System.out.println(c);//不变

BigDecimal

BigDecimal构造器

BigDecimal bigDecimal = new BigDecimal(double val);

BigDecimal bigDecimal = new BigDecimal(String val);

通过BigDecimal实现保留小数点

public BigDecimal setScale(int newScale,int roundingMode)

newScale表示保留的位数

roundingMode表示要保留的类型

roundingMode类型
BigDecimal.ROUND_HALF_UP 四舍五入
BigDecimal.ROUND_HALF_DOWN 四舍五入
ROUND_UP 只要弃位非0就进一位
ROUND_DOWN 不管如何都不会进位

【JavaSE】Java常用类的更多相关文章

  1. Java基础 —— Java常用类

    Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...

  2. Java常用类之要点总结

    Java常用类之要点总结

  3. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

  4. Java常用类学习笔记总结

    Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...

  5. Java 常用类总结(SE基础)

    本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...

  6. Java常用类的使用

    Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...

  7. Java常用类之String类、Stringbuffer和Random类练习

    定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...

  8. java常用类-上

    一,常用类之一包装类 java开发中习惯把八大基本数据类型封装到一个类中,并提供属性和方法,更方便的操作基本数据类型. 包装类的出现并不是用于取代基本数据类型,也取代不了. 包装类位于java.lan ...

  9. 第十四章 Java常用类

    14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...

  10. Java 常用类String类、StringBuffer类

    常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...

随机推荐

  1. 常用功能系列---【JWT生成Token实现接口登录认证方案思路】

    JWT生成Token实现接口登录认证方案思路 方案一(双token实现无感刷新) 在token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录,跳转至登录页面. 但是 ...

  2. k8s重启应用

    [root@k8s-master01 opt_k8s]# cat app_list xxx-supervise-srv xxx-recon-srv xxx-mkt-strategy-srv xxx-u ...

  3. dart 环境搭建

    1. 打开dart官网 获取 Dart SDK | Dart 2. 安装Chocolatey,以管理员身份打开cmd,输入下面代码 Set-ExecutionPolicy Bypass -Scope ...

  4. org.nutz.http.Http忽略https SSL证书验证

    访问的是一个https get请求,报错需要SSL证书验证,以下方法直接跳过 boolean check = Http.disableJvmHttpsCheck(); // 忽略https的证书检查

  5. 转 oracle 无法使用sys用户登录 connection as SYS should be as SYSDBA OR SYSOPER

    转自:  https://blog.csdn.net/u012004128/article/details/80781979 安装Oracle11g后,为了测试安装是否成功,通过cmd命令打开了sql ...

  6. NodeJS - XSS-href

    参考:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-href-xss-href/kbid-3-xss-url 输入h ...

  7. EF 操作实例

    一.Linq语法 List操作 1.1          有参 public List<GoodsInfo> ShowInfo(string GName,int?Gid) { //true ...

  8. windows系统,自动设置--shutdown命令了解

    参考:https://baike.baidu.com/item/shutdown/10469108?fr=aladdin 比如你的电脑要在24:00关机,可以选择"开始运行",输入 ...

  9. java8 stream按某个字段分组,允许分组字段是null

    Map<String, List<Dto>> deviceMap = deviceList.stream().collect(Collectors.groupingBy(Dto ...

  10. Flask CURD(增删改查)

    1.创建flask项目 2.修改配置文件: ''' config.py 保存项目配置 ''' 导入Flask模块 from flask import Flask 额外安装: 数据库操作模块 from ...