java基础

Java泛型详解

泛型是什么?举个例子

自己的话:泛指多种类型的一种写法。常用T表示,也可以用E等。。。
java中一种允许多种数据类型的特性。

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{ 
    //key这个成员变量的类型为T,T的类型由外部指定  
    private T key;

    public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
        this.key = key;
    }

    public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
        return key;
    }
}
//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
//传入的实参类型需与泛型的类型参数类型相同,即为Integer.
Generic<Integer> genericInteger = new Generic<Integer>(123456);

//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic<String> genericString = new Generic<String>("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());

12-27 09:20:04.432 13063-13063/? D/泛型测试: key is 123456
12-27 09:20:04.432 13063-13063/? D/泛型测试: key is key_vlaue

简单类型和类类型有什么区别?如int和Integer

int是简单数据类型,Integer是一种“class”

Integer和int比较的话会怎么样?

只要两个变量的值是向等的,则结果为true

Integer i = new Integer(100);
int j = 100System.out.print(i == j); //true
原理是什么?

因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较

创建对象时,以下两种情况有什么区别?

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
原理是?

非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同

使用包装类的意义是?

我个人理解是,为了满足一些特定开发需求,因为基本数据类型不能满足面向对象编程所有的开发需求。
并且使用泛型定义时也不能用int,要用Integer:

List<int> list = new ArrayList<int>(); //不可以
List<Integer> list = new ArrayList<Integer>(); //可以

下面两个的区别?

List arrayList = new ArrayList();
List arrayList = new ArrayList();

数组(Array)和列表(List)的区别?

Array的容量固定且无法动态改变。可以将ArrayList想象成一种“会自动扩增容量的Array”。
Array基于index,List继承Collection,是集合的一种

ArrayList和LinkedList比较

List有两个重要的实现类:ArrayList和LinkedList

ArrayListLinkedList
基于什么数组双链表
get/set有index,复杂度是O(1)代价较大
插入数据数组装满的时候要将所有的数据重新装入一个新的数组,最坏情况为O(n)复杂度O(1)
删除数据代价较大复杂度O(1)
长度不定义长度时,默认生成长度为10的ArrayList,如果数据大于这个值,则会增大list长度。
存储空间占用空间较少,每个节点是实际的数据占用空间较多,每个节点存储的是实际的数据和前后节点的位置
什么情况下用访问数据多更多的插入和删除元素
  • 集合当中只能放置对象的引用,无法放置原生数据类型,

变量只声明不初始化会怎么样?

成员变量不初始化,会赋值默认值;局部变量不初始化会报错,如下:
(基本数据类型和引用类型都是)

Solution s;		//仅声明变量,不new的话后面使用会报错“not initialized”
Solution s = new Solution();	//声明变量,同时实例化对象并调用初始化函数

stream()方法是干嘛的?

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
(我觉得和python的列表生成式挺像,都是对集合里的元素进行统一的操作)
例子:
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

python:
[car.name for car in cars]

List<Car> cars = //...
List<String> names = new ArrayList<String>();

// LAMBDA EXPRESSION
cars.forEach( (car) -> names.add(car.getName()) );
// Suppose that I have already init the list of car
List<Car> cars = //...

// LAMBDA EXPRESSION
List<String> names = cars.stream().map( car -> car.getName() ).collect( Collectors.toList() );
lambda expression和stream有啥区别?

::是啥意思?

比如random.ints().limit(10).forEach(System.out::println)

Optional类有什么用?

参考

Java 8中引入了 Optional 类来解决 NullPointerException 与繁琐的 null 检查,该类首次出现在
Guava,Java 8 才成为类库中的一部分。

Guava是啥玩意?

Guava 是一个 Google 开发的 基于 Java 的类库集合的扩展项目,包括集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 和验证的实用方法等等。

很多Guava里的方法都渐渐被合并到了java原生特性中。比如Collections、Optional。

guava对比jdk代码

Java 8,Java 1.8,JDK 1.8,JDK 8有区别么?这些版本到底怎么算的?

Java8 等价于 JDK8,等价于 Java 1.8 ,等价于 JDK1.8
JDK8或者JDK1.8是由于自从JDK1.5/JDK5命名方式改变后遗留的新旧命令方式问题。
JDK1.8特性

java中的“容器”具体指的是什么?“Optional是个容器”? “spring容器”?

“容器”其实就是一种用来存储数据的数据结构,在JAVA中容器可分为即“集合”(Set)、“列表”(List)、“映射”(Map)。至于,为什么需要容器,总的来说,主要是在以数组作为数据的存储结构中,其长度难以扩充,同时数组中元素类型必须相同。而容器可以弥补数组的这两个缺陷。下图为容器API类的一个结构图。
在这里插入图片描述

理解一下“collection”的意思?为什么要称为“collection”?

Collection代表“一组Object”,在代码实现中,这组Object就是Collection对象里的元素。
一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值