Java核心编程总结(六、常用API与集合),字节跳动高级前端面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

// 2.创建一个简单日期格式化对象负责格式化日期对象

// 注意: 参数是时间的格式

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss EEE a”);

// 3.开始调用方法格式化时间得到格式化字符串形式

String rs = sdf.format(d);

System.out.println(rs);

// 2021年01月27日 17:35:55 周三 下午

}

}

面试: 请问"2019-11-01 09:30:30" 往后1天15小时30分29s 后的时间是多少

public class SimpleDateFormatDemo03 {

public static void main(String[] args) throws ParseException {

// 面试题: 请问 "2019-11-01 09:30:30 "往后 1天15小时,30分29s 后的时间是多少

// a.定义一个字符串时间

String date = “2019-11-01 09:30:30”;

// b.把字符串的时间解析成Date日期对象

// 1.创建一个简单日期格式化对象负责解析字符串的时间成为日期对象

// 注意: 参数必须与被解析的时间的格式完全一致,否则执行报错

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

// 2.开始解析成日期对象

Date newDate = sdf.parse(date);

// c.得到日期对象的时间毫秒值 + 往后走1天15小时,30分29s

long time = newDate.getTime() + (24L6060 + 156060 +30*60 +29) * 1000;

// d.把时间毫秒值格式化成喜欢的字符串的时间形式

System.out.println(sdf.format(time));

}

}

5.Calendar日历类


  • Calendar 代表了系统此刻日期对应的日历对象

  • Calendar 是一个抽象类,不能直接创建对象

  • 方法

  • public static Calendar getInstance() :返回一个日历类的对象

  • public int get(int field): 取日期中的某个字段信息

  • public void set(int field,int value):修改日历的某个字段信息

  • public void add(int field,int value):添加日历的某个字段信息

  • public final Date getTime():拿到此刻日期对象

  • public long getTimeInMillis(): 拿到此刻时间毫秒值

public class CalendarDemo01 {

public static void main(String[] args) {

// 1 通过调用日历类的静态方法getInstance得到一个当前此刻日期对象对应的日历对象

Calendar rightNow = Calendar.getInstance();

System.out.println(rightNow);

// 2.获取年

//public int get(int field)

int year = rightNow.get(Calendar.YEAR);

System.out.println(year);

// 获取月 月要+1 因为月从 0 开始

int mm = rightNow.get(Calendar.MONTH) + 1;

System.out.println(mm);

// 一年中的第几天

int days = rightNow.get(Calendar.DAY_OF_YEAR);

System.out.println(days);

// 4.修改日历的信息

// rightNow.set(Calendar.YEAR,2099);

// System.out.println(rightNow.get(Calendar.YEAR));

// 5.日历可以得到此刻日期对象

Date d = rightNow.getTime();

System.out.println(d);

// 6.此刻时间毫秒值

long time = rightNow.getTimeInMillis();

// 7.请问701天 15 小时后是哪个日期

// 让日历中的一年中的第几天往后走701天

rightNow.add(Calendar.DAY_OF_YEAR,701);

rightNow.add(Calendar.HOUR,15);

long time1 = rightNow.getTimeInMillis();

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss EEE a”);

System.out.println(sdf.format(time1));

}

}

6.Math数学类


Math类中的方法全是静态方法,直接用类名调用即可

方法:

| 方法名 | 说明 |

| — | — |

| public static int abs(int a) | 获取参数a的绝对值 |

| public static double ceil(double a) | 向上取整 |

| public static double floor(double a) | 向下取整 |

| public static double pow(double a,double b) | 获取a的b次幂 |

| public static long round(double a) | 四舍五入取整 |

public class MathDemo01 {

public static void main(String[] args) {

// 1.取绝对值,返回正数

System.out.println(Math.abs(10)); // 10

System.out.println(Math.abs(-10.3)); // 10.3

// 向上取整

System.out.println(Math.ceil(4.000000001)); // 5.0

// 向下取整

System.out.println(Math.floor(4.999999)); // 4.0

// 求指数次方

System.out.println(Math.pow(2,3)); // 8.0

// 四舍五入

System.out.println(Math.round(4.4999)); // 4

}

}

7. System系统类


