黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算


采用直接赋值的方式,如果字符串相等,则会去字符串常量池中直接找到相应字符串的地址。
jdk7之后堆内存是跟方法的执行有关,进栈出栈
堆内存跟对象的存储有关,字符串常量池也在堆内存中

new出来的字符串会在堆内存中新开辟存储空间,所以引用同一个字符数组,它们的地址值也不同。



ctrl+alt+t快捷键

Scanner sc = new Scanner(System.in);
String str = sc.next();
system.out.println("请输入字符串");
int bigcount; //大写字母计数器
int smallcount; //小写字母计数器
int numbercount; //数字计数器
for(i = 0;i<str.length();i++){
char c = str.charAt(i);
if(c>= 'a' && c<='z'){
smallcount++;
}else if(c>= 'A' && c<='Z'){
bigcount++;
}else if(c>= '0' && c<='9'){
number++;
}else{
system.out.println("不属于统计范围");
}
}
system.out.println("大写字母:"+bigcount);
system.out.println("小写字母:"+smallcount);
system.out.println("数字:"+numbercount);

字符串拼接
金额转换代码
Scanner scanner = new Scanner(System.in); int money; while (true) { money = scanner.nextInt(); if (money >=0 && money <= 9999999){ break; }else { System.out.println("输入金额错误"); } } System.out.println(money); String moneyStr = ""; //用来获取大写转换之后的金额 // 从右往左,从个位到最高位 while (true) { //123 int ge = money % 10; //3 String capitialNumber = getCapitialNumber(ge); // 叁贰壹 moneyStr = capitialNumber + moneyStr; //用于正向输出,壹贰叁 money = money / 10; //12 if (money == 0){ break; } } System.out.println(moneyStr); // 表示单位的数组 String[] arr = {"零","佰","拾","仟","佰","拾","圆"}; int count = 7 - moneyStr.length(); for (int i = 0; i < count; i++) { moneyStr = "零" + moneyStr; } String result = ""; for (int i = 0; i < moneyStr.length(); i++) { char c = moneyStr.charAt(i); result = result + c + arr[i]; } System.out.println(result); } public static String getCapitialNumber(int number){ String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; return arr[number]; }

substring用法

StringBuilder只是一个容器,说白了就是一个工具类,而用其对字符串进行操作完之后,需要用toString()方法,转成字符串,才能用字符串的相关方法

StringBuilder中的方法

StringBuilder的应用场景

StringJoiner的构造方法




java8之前,有变量参与的字符串拼接是通过先在串池中存储,再通过StringBuilder进行字符串拼接,再toString进行字符串转换

StringBuilder的扩容机制



集合不能直接存基本数据类型,需要定义成相应的包装类,集合可以自由伸缩长度
数组可以直接存储基本数据类型和引用数据类型,数组长度固定
引入泛型的概念,在arraylist中指限定集合存储的类型

arraylist不能直接添加基本数据类型,要在泛型里面规定基本数据类型所对应的包装类

下面是错误示范,循环创建对象的时候要把对象放在循环里面,不然只是在循环外面创建了一个对象,而循环里面拿着这一个对象的地址值去创建对象,堆中的对象地址值是一样的,相当于复制。

shift+alt+↓可以一定代码,选中多行也可以移动多行
加了static的就是静态的东西,是随着类加载而加载的,优先于对象,是共享的

在类中,普通的成员方法默认会有一个this,记录方法调用者的地址值,这是由虚拟机赋值的,但是静态的成员没有this


静态方法中不能调用非静态的成员变量和方法
,因为上面已经说过,非静态的默认有一个this去调用变量和方法,而静态没有,也就是说静态没有对象去调用变量和方法



jdk9之后允许private修饰的方法,以下是jdk9用private修饰的方法



适配器设计模式:

当某个类只需要实现接口中的一部分方法时,可以在实现类与接口之间夹一层适配器类,对接口中的方法进行空实现,该实现类再去继承适配器,实现其中的某些方法就可以了

