1,return 退出的是整个方法。
2.alt +回车 创建方法
3.选中区域 ctrl+alt +t :可以选择while 设置死循环
4.IDEA java 快捷键:
IDEA好用的快捷键(持续更新)_idea封装方法的快捷键_飞翔的摩多多的博客-CSDN博客
5.
堆内存:
栈内存: main
方法区:class 类
6.
在Java中,`Integer`和`int`是两种不同的数据类型。`Integer`是一个类,而`int`是原始数据类型。它们有一些重要的区别。
`Integer`是一个包装类,它提供了一些与整数相关的方法和属性。它可以被用作泛型类型参数,也可以与集合类一起使用。另一方面,`int`是基本的整数类型,不能直接用作泛型类型参数,也不能直接存储在集合类中。如果需要将`int`类型的数据存储在集合类中,需要使用`Integer`进行包装。
所以,如果你想在集合中存储整数数据,应该使用`Integer`而不是`int`。以下是一个示例:
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
for (Integer num : set) {
System.out.println(num);
}
以上代码使用了`Integer`作为集合的元素类型,并成功地将整数数据存储在集合中。
7.
在Java中,集合和数组都是用来存储一组元素的数据结构,但它们在实现和使用上有一些区别。
-
长度:数组在创建时需要指定固定的长度,而且长度是不可变的。而集合的长度是可变的,可以根据需要动态添加或删除元素。
-
类型:数组可以存储任何类型的元素,包括基本数据类型和对象类型。而集合只能存储对象类型的元素,不能直接存储基本数据类型,需要使用对应的包装类。
-
功能:数组提供了一些基本的操作方法,如获取指定位置的元素、修改指定位置的元素、遍历等。而集合在Java集合框架中提供了更丰富的功能和操作方法,如添加、删除、查找、排序、过滤等。
-
动态性:数组的长度是固定的,无法动态改变。而集合可以根据需要动态增加或减少元素的个数。
-
泛型支持:数组可以存储任何类型的元素,但在编译时无法对元素类型进行检查。而集合可以使用泛型来指定存储元素的类型,并在编译时进行类型检查,提高类型安全性。
总之,数组在使用上更加简单和直接,而集合在功能和灵活性上更加强大。在实际开发中,根据需求选择合适的数据结构非常重要。
// 声明一个整型数组
int[] array = new int[5];
// 添加数据到数组
array[0] = 1;
array[1] = 2;
array[2] = 3;
// 删除数组中的数据
array[1] = 0;
// 打印数组中的数据
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
import java.util.*;
// 声明一个整型集合
Set<Integer> set = new HashSet<>();
// 添加数据到集合
set.add(1);
set.add(2);
set.add(3);
// 删除集合中的数据
set.remove(2);
// 打印集合中的数据
for (Integer num : set) {
System.out.println(num);
}
请注意,集合类使用的是Set
接口的实现类HashSet
,并通过泛型<Integer>
指定集合中存储的是整数类型的数据。通过调用add()
方法向集合中添加数据,调用remove()
方法从集合中删除数据。遍历集合可以使用增强型for
循环。
类方法中可以直接访问类的成员,不能直接访问实例成员;
同一个类中,访问类成员,可以省略类名不写
实例方法中可以出现this关键字,类方法中不能出现this关键字
作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值
子类对象实际上是由子父类这两张设计图共同创建出来的
对象能直接访问什么成员,是由子父类这多张设计图共同决定的,这多张设计图对外暴露了什么成员,对象就可以访问什么成员
继承就是用extends关键字,让一个类和另一个类建立起一种父子关系。子类可以继承父类非私有的成员。
类的继承中,访问相同名称的成员变量,依照就近原则,优先访问近的成员变量。
先在子类的局部范围中
再在子类成员范围中
最后在父类的成员范围中找,没有则报错。
this 类的局部范围中 访问当前类的对象的 成员变量或者方法,
super 指在子类中访问父类(超类)的成员变量或者方法
eg:
this.name 获取当前类的成员变量name
super.name 在子类中 父类的成员变量name
子类的全部(有参或者无参)构造器 都会先执行父类的构造器 ,再执行自己的构造器
默认情况下,子类全部构造器的第一行代码都是 super() (写不写都有) ,它会调用父类的无参数构造器。
如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(….),指定去调用父类的有参数构造器
多态:对象多态 行为多态
小的范围可以放入大范围中 A (范围大)= NEW B(小范围)
对于方法,编译看左边 运行看右边
对于变量,编译看左边 运行也看左边
多态不能直接调用子类独有方法
可以通过强制类型转换实现。
A b = (A) a;
强转前建议使用instanceof 判断对象的真实类型
a instanceof A :判断a对象是否是A类,若真则返回true。
变量:
局部变量
成员变量:静态成员变量 实例成员变量
final 修饰变量,只能赋值一次。
final修饰方法,该方法不能重写
final修饰类,该类不能被继承
final 修饰基本变量,变量内容不能改变
final修饰引用型变量时,不变的是变量的地址,变量里的内容是可以改变的。如数组
static final 修饰的成员变量,我们成为常量:
public static final int PI =3.14;
PI不能被修改,常量名称建议大写,多个名称用下划线连接如SCHOOL_NAME
抽象类 不能创建对象,只能作为父类让子类继承
抽象类可以没有抽象方法,抽象方法 一定是在抽象类中
抽象方法:abstract 修饰 只有方法签名 一定没有方法体{ }
一个类继承抽象类,必须全部重写抽象类,否则 自己也必须是抽象类。
peek()返回是栈顶部元素 ,也即是最后一个压入栈的元素
StringBuffer是可变长度的字符串!
StringBuffer res = new StringBuffer()
它们就是一个变量和常量的关系。StringBuffer对象的内容可以修改,就想当与我们通常所说的变量了;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象,因而String对象就相当于我们所说的常量了
创建对象时占用内存不同
StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多.因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无疑是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次地对字符串重新分配内存。用StringBuffer类就避免了这个问题。
总结
String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。
在很多情况下我们的字符串拼接操作不需要线程安全,所以 StringBuilder 登场了。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
线程安全:
StringBuffer:线程安全
StringBuilder:线程不安全
速度:
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
使用环境:
操作少量的数据使用 String。
单线程操作大量数据使用 StringBuilder。
多线程操作大量数据使用 StringBuffer。
String、StringBuffer和StringBuilder类的区别 (biancheng.net)
char [] ch = s.toCharArray();
char[] ch = s.toCharArray();
这是一个很常见的操作, 将字符串s转换成字符数组的形式,好处是可以单独处理(查询或者删除)字符串中某一个单独字符.
// lambda 表达式设置优先级队列从小到大存储 o1 - o2 为从小到大,o2 - o1 反之!!!( 原来网页写错了 )
如下示例 从小到大:
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1])