– 静态方法

  • public static void exit(int status): 终止JVM虚拟机,非 0 是异常终止

  • public static long currentTimeMillis():获取当前系统此刻时间毫秒值

  • 可以做数组的拷贝

  • arraycopy (Object var0, int var1 , Object var2,int var3,int var4 )

  • 参数一: 原数组

  • 参数二: 从原数组的哪个索引位置开始复制

  • 参数三:目标数组

  • 参数四:赋值到目标数组的哪个位置

  • 参数五:赋值几个

public class SystemDemo {

public static void main(String[] args) {

System.out.println(“程序开始。。。。”);

// 1.终止当前虚拟机

// System.exit(0); //0代表正常终止

// 2.得到系统当前时间毫秒值

long time = System.currentTimeMillis();

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss EEE a”);

System.out.println(sdf.format(time));

// 3.可以做数组的拷贝(了解)

int[] arrs1 = new int[]{10,20,30,40,50,60,70};

int[] arrs2 = new int[6]; // [0,0,0,0,0,0]

// arrs2 = [0,30,40,50,0,0]

System.arraycopy(arrs1,2,arrs2,1,3);

System.out.println(Arrays.toString(arrs2));

}

}

8.BigDecimal大数据类


– 浮点型运算的时候直接 + - * / 可能会出现数据失真(精度问题)

​ BigDecimal 可以解决浮点型运算数据失真的问题

  • 包:java.math.BigDecimal

  • 创建对象的方式

  • public static BigDecimal valueOf(double val): 包装浮点数成为大数据对象

  • 方法

  • public BigDecimal add(BigDecimal value): 加法运算

  • public BigDecimal subtract(BigDecimal value):减法运算

  • public BigDecimal multiply(BigDecimal value):乘法运算

  • public BigDecimal divide(BigDecimal value):除法运算

  • public double doubleValue(): 把BigDecimal 转换成 double 类型

public class BigDecimalDemo {

public static void main(String[] args) {

// 浮点型运算的时候直接+ * / 可能会出现数据失真(精度问题)。

System.out.println(0.1 + 0.2);

System.out.println(0.09 + 0.01);

System.out.println(1.0 - 0.32);

System.out.println(1.015 * 100);

System.out.println(1.301 / 100);

System.out.println(“-------------------------”);

double a = 0.1 ;

double b = 0.2 ;

double c = a + b ;

System.out.println©;

// 1.把浮点数转换成大数据对象运算

BigDecimal a1 = BigDecimal.valueOf(a);

BigDecimal b1 = BigDecimal.valueOf(b);

//BigDecimal c1 = a1.add(b1); // 加法

BigDecimal c1 = a1.divide(b1); // 除法

System.out.println(c1);

// 结果可能需要继续使用!!!

// BigDecimal只是解决精度问题的手段,double数据才是我们的目的!!

double rs = c1.doubleValue();

System.out.println(rs);

}

}

9. 包装类


什么是包装类?

  • Java 认为一切皆对象,引入数据类型就是对象了

  • 但是在Java 中 8 种 基本数据类型不是对象,只是表示一种数据的类型形式

  • Java 为了一切皆对象的思想统一,把8种基本类型转换成对应的类,这个类称为基本数据类型的包装类

| 基本数据类型 | 包装类(引用数据类型) |

| :-: | :-: |

| byte | Byte |

| short | Short |

| int | Integer(特殊) |

| long | Long |

| float | Float |

| double | Double |

| char | Character(特殊) |

  • 自动装箱: 可以直接把基本数据类型的值或变量赋值给包装类

  • 自动拆箱: 可以把包装类的变量直接赋值给基本数据类型

public class PackageClass {

public static void main(String[] args) {

int a = 12;

Integer a1 = 12; // 自动装箱

Integer a2 = a; // 自动装箱

double b = 99.9; // 自动装箱

Double b1 = 99.9; // 自动装箱

Integer c= 100;

int c1 = c; // 自动拆箱

// int d = null; 报错

Integer d1 = null; //引用数据类型的默认值可以为null

Integer d2 = 0;

}

}

包装类的特殊功能

– Java 为包装类做了一些特殊功能

– 包装类作为类首先拥有 Object 类的方法

– 包装类作为引用类型的变量可以存储 null 值

  1. 可以把基本数据类型的值转换成字符串类型的值(没啥用)
  • 调用 toString()方法

  • 调用 Integer.toString(基本数据类型的值) 得到字符串

  • 直接把基本数据类型 + 空字符串 就得到了字符串

  1. 把字符串类型的数值转换成对应的基本数据类型的值(真的很有用)
  • Xxx.parseXxx("字符串类型的数值")

  • Xxx.valueOf("字符串类型的数值") :推荐使用!