内部类有:成员内部类,静态内部类,局部内部类,匿名内部类

匿名内部类:这里所说的类名和接口名,其实是其他类的类名和接口名,匿名内部类本身没有名字
匿名内部类会在编译之后,java自动生成一个字节码文件,用来保存匿名内部类所包含的信息

找到这个字节码文件所在的包,利用javap 匿名内部类的字节码文件,就可以反编译出来

当一个类只用一次,比如狗这个类,只调用一次,这时就只需要把匿名内部类作为参数定义就可以了
整个匿名内部类可以看作一个对象,可以在大括号后面"."出来它包含的方法或属性

API

Math.cbrt()开立方根


System工具类

arraycopy:如果是基本数据类型,数据源数组与目的地数组的数据类型要一致,不然会报ArrayStoreException异常。
RunTime

System.out.println:
System:类名
out:java定义的静态变量
println:方法
当我们打印一个对象的时候,底层会调用对象的toString()方法,把对象变成字符串,打印在控制台上,打印完毕再进行处理
Object
1·toString()方法是Object类中的方法,其他类默认继承object类,想要打印对象可以在类中重写toString()方法
2·equals()与重写equals():如果不重写equals,默认使用的是Object类中的equals()方法,比较的是两个对象的地址值是否相等;在类中重新equals方法则,比较的是两个对象的内容是否相等。
instanceof是一个二元比较运算符,比较两边是否是同一对象或继承树中的对象,是则返回true



浅克隆:不管三七二十一,将要克隆对象的所有信息都拷贝到另一个对象中,缺点是原来的内容变了,拷贝过来的也要变

深克隆:只要不是手动new的东西,克隆的地址不变,比如字符串都是存储在串池中的,根据字符串优化机制,会找到内容相同的字符串,而数组则是new出来的,所以克隆时会新开辟空间,将原来数组中的内容复制过去。

重写clone()方法,使其变成深克隆,因为newData是新创建的数组,其地址值与原来数组的地址值不同,所以只要再把newData的地址值赋值给data就可以了

BigInteger

bigInteger一旦创建,则里面的值不能改变

BigInteger中的valueOf静态方法,等表示的范围限于Long类型的范围

正则表达式

[]:只匹配一个字符,要想多个匹配,可以多些几次或用{}
正则表达式里&只是表示一个符号,&&才是而且的意思
{}:表示前面匹配的表达式往后匹配多少次
(?i):忽略大小写
快速编辑正则表达式的插件:any-rule


爬虫(一般都是字符串):
1.先用Pattern.compile(“相应的正则表达式”).matcher(字符匹配器,要爬取的字符串),赋值给一个字符串变量m保存。
2.因为不知道字符串的长度,需要用while循环去循环获取
while(m.find()){//m.find()表示读取字符串中的内容
String s = m.group();
System.out.println(s);
}
有条件的匹配爬取:
String regex = "Java(?=8|11|17)"
其中只有在括号中的?表示前面的数据Java
?=表示匹配前面的数据,但是=后面的数据匹配上后不显示
?:表示:后面的数据也一块显示

贪婪爬取:
正则表达式后面只写+或者*
非贪婪爬取:
在+或者*后面再写一个?



Date d = new Date(0L);//表示时间原点
d.setTime(1000L);//setTime的参数是Long类型,并且返回的是从时间原点开始,过了1000毫秒的时间



先用SimpleDateFormat去规定格式
再用parse将传进来的字符串转换成日期对象
再用getTime方法获取毫秒值


Calendar是一个抽象类,不能直接new,需要用getIntence方法来创建对象。默认获取的是当前时间,会把所有信息都保存在一个叫ZoneInfo的数组中。



Integer调用valueOf()方法时,先判断传进来的数据是否在[-128,127]之间,如果在,则直接返回,不在则new一块空间存储数据。

模拟parseInt,将字符串转换为整型


mid = (min + max)/2 向下取整

等差数列法确定mid