public class PackageClass02 {

public static void main(String[] args) {

// 1.把基本数据类型的值转成字符串

Integer it = 100 ;

// a.调用toString()方法。

String itStr = it.toString();

System.out.println(itStr+1);

// 1001

// b.调用Integer.toString(基本数据类型的值)得到字符串。

String itStr1 = Integer.toString(it);

System.out.println(itStr1+1);

//1001

// c.直接把基本数据类型+空字符串就得到了字符串。

String itStr2 = it+“”;

System.out.println(itStr2+1);

//1001

// 2.把字符串类型的数值转换成对应的基本数据类型的值。(真的很有用)

String numStr = “23”;

//int numInt = Integer.parseInt(numStr);

int numInt = Integer.valueOf(numStr);

// Integer.valueOf 自动转int

System.out.println(numInt+1);

// 24

String doubleStr = “99.9”;

//double doubleDb = Double.parseDouble(doubleStr);

double doubleDb = Double.valueOf(doubleStr);

// Double.valueOf 自动转double

System.out.println(doubleDb+0.1);

}

}

3.泛型

======================================================================

什么是泛型?

  • 泛型就是一个标签: <数据类型>

  • 泛型可以在编译阶段约束只能操作某种数据类型

  • JDK 1.7开始之后,泛型后面的申明可以省略不写

  • 泛型和集合都只能支持引用数据类型,不支持基本数据类型

ArrayList lists = new ArrayList();

ArrayList lists = new ArrayList<>();

// JDK 1.7开始之后,泛型后面的申明可以省略不写!!

3.1 泛型的好处


  • 泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常

ArrayList lists = new ArrayList<>();

lists.add(“赵敏”);

lists.add(“张无忌”);

// lists.add(false); 报错

// lists.add(99.9); 报错

3.2 自定义泛型类


  • 我们之前用的泛型都是别人写好的,接下来我们来自定义泛型类的使用

  • 泛型类的概念:使用了泛型定义的类就是泛型类

  • 格式:泛型变量建议使用 E,T,K,V

修饰符 class 类名<泛型变量>{}

  • 泛型类的核心思想: 是把出现泛型变量的地方全部替换成传输的真实数据类型

– 需求:模拟ArrayList集合自定义一个集合MyArrayList集合

public static void main(String[] args) {

MyArrayList lists = new MyArrayList();

MyArrayList lists1 = new MyArrayList<>();

lists1.add(“java”);

lists1.add(“mysql”);

// list1.add(12.3); 报错,把出现泛型变量的地方全部替换成传输的String类型

lists1.remove(“java”);

System.out.println(lists1);

}

}

class MyArrayList{

private ArrayList lists = new ArrayList();

public void add(E e){

lists.add(e);

}

public void remove(E e){

lists.remove(e);

}

@Override

public String toString() {

return lists.toString();

}

}

3.3 自定义泛型方法


什么是泛型方法?

  • 定义了泛型的方法就是泛型方法

泛型方法的定义格式

  • 修饰符 <泛型变量> 返回值类型 方法名称(形参列表){}

  • 注意:方法定义了什么是泛型变量,后面就只能用什么泛型变量

– 需求:给你任何一个类型的数组,都能返回它的内容

public class GenericDemo {

public static void main(String[] args) {

Integer[] nums = {10 , 20 , 30 , 40 , 50};

String rs1 = arrToString(nums);

System.out.println(rs1);

String[] names = {“贾乃亮”,“王宝绿”,“陈羽凡”};

String rs2 = arrToString(names);

System.out.println(rs2);

}

public static String arrToString(T[] nums){

StringBuilder sb = new StringBuilder();

sb.append(“[”);

if(nums!=null && nums.length > 0){

for(int i = 0 ; i < nums.length ; i++ ){

T ele = nums[i];

sb.append(i == nums.length-1 ? ele : ele+", ");

}

}

sb.append(“]”);

return sb.toString();

}

}

3.4 自定义泛型接口


什么是泛型接口?

  • 使用了泛型定义的接口就是泛型接口

泛型接口的格式

  • 修饰符 interface 接口名称<泛型变量> {}

3.5 泛型的通配符


通配符:

?可以用在使用泛型的时候代表一切类型

E T K V 是在定义泛型的时候使用代表一切类型

泛型的上下限:

<? extends Car>: 那么?必须是Car或者其子类(泛型的上限)

<?super Car>: 那么?必须是Car或者其父类(泛型的下限,不是很常见)










集合重点

4.Collection集合

================================================================================

什么是集合?

  • 集合是一个大小可变的容器

  • 容器中的每个数据称为一个元素。 数据 == 元素

集合与数组的区别

  • 集合中类型可以不确定,大小可以不固定

  • 数组中类型和长度一旦定义出来就都固定了

集合的作用

  • 在开发中,很多时候元素的个数是不确定的

  • 而且要经常进行元素的增删改查操作,集合都是非常合适的

  • Collection 集合 是Java中集合的祖宗类,Collection集合的功能是一切集合都可以直接使用的

  • 包:import java.util.Collection

在这里插入图片描述

4.1 Coleection集合API


  • public boolean add(E e): 把给定的元素添加到当前集合中

  • public void clear(): 清空集合中所有的元素

  • public boolean remove(E e): 把给定的对象在当前集合中删除

  • public boolean contains(Object obj): 判断当前集合中是否包含给定的对象

  • public boolean isEmpty(): 判断当前集合是否为空

  • public int size(): 返回集合中元素的个数

  • public Object[] toArray(): 把集合中的元素,储存到数组中

public class CollectionDemo {

public static void main(String[] args) {

// HashSet:添加的元素是无序,不重复,无索引。

Collection sets = new HashSet<>();

// 1.添加元素,添加成功返回true.

System.out.println(sets.add(“贾乃亮”)); // true

System.out.println(sets.add(“贾乃亮”)); // false

System.out.println(sets.add(“王宝强”)); // true

sets.add(“陈羽凡”);

System.out.println(sets); // 集合重写了toString()方法,默认打印出内容信息

// [贾乃亮, 王宝强, 陈羽凡]

// 2.清空集合的元素。

//sets.clear();

//System.out.println(sets);

// 3.判断集合是否为空 是空返回true 反之

System.out.println(sets.isEmpty()); // false

// 4.获取集合的大小

System.out.println(sets.size()); // 3

// 5.判断集合中是否包含某个元素 。

System.out.println(sets.contains(“贾乃亮”));

// 6.删除某个元素:如果有多个重复元素默认删除前面的第一个!

sets.remove(“陈羽凡”);

System.out.println(sets);

// 7.把集合转换成数组

Object[] arrs = sets.toArray();

System.out.println(“数组:”+ Arrays.toString(arrs));

String[] arrs1 = sets.toArray(String[]::new); // 以后再了解,指定转换的数组类型!

System.out.println(“数组:”+ Arrays.toString(arrs1));

System.out.println(“---------------------拓展---------------------------”);

Collection c1 = new ArrayList<>();

c1.add(“李小璐”);

c1.add(“马蓉”);

Collection c2 = new ArrayList<>();

c2.add(“白百合”);

c1.addAll(c2); // 把c2集合的元素全部倒入到c1

System.out.println(c1);

}

}

4.2 Collection集合遍历


– Collection 集合的遍历方式有三种:

  • 迭代器

  • foreach(增强for循环)

  • JDK 1.8 开始的新技术 Lambda 表达式(了解)

迭代器遍历集合

  • 方法

  • public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的

  • E next(): 获取下一个元素值

  • boolean hasNext(): 判断是否有下一个元素,有返回true,反之

  • 流程

  1. 先获取当前集合的迭代器

Iterator<String> it = lists.iterator()

  1. 定义一个 while 循环, 问一次取一次
  • 通过 it.hasNext()询问是否有下一个元素,有就通过

  • it.next() 取出下一个元素

public class CollectionDemo{

public static void main(String[] args) {

Collection lists = new ArrayList<>();

lists.add(“赵敏”);

lists.add(“小昭”);

lists.add(“殷素素”);

lists.add(“周芷若”);

System.out.println(lists);

// lists = [赵敏, 小昭, 殷素素, 周芷若]

// 1.得到集合的迭代器对象。

Iterator it = lists.iterator();

// System.out.println(it.next());

// System.out.println(it.next());

// System.out.println(it.next());

// System.out.println(it.next());

// System.out.println(it.next()); // 出现异常NoSuchElementException,出现没有此元素异常!

// 2.使用while循环遍历。

while(it.hasNext()){

String ele = it.next();

System.out.println(ele);

}

}

}

foreach 遍历

  • foreach 是一种遍历形式,可以遍历集合或者数组

  • foreach 遍历集合实际上是迭代器遍历的简化写法

  • foreach 遍历的关键是记住格式

for(被遍历集合或者数组中元素的类型 变量名称:被遍历集合或者数组){

}

public class CollectionDemo{

public static void main(String[] args) {

Collection lists = new ArrayList<>();

lists.add(“赵敏”);

lists.add(“小昭”);

lists.add(“殷素素”);

lists.add(“周芷若”);

System.out.println(lists);

// lists = [赵敏, 小昭, 殷素素, 周芷若]

for (String ele : lists) {

System.out.println(ele);

}

int[] ages = new int[]{17 , 18 , 38 , 21};

for (int age : ages) {

System.out.println(age);

}

}

}

– 缺点:foreach 遍历无法知道遍历到了哪个元素,因为没有索引

Lambda(暂时了解)

  • jdk 1.8 开始之后的新技术

public class CollectionDemo03 {

public static void main(String[] args) {

Collection lists = new ArrayList<>();

lists.add(“赵敏”);

lists.add(“小昭”);

lists.add(“殷素素”);

lists.add(“周芷若”);

System.out.println(lists);

// [赵敏, 小昭, 殷素素, 周芷若]

// s

lists.forEach(s -> {

System.out.println(s);

});

// lists.forEach(s -> System.out.println(s));

// lists.forEach(System.out::println);

}

}

4.3 Set集合


– Set系列集合:添加的元素是无序,不重复,无索引

  • HashSet:添加的元素是无序,不重复,无索引的

  • LinkedHashSet: 添加的元素是有序,不重复,无索引的

  • TreeSet: 不重复,无索引,按照大小默认升序排列

public class CollectionDemo01 {

public static void main(String[] args) {

// HashSet:添加的元素是无序,不重复,无索引的。

// 多态写法

Collection sets = new HashSet<>();

sets.add(“MyBatis”);

sets.add(“Java”);

sets.add(“Java”);

sets.add(“Spring”);

sets.add(“MySQL”);

sets.add(“MySQL”);

// [Java, MySQL, MyBatis, Spring]

System.out.println(sets);

}

}

4.3.1 HashSet

  • HashSet:添加的元素是无序,不重复,无索引的

public class CollectionDemo01 {

public static void main(String[] args) {

// 无序,不重复,无索引的。

Set sets = new HashSet<>(); // 一行经典代码!!

sets.add(“Mybatis”);

sets.add(“Java”);

sets.add(“Java”);

sets.add(“MySQL”);

sets.add(“MySQL”);

sets.add(“Spring”);

// [Java, MySQL, Spring, Mybatis]

System.out.println(sets);

}

}

面试热点:Set 集合添加的元素是不重复的,是如何去重复的

  • 对于有值特性的,Set 集合可以直接判断进行去重复

  • 对于引用数据类型的类对象,Set 集合是按照如下流程进行是否重复的判断

  • 引用数据类型:自己定义的类型,比如自己定义的苹果apple

  • Set集合会让两对象先调用自己的hashCode()方法得到彼此的哈希值(所谓的内存地址)

  • 然后比较两个对象的哈希值是否相同,如果不相同则直接认为两个对象不重复

  • 如果哈希值相同,会继续让两个对象进行equals比较内容是否相同,如果相同认为重复,如果不相同认为不重复

在这里插入图片描述

面试热点:Set系列集合元素无序的根本原因(面试必考)

  • Set 系列集合添加元素无序的根本原因是因为底层采用了哈希表存储元素

  • JDK1.8 之前:哈希表 = 数组 + 链表 + (哈希算法)

  • JDK1.8 之后:哈希表 = 数组 + 链表 + 红黑树 + (哈希算法)

  • 当链表长度超过 8 时,将链表转换为红黑树,这样大大减少了查找时间

Set 系列集合是基于哈希表存储数据的,它的增删改查的性能都很好,但是它是无序不重复的。

4.4.2 LinkedHashSet

  • HashSet的子类,元素是 有序,不重复,无索引

  • LinkedHashSet底层依然是使用哈希表存储元素的,但是每个元素都额外带一个链来维护添加顺序

  • 不光增删查快,还有序

  • 缺点是多了一个存储顺序的链会占内存空间,而且不允许重复,无索引

public static void main(String[] args) {

// 有序不重复无索引

Set sets = new LinkedHashSet<>();

sets.add(“Mybatis”);

sets.add(“Java”);

sets.add(“Java”);

sets.add(“MySQL”);

sets.add(“MySQL”);

sets.add(“Spring”);

// [Java, MySQL, Spring, Mybatis]

System.out.println(sets);

}

}

4.4.3 TreeSet

TreeSet: 不重复,无索引,按照大小默认升序排序

– TreeSet 集合称为排序不重复集合,可以对元素进行默认的升序排序

TreeSet 集合自排序的方式

  1. 有值特性的元素直接可以升序排序(整型,浮点型)

  2. 字符串类型的元素会按照首字符的编号排序

  3. 对于自定义的引用数据类型,TreeSet 默认无法排序,执行的时候直接报错,因为人家不知道排序规则

自定义的引用数据类型的排序实现

– 对于自定义的引用数据类型,TreeSet 默认无法排序

– 所以我们需要定制排序的大小规则,方案有两种

  • 直接为对象的类实现比较器规则接口 Comparable,重写比较方法

  • 直接为集合设置比较器Comparator对象,重写比较方法

  • 如果类和集合都存在大小规则,默认使用集合自带的规则进行大小排序!

4.4 List集合


– List系列集合:添加的元素是有序,可重复,有索引

  • ArrayList: 添加的元素是有序,可重复,有索引

  • LinkedList: 添加的元素是有序,可重复,有索引

  • Vector 是线程安全的,速度慢,开发中很少使用


  • List 集合继承了 Collection 集合的全部功能,同时因为 List 系列集合有索引,所以多了很多按照索引操作元素的功能

  • 开发中ArrayList集合用的最多,查询快,增删慢,是基于数组储存数据的

4.4.1 ArrayList 集合

开发中ArrayList集合用的最多!

方法:

  • public void add(int index,E element): 将指定的元素,添加到该集合中的指定位置上

  • public E get(int index): 返回集合中指定位置的元素

  • public E remove(int index): 移除列表中指定位置的元素,返回的是被移除的元素

  • public E set(int index,E element): 用指定元素替换集合中指定位置的元素,返回更新前的元素值

public class ListDemo01 {

public static void main(String[] args) {

// 1.创建一个ArrayList集合对象:这是一行经典代码!

// List:有序,可重复,有索引的。

// 多态写法: 将子类对象给父类类型的接口

List lists = new ArrayList<>();

lists.add(“java1”);

lists.add(“java1”);

lists.add(“java2”);

lists.add(“java2”);

System.out.println(lists);

// [java1, java1, java2, java2]

// 2.在某个索引位置插入元素。

lists.add(2,“MySQL”);

System.out.println(lists);

// [java1, java1, MySQL, java2, java2]

// 3.根据索引删除元素,返回被删除元素

System.out.println(lists.remove(2));

// MySQL

System.out.println(lists);

// [java1, java1, java2, java2]

// 4.根据索引获取元素

System.out.println(lists.get(2));

// java2

// 5.修改索引位置处的元素

lists.set(3,“Mybatis”);

System.out.println(lists);

// [java1, java1, java2, Mybatis]

}

}

4.4.2 List集合的遍历方式

  • 4种

  • List 系列集合多了索引,所以多了一种按照索引遍历集合的 for 循环

  • for循环

  • 迭代器

  • foreach

  • jdk 1.8 之后的 Lambda 表达式

public class ListDemo02 {

public static void main(String[] args) {

// 1.这是一行经典代码

// 将子类对象给父类接口,多态写法

List lists = new ArrayList<>();

lists.add(“java1”);

lists.add(“java2”);

lists.add(“java3”);

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的元素,返回更新前的元素值

public class ListDemo01 {

public static void main(String[] args) {

// 1.创建一个ArrayList集合对象:这是一行经典代码!

// List:有序,可重复,有索引的。

// 多态写法: 将子类对象给父类类型的接口

List lists = new ArrayList<>();

lists.add(“java1”);

lists.add(“java1”);

lists.add(“java2”);

lists.add(“java2”);

System.out.println(lists);

// [java1, java1, java2, java2]

// 2.在某个索引位置插入元素。

lists.add(2,“MySQL”);

System.out.println(lists);

// [java1, java1, MySQL, java2, java2]

// 3.根据索引删除元素,返回被删除元素

System.out.println(lists.remove(2));

// MySQL

System.out.println(lists);

// [java1, java1, java2, java2]

// 4.根据索引获取元素

System.out.println(lists.get(2));

// java2

// 5.修改索引位置处的元素

lists.set(3,“Mybatis”);

System.out.println(lists);

// [java1, java1, java2, Mybatis]

}

}

4.4.2 List集合的遍历方式

  • 4种

  • List 系列集合多了索引,所以多了一种按照索引遍历集合的 for 循环

  • for循环

  • 迭代器

  • foreach

  • jdk 1.8 之后的 Lambda 表达式

public class ListDemo02 {

public static void main(String[] args) {

// 1.这是一行经典代码

// 将子类对象给父类接口,多态写法

List lists = new ArrayList<>();

lists.add(“java1”);

lists.add(“java2”);

lists.add(“java3”);

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-DSCs3lwY-1713626829217)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-qrvxYyck-1713626829217)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java流式编程常用API包括:java.util.stream.Stream、java.util.stream.IntStream、java.util.stream.LongStream、java.util.stream.DoubleStream等。 ### 回答2: Java中流式编程常用API有: 1. Stream APIJava 8引入的新特性,用于处理集合数据的功能。可以对集合进行筛选、排序、映射等操作,具有较高的灵活性和性能。 2. Collectors API:用于对Stream中的元素进行汇总的API。可以将元素收集到List、Set、Map等数据结构中,也可以进行分组、分区等操作。 3. Predicate API:用于筛选Stream中的元素。可以根据指定的条件,对元素进行过滤,返回满足条件的元素流。 4. Function API:用于对Stream中的元素进行转换的API。可以对元素进行映射、提取等操作,返回转换后的元素流。 5. Optional API:用于处理可能为空的数据的API。可以对可能为空的值进行安全处理,避免出现空指针异常。 6. Comparator API:用于比较对象的API。可以用于对集合中的元素进行排序,定义自定义的排序规则。 7. Iterator/Iterable API:用于遍历集合元素的API。可以使用Iterator对集合中的元素进行迭代访问,也可以通过实现Iterable接口实现自定义集合的遍历。 8. BufferedReader/BufferedWriter API:用于处理文本文件的输入输出的API。可以提高文件读写的效率,减少I/O操作的次数。 9. Files API:用于处理文件和目录的API。可以创建、复制、移动、删除文件及目录,以及判断文件是否存在等操作。 10. DateTime API:用于处理日期和时间的API。可以对日期和时间进行格式化、计算、比较等操作,提供了更加灵活和简便的操作方式。 ### 回答3: 以下是 Java 流式编程常用API: 1. Stream 类:Stream 类是 Java 8 引入的一个新特性,它提供了一种链式编程的方式来对集合进行操作。可以使用 Stream 类的各种方法来进行过滤、映射、排序、归约等操作,比如 filter、map、sorted、reduce 等。 2. Collectors 类:Collectors 类提供了一系列用于收集 Stream 中元素的静态方法。可以使用 Collectors 类提供的方法将 Stream 中的元素收集到一个集合中,比如 toList、toSet、toMap 等。 3. Optional 类:Optional 类是用来处理可能为空的值的。可以使用 Optional 类的方法来判断一个值是否存在,如果不存在,则可以使用默认值来替代。 4. forEach 方法:forEach 方法是 Stream 类的一个方法,可以对 Stream 中的每个元素进行遍历操作。可以使用 forEach 方法来遍历集合中的所有元素,并对每个元素执行指定的操作。 5. filter 方法:filter 方法用于对 Stream 中的元素进行过滤操作。可以使用 filter 方法来筛选出符合条件的元素,从而得到一个新的 Stream。 6. map 方法:map 方法用于对 Stream 中的元素进行映射操作。可以使用 map 方法将一个 Stream 中的元素转换为另一种类型,并得到一个新的 Stream。 7. sorted 方法:sorted 方法用于对 Stream 中的元素进行排序操作。可以使用 sorted 方法对 Stream 中的元素进行升序或者降序排序。 8. limit 方法:limit 方法用于对 Stream 进行截断操作。可以使用 limit 方法来限制 Stream 中元素的数量,从而得到一个新的 Stream。 这些都是 Java 流式编程常用API,它们提供了丰富的功能和灵活的操作方式,可以帮助开发者更方便地处理集合中的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